SlideShare uma empresa Scribd logo
1 de 34
cyril.hcwang@gmail.com
   前言
   網站效能測試架構
   安裝測試環境
   分析
   建議事項
   結論
   儘管硬體能力不斷提昇,網站效能的重要
    性卻日益增加。原因在於應用與使用量的
    成長速度遠快於硬體的發展速度,所以僅
    靠硬體的擴充將無法滿足業務擴充之所需。
    另一方面,就算事前做了完整的效能規劃,
    系統在實際的運作過程當中還是有可能遭
    遇到不可預期的效能瓶頸。透過效能的分
    析 (profiling),可以讓我們了解網站在運作
    時的真實狀況,進而發現問題並解決之。
   在這個投影片中,我將利用 xhprof 這個工
    具來分析由 php 所撰寫的網站程式,以期
    了解其效能上的瓶頸,並提出改進建議。
    此網站為真實運作多年的服務,已擁有不
    少忠實的使用者。
   原本由 facebook 所開發,已於 2009 年成
    為開放源碼程式。
   支援 php 程式語言的運行環境。
   提供函式層級的相關資訊 (Wall時間、CPU
    時間、記憶體使用量)。
   內建基本的 web ui 介面。
   為 PECL 下的一個模組。
     http://pecl.php.net/package/xhprof
   透過編譯模組的方式運行於 php 的執行環境。
   需要修改程式才能運作。
     可以透過 php 設定值 auto_prepend_file 自動執行相關
     功能,進而避免修改所有程式。
 函數層級的資訊雖然很有用,但是由於太過低層,
  所以與使用者的實際情境(如網頁完整的下載時間)
  之間必須有所對應。
 僅提供一層的 traceback,對流程追蹤的能力有較
  大的限制。
 可以將收集到的資訊用任何方式呈現,但內建的
  web ui 僅提供檔案儲存方式的呈現。如要呈現其他
  的儲存方式,必須另尋工具或自行開發。
線上網站服務器群       分析專用網站服務器 (xhprof)


                         效能數據




                       數據收集/分析服務器
                       (xhprof/MySQL)

NFS 服務器    資料庫服務器
   為了數據的精準性,理應收集線上網站服
    務器的運行數據。但是因為原本就有持續
    監測測試服務器的反應狀態,發現測試服
    務器與線上服務器有類似的反應趨勢,所
    以先以測試服務器當做收集目標(分析專用
    網站服務器)。一方面避免干擾原有的服務,
    另外一方面也可以讓收集的數據單純化以
    利分析。
   我們將收集到的資料存放到監測主機的
    MySQL 之中,並利用 xhprof 這個 web ui
    加以分析。採用 MySQL 除了可以支援更
    多的資料筆數,未來各網站主機所收集的
    資訊也可以統一集中管理與分析。
   分析專用網站服務器與數據收集/分析服務
    器皆安裝 CentOS 6。
   安裝 EPEL
     下載合適的版本
      http://mirror01.idc.hinet.net/EPEL/6/i386/repov
      iew/epel-release.html
     安裝下載的 rpm
   安裝 php-pecl-xhprof 與 php-pecl-mongo
     yum install -y php-pecl-xhprof php-pecl-mongo
   安裝 git
     yum install -y git
   安裝 xhprof (以 /var/www/lib 為例)
     mkdir /var/www/lib
     cd /var/www/lib
     git clone https://github.com/preinheimer/xhprof
   將
    /var/www/lib/xhprof/xhprof_lib/config.sample.php
    更名為 config.php
   修改 /var/www/lib/xhprof/xhprof_lib/web/config.php
       $_xhprof['dbhost'] = '數據收集主機的IP'
       $_xhprof['dbuser'] = 'MySQL 帳號'
       $_xhprof['dbpass'] = 'MySQL 密碼'
       $_xhprof['dbname'] = 'MySQL 資料表名稱'
       $_xhprof['servername'] = 'web 主機名稱'
       $_xhprof['namespace'] = '應用程式名稱'
   修改 Apache 設定
     …
      ServerName www.myserver.tw
      php_admin_value auto_prepend_file
      /var/www/lib/xhprof/external/header.php
      …
     上述設定可以加在虛擬主機或是全域設定。
   重新啟動 Apache
     service httpd restart
   安裝 EPEL
     下載合適的版本
      http://mirror01.idc.hinet.net/EPEL/6/i386/repov
      iew/epel-release.html
     安裝下載的 rpm
   安裝 MySQL
     yum install mysql-server
   設定 MySQL 帳號與密碼
   修改 iptables 的設定,允許分析專用網站
    服務器連結至 TCP 埠號 3306。
   重新啟動 iptables 與 mongodb 服務。
     service iptables restart
     service mysqld restart
   建立數據收集所需資料庫
     建立資料庫 xhprof
     建立單獨使用的帳號
     建立表格。表格 Schema 在檔案
     /var/www/lib/xhprof/xhprof_lib/utils/Db/Mysql.p
     hp 內。
   安裝 git
     yum install -y git
   安裝 xhprof (以 /var/www/lib 為例)
     mkdir /var/www/lib
     cd /var/www/lib
     git clone https://github.com/preinheimer/xhprof
   修改 Apache 的設定
     Alias /xhgui /var/www/lib/xhprof/xhprof_html
      <Directory /var/www/lib/xhprof/xhprof_html>
          Order Deny,Allow
          Deny from All
          Allow from 127.0.0.1
          Allow from ::1
        </IfModule>
      </Directory>
     上述範例僅提供本機 (127.0.0.1) 連結 xhprof,請
      根據實際情況加上合適的 IP 位址。
   重新啟動 Apache
     service httpd restart
   我們選定分析專用網站服務器上的首頁,
    使用瀏覽器對其進行存取。
   連結至 http://192.168.0.10/xhprof (其中
    192.168.0.1 請取代為數據收集/分析服務
    器的 IP 位址)。
   載入時間佔據整體運行時間一半以上
    (22911ms/37569ms)。
1.   開啟 opcode 快取機制,如 apc。
   APC (Alternative PHP Cache)
     yum install php-pecl-apc
   執行時間與記憶體用量同時減少
     CPU Wall Time: 37569ms -> 18235ms (-
      51.5%)
     CPU Time: 31994ms -> 10998 ms (-65.6%)
     Peak Memory Usage: 4600096 bytes ->
      1485786 (-67.7%)
   載入時間所佔比例大幅減少
    (1610ms/10998ms)
   因為此一改進僅分別針對單一 URL,對於
    一整個網頁的完整下載時間仍受到其他因
    素影響,所以仍須用其他方法持續改進使
    用者的感受。
   當運用 xhprof 在線上環境時,為了避免產
    生過多的數據而影響網站運行,可以採用
    取樣的方式。舉例來說,可以每一千個請
    求才記錄一次(隨機)。
   採樣的頻率除了必須依據網站流量進行適
    當的調整外,對於不同的應用時機也必須
    隨之改變。例如當日常收集時可以採用較
    低的比例,但是如果要追蹤特定的問題時,
    就可以暫時提高取樣的頻率,以便"近距離"
    觀察。
   PHP 之類的腳本語言 (Scripting
    Language),在每次執行前都必須經過比編
    譯語言更多的程序。透過 opcode 快取的
    方式,可以大幅減少腳本程式解析所需的
    時間。
   透過實際觀察線上環境的效能數據,可以
    讓我們發現一些設定錯誤或網站成長所造
    成的效能瓶頸。
   解決效能問題是一連串不斷的改進,解決
    了一個,還有下一個更困難的正在等著呢。
歡迎指教
cyril.hcwang@gmail.com

Mais conteúdo relacionado

Mais procurados

[오픈소스컨설팅]J boss6 7_교육자료
[오픈소스컨설팅]J boss6 7_교육자료[오픈소스컨설팅]J boss6 7_교육자료
[오픈소스컨설팅]J boss6 7_교육자료Ji-Woong Choi
 
인프런 - 스타트업 인프랩 시작 사례
인프런 - 스타트업 인프랩 시작 사례인프런 - 스타트업 인프랩 시작 사례
인프런 - 스타트업 인프랩 시작 사례Hyung Lee
 
예외처리가이드
예외처리가이드예외처리가이드
예외처리가이드도형 임
 
Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기영우 박
 
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들DongMin Choi
 
점진적인 레거시 웹 애플리케이션 개선 과정
점진적인 레거시 웹 애플리케이션 개선 과정점진적인 레거시 웹 애플리케이션 개선 과정
점진적인 레거시 웹 애플리케이션 개선 과정Arawn Park
 
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Wangeun Lee
 
게임 애셋 스트리밍 패치
게임 애셋 스트리밍 패치게임 애셋 스트리밍 패치
게임 애셋 스트리밍 패치Seungjae Lee
 
날로 먹는 Django admin 활용
날로 먹는 Django admin 활용날로 먹는 Django admin 활용
날로 먹는 Django admin 활용KyeongMook "Kay" Cha
 
スマホにおけるWebGL入門
スマホにおけるWebGL入門スマホにおけるWebGL入門
スマホにおけるWebGL入門Yohta Kanke
 
ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기Yungon Park
 
간단한 블로그를 만들며 Django 이해하기
간단한 블로그를 만들며 Django 이해하기간단한 블로그를 만들며 Django 이해하기
간단한 블로그를 만들며 Django 이해하기Kyoung Up Jung
 
PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發
PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發
PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發Shengyou Fan
 
Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략Jin wook
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPSeungmo Koo
 
Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템Youngtaek Oh
 
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud GatewaySpring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud GatewayIván López Martín
 
Sagas Middleware Architecture
Sagas Middleware ArchitectureSagas Middleware Architecture
Sagas Middleware ArchitectureMateusz Bosek
 
WkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べたWkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べたfirewood
 
Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Kwen Won Lee
 

Mais procurados (20)

[오픈소스컨설팅]J boss6 7_교육자료
[오픈소스컨설팅]J boss6 7_교육자료[오픈소스컨설팅]J boss6 7_교육자료
[오픈소스컨설팅]J boss6 7_교육자료
 
인프런 - 스타트업 인프랩 시작 사례
인프런 - 스타트업 인프랩 시작 사례인프런 - 스타트업 인프랩 시작 사례
인프런 - 스타트업 인프랩 시작 사례
 
예외처리가이드
예외처리가이드예외처리가이드
예외처리가이드
 
Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기
 
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
 
점진적인 레거시 웹 애플리케이션 개선 과정
점진적인 레거시 웹 애플리케이션 개선 과정점진적인 레거시 웹 애플리케이션 개선 과정
점진적인 레거시 웹 애플리케이션 개선 과정
 
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계
 
게임 애셋 스트리밍 패치
게임 애셋 스트리밍 패치게임 애셋 스트리밍 패치
게임 애셋 스트리밍 패치
 
날로 먹는 Django admin 활용
날로 먹는 Django admin 활용날로 먹는 Django admin 활용
날로 먹는 Django admin 활용
 
スマホにおけるWebGL入門
スマホにおけるWebGL入門スマホにおけるWebGL入門
スマホにおけるWebGL入門
 
ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기
 
간단한 블로그를 만들며 Django 이해하기
간단한 블로그를 만들며 Django 이해하기간단한 블로그를 만들며 Django 이해하기
간단한 블로그를 만들며 Django 이해하기
 
PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發
PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發
PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發
 
Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템
 
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud GatewaySpring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
 
Sagas Middleware Architecture
Sagas Middleware ArchitectureSagas Middleware Architecture
Sagas Middleware Architecture
 
WkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べたWkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べた
 
Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표
 

Destaque

如何使用 Xhprof 分析網站效能 (真實案例)
如何使用 Xhprof 分析網站效能 (真實案例)如何使用 Xhprof 分析網站效能 (真實案例)
如何使用 Xhprof 分析網站效能 (真實案例)Cyril Wang
 
如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)
如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)
如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)Cyril Wang
 
/* pOrt80BKK */ - PHP Day - PHP Performance with APC + Memcached for Windows
/* pOrt80BKK */ - PHP Day - PHP Performance with APC + Memcached for Windows/* pOrt80BKK */ - PHP Day - PHP Performance with APC + Memcached for Windows
/* pOrt80BKK */ - PHP Day - PHP Performance with APC + Memcached for WindowsFord AntiTrust
 
Apc presentation
Apc presentationApc presentation
Apc presentationguestef8544
 
Improving PHP Application Performance with APC
Improving PHP Application Performance with APCImproving PHP Application Performance with APC
Improving PHP Application Performance with APCvortexau
 

Destaque (6)

如何使用 Xhprof 分析網站效能 (真實案例)
如何使用 Xhprof 分析網站效能 (真實案例)如何使用 Xhprof 分析網站效能 (真實案例)
如何使用 Xhprof 分析網站效能 (真實案例)
 
王信傑
王信傑王信傑
王信傑
 
如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)
如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)
如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)
 
/* pOrt80BKK */ - PHP Day - PHP Performance with APC + Memcached for Windows
/* pOrt80BKK */ - PHP Day - PHP Performance with APC + Memcached for Windows/* pOrt80BKK */ - PHP Day - PHP Performance with APC + Memcached for Windows
/* pOrt80BKK */ - PHP Day - PHP Performance with APC + Memcached for Windows
 
Apc presentation
Apc presentationApc presentation
Apc presentation
 
Improving PHP Application Performance with APC
Improving PHP Application Performance with APCImproving PHP Application Performance with APC
Improving PHP Application Performance with APC
 

Semelhante a 如何使用 Xhprof 分析網站效能 (真實案例2)

PHP & AppServ
PHP & AppServPHP & AppServ
PHP & AppServHt Wang
 
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰Scourgen Hong
 
高性能网站最佳实践
高性能网站最佳实践高性能网站最佳实践
高性能网站最佳实践longhao
 
Hbase optimization and apply summary in taobao
Hbase optimization and apply summary in taobaoHbase optimization and apply summary in taobao
Hbase optimization and apply summary in taobaomingjian deng
 
系统性能分析和优化.ppt
系统性能分析和优化.ppt系统性能分析和优化.ppt
系统性能分析和优化.pptFrank Cai
 
构建基于Lamp的网站架构
构建基于Lamp的网站架构构建基于Lamp的网站架构
构建基于Lamp的网站架构Cosey Lee
 
Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档xuebao_zx
 
海量日志分析系统实践,Dba
海量日志分析系统实践,Dba海量日志分析系统实践,Dba
海量日志分析系统实践,DbaCevin Cheung
 
高性能LAMP程序设计
高性能LAMP程序设计高性能LAMP程序设计
高性能LAMP程序设计fuchaoqun
 
+++º+ ¦¦ ¦ ¦¦ ¦+ =
+++º+ ¦¦  ¦ ¦¦ ¦+ =+++º+ ¦¦  ¦ ¦¦ ¦+ =
+++º+ ¦¦ ¦ ¦¦ ¦+ =guesta6295f3
 
Appserv setup
Appserv setupAppserv setup
Appserv setupHt Wang
 
自动化运维管理
自动化运维管理自动化运维管理
自动化运维管理frankwsj
 
Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)
Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)
Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)acqua young
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践self study
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践rewinx
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践Frank Cai
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计锐 张
 
P6 服务器安装与配置
P6 服务器安装与配置P6 服务器安装与配置
P6 服务器安装与配置epst
 
Raising The MySQL Bar-Manyi Lu
Raising The MySQL Bar-Manyi LuRaising The MySQL Bar-Manyi Lu
Raising The MySQL Bar-Manyi Lu郁萍 王
 

Semelhante a 如何使用 Xhprof 分析網站效能 (真實案例2) (20)

PHP & AppServ
PHP & AppServPHP & AppServ
PHP & AppServ
 
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
 
高性能网站最佳实践
高性能网站最佳实践高性能网站最佳实践
高性能网站最佳实践
 
Hbase optimization and apply summary in taobao
Hbase optimization and apply summary in taobaoHbase optimization and apply summary in taobao
Hbase optimization and apply summary in taobao
 
系统性能分析和优化.ppt
系统性能分析和优化.ppt系统性能分析和优化.ppt
系统性能分析和优化.ppt
 
构建基于Lamp的网站架构
构建基于Lamp的网站架构构建基于Lamp的网站架构
构建基于Lamp的网站架构
 
Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档
 
海量日志分析系统实践,Dba
海量日志分析系统实践,Dba海量日志分析系统实践,Dba
海量日志分析系统实践,Dba
 
高性能LAMP程序设计
高性能LAMP程序设计高性能LAMP程序设计
高性能LAMP程序设计
 
+++º+ ¦¦ ¦ ¦¦ ¦+ =
+++º+ ¦¦  ¦ ¦¦ ¦+ =+++º+ ¦¦  ¦ ¦¦ ¦+ =
+++º+ ¦¦ ¦ ¦¦ ¦+ =
 
Appserv setup
Appserv setupAppserv setup
Appserv setup
 
自动化运维管理
自动化运维管理自动化运维管理
自动化运维管理
 
Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)
Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)
Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计
 
P6 服务器安装与配置
P6 服务器安装与配置P6 服务器安装与配置
P6 服务器安装与配置
 
运维自动化
运维自动化运维自动化
运维自动化
 
Raising The MySQL Bar-Manyi Lu
Raising The MySQL Bar-Manyi LuRaising The MySQL Bar-Manyi Lu
Raising The MySQL Bar-Manyi Lu
 

如何使用 Xhprof 分析網站效能 (真實案例2)

  • 2. 前言  網站效能測試架構  安裝測試環境  分析  建議事項  結論
  • 3. 儘管硬體能力不斷提昇,網站效能的重要 性卻日益增加。原因在於應用與使用量的 成長速度遠快於硬體的發展速度,所以僅 靠硬體的擴充將無法滿足業務擴充之所需。 另一方面,就算事前做了完整的效能規劃, 系統在實際的運作過程當中還是有可能遭 遇到不可預期的效能瓶頸。透過效能的分 析 (profiling),可以讓我們了解網站在運作 時的真實狀況,進而發現問題並解決之。
  • 4. 在這個投影片中,我將利用 xhprof 這個工 具來分析由 php 所撰寫的網站程式,以期 了解其效能上的瓶頸,並提出改進建議。 此網站為真實運作多年的服務,已擁有不 少忠實的使用者。
  • 5. 原本由 facebook 所開發,已於 2009 年成 為開放源碼程式。  支援 php 程式語言的運行環境。  提供函式層級的相關資訊 (Wall時間、CPU 時間、記憶體使用量)。  內建基本的 web ui 介面。  為 PECL 下的一個模組。  http://pecl.php.net/package/xhprof
  • 6. 透過編譯模組的方式運行於 php 的執行環境。  需要修改程式才能運作。  可以透過 php 設定值 auto_prepend_file 自動執行相關 功能,進而避免修改所有程式。  函數層級的資訊雖然很有用,但是由於太過低層, 所以與使用者的實際情境(如網頁完整的下載時間) 之間必須有所對應。  僅提供一層的 traceback,對流程追蹤的能力有較 大的限制。  可以將收集到的資訊用任何方式呈現,但內建的 web ui 僅提供檔案儲存方式的呈現。如要呈現其他 的儲存方式,必須另尋工具或自行開發。
  • 7. 線上網站服務器群 分析專用網站服務器 (xhprof) 效能數據 數據收集/分析服務器 (xhprof/MySQL) NFS 服務器 資料庫服務器
  • 8. 為了數據的精準性,理應收集線上網站服 務器的運行數據。但是因為原本就有持續 監測測試服務器的反應狀態,發現測試服 務器與線上服務器有類似的反應趨勢,所 以先以測試服務器當做收集目標(分析專用 網站服務器)。一方面避免干擾原有的服務, 另外一方面也可以讓收集的數據單純化以 利分析。
  • 9. 我們將收集到的資料存放到監測主機的 MySQL 之中,並利用 xhprof 這個 web ui 加以分析。採用 MySQL 除了可以支援更 多的資料筆數,未來各網站主機所收集的 資訊也可以統一集中管理與分析。  分析專用網站服務器與數據收集/分析服務 器皆安裝 CentOS 6。
  • 10. 安裝 EPEL  下載合適的版本 http://mirror01.idc.hinet.net/EPEL/6/i386/repov iew/epel-release.html  安裝下載的 rpm
  • 11. 安裝 php-pecl-xhprof 與 php-pecl-mongo  yum install -y php-pecl-xhprof php-pecl-mongo
  • 12. 安裝 git  yum install -y git
  • 13. 安裝 xhprof (以 /var/www/lib 為例)  mkdir /var/www/lib  cd /var/www/lib  git clone https://github.com/preinheimer/xhprof
  • 14. 將 /var/www/lib/xhprof/xhprof_lib/config.sample.php 更名為 config.php  修改 /var/www/lib/xhprof/xhprof_lib/web/config.php  $_xhprof['dbhost'] = '數據收集主機的IP'  $_xhprof['dbuser'] = 'MySQL 帳號'  $_xhprof['dbpass'] = 'MySQL 密碼'  $_xhprof['dbname'] = 'MySQL 資料表名稱'  $_xhprof['servername'] = 'web 主機名稱'  $_xhprof['namespace'] = '應用程式名稱'
  • 15. 修改 Apache 設定  … ServerName www.myserver.tw php_admin_value auto_prepend_file /var/www/lib/xhprof/external/header.php …  上述設定可以加在虛擬主機或是全域設定。  重新啟動 Apache  service httpd restart
  • 16. 安裝 EPEL  下載合適的版本 http://mirror01.idc.hinet.net/EPEL/6/i386/repov iew/epel-release.html  安裝下載的 rpm
  • 17. 安裝 MySQL  yum install mysql-server  設定 MySQL 帳號與密碼  修改 iptables 的設定,允許分析專用網站 服務器連結至 TCP 埠號 3306。  重新啟動 iptables 與 mongodb 服務。  service iptables restart  service mysqld restart
  • 18. 建立數據收集所需資料庫  建立資料庫 xhprof  建立單獨使用的帳號  建立表格。表格 Schema 在檔案 /var/www/lib/xhprof/xhprof_lib/utils/Db/Mysql.p hp 內。
  • 19. 安裝 git  yum install -y git
  • 20. 安裝 xhprof (以 /var/www/lib 為例)  mkdir /var/www/lib  cd /var/www/lib  git clone https://github.com/preinheimer/xhprof
  • 21. 修改 Apache 的設定  Alias /xhgui /var/www/lib/xhprof/xhprof_html <Directory /var/www/lib/xhprof/xhprof_html> Order Deny,Allow Deny from All Allow from 127.0.0.1 Allow from ::1 </IfModule> </Directory>  上述範例僅提供本機 (127.0.0.1) 連結 xhprof,請 根據實際情況加上合適的 IP 位址。  重新啟動 Apache  service httpd restart
  • 22. 我們選定分析專用網站服務器上的首頁, 使用瀏覽器對其進行存取。  連結至 http://192.168.0.10/xhprof (其中 192.168.0.1 請取代為數據收集/分析服務 器的 IP 位址)。
  • 23.
  • 24.
  • 25. 載入時間佔據整體運行時間一半以上 (22911ms/37569ms)。
  • 26. 1. 開啟 opcode 快取機制,如 apc。
  • 27. APC (Alternative PHP Cache)  yum install php-pecl-apc
  • 28.
  • 29.
  • 30. 執行時間與記憶體用量同時減少  CPU Wall Time: 37569ms -> 18235ms (- 51.5%)  CPU Time: 31994ms -> 10998 ms (-65.6%)  Peak Memory Usage: 4600096 bytes -> 1485786 (-67.7%)  載入時間所佔比例大幅減少 (1610ms/10998ms)
  • 31. 因為此一改進僅分別針對單一 URL,對於 一整個網頁的完整下載時間仍受到其他因 素影響,所以仍須用其他方法持續改進使 用者的感受。
  • 32. 當運用 xhprof 在線上環境時,為了避免產 生過多的數據而影響網站運行,可以採用 取樣的方式。舉例來說,可以每一千個請 求才記錄一次(隨機)。  採樣的頻率除了必須依據網站流量進行適 當的調整外,對於不同的應用時機也必須 隨之改變。例如當日常收集時可以採用較 低的比例,但是如果要追蹤特定的問題時, 就可以暫時提高取樣的頻率,以便"近距離" 觀察。
  • 33. PHP 之類的腳本語言 (Scripting Language),在每次執行前都必須經過比編 譯語言更多的程序。透過 opcode 快取的 方式,可以大幅減少腳本程式解析所需的 時間。  透過實際觀察線上環境的效能數據,可以 讓我們發現一些設定錯誤或網站成長所造 成的效能瓶頸。  解決效能問題是一連串不斷的改進,解決 了一個,還有下一個更困難的正在等著呢。