Upload
cyril-wang
View
1.911
Download
11
Embed Size (px)
DESCRIPTION
如何使用 Xhprof 分析網站效能 (真實案例2)
Citation preview
如何使用 xhprof 分析網站效能 ( 真實案例 2)
Agent
前言 網站效能測試架構 安裝測試環境 分析 建議事項 結論
前言
儘管硬體能力不斷提昇,網站效能的重要性卻日益增加。原因在於應用與使用量的成長速度遠快於硬體的發展速度,所以僅靠硬體的擴充將無法滿足業務擴充之所需。另一方面,就算事前做了完整的效能規劃,系統在實際的運作過程當中還是有可能遭遇到不可預期的效能瓶頸。透過效能的分析 (profiling) ,可以讓我們了解網站在運作時的真實狀況,進而發現問題並解決之。
故事開始
在這個投影片中,我將利用 xhprof 這個工具來分析由 php 所撰寫的網站程式,以期了解其效能上的瓶頸,並提出改進建議。此網站為真實運作多年的服務,已擁有不少忠實的使用者。
xhprof 簡介
原本由 facebook 所開發,已於 2009 年成為開放源碼程式。
支援 php 程式語言的運行環境。 提供函式層級的相關資訊 (Wall 時
間、 CPU 時間、記憶體使用量 ) 。 內建基本的 web ui 介面。 為 PECL 下的一個模組。
http://pecl.php.net/package/xhprof
xhprof 的特性
透過編譯模組的方式運行於 php 的執行環境。 需要修改程式才能運作。
可以透過 php 設定值 auto_prepend_file 自動執行相關功能,進而避免修改所有程式。
函數層級的資訊雖然很有用,但是由於太過低層,所以與使用者的實際情境 (如網頁完整的下載時間 )之間必須有所對應。
僅提供一層的 traceback,對流程追蹤的能力有較大的限制。
可以將收集到的資訊用任何方式呈現,但內建的 web ui 僅提供檔案儲存方式的呈現。如要呈現其他的儲存方式,必須另尋工具或自行開發。
測試架構線上網站服務器群
NFS 服務器
分析專用網站服務器 (xhprof)
資料庫服務器
數據收集 / 分析服務器 (xhprof/MySQL)
效能數據
測試環境說明
為了數據的精準性,理應收集線上網站服務器的運行數據。但是因為原本就有持續監測測試服務器的反應狀態,發現測試服務器與線上服務器有類似的反應趨勢,所以先以測試服務器當做收集目標 ( 分析專用網站服務器 ) 。一方面避免干擾原有的服務,另外一方面也可以讓收集的數據單純化以利分析。
測試環境說明 ( 續 )
我們將收集到的資料存放到監測主機的 MySQL 之中,並利用 xhprof 這個 web ui 加以分析。採用 MySQL 除了可以支援更多的資料筆數,未來各網站主機所收集的資訊也可以統一集中管理與分析。
分析專用網站服務器與數據收集 / 分析服務器皆安裝 CentOS 6 。
分析專用網站服務器 (1)
安裝 EPEL 下載合適的版本 http://mirror01.idc.hinet.net/EPEL/6/i386/repoview/epel-release.html
安裝下載的 rpm
分析專用網站服務器 (2)
安裝 php-pecl-xhprof 與 php-pecl-mongo yum install -y php-pecl-xhprof php-pecl-mongo
分析專用網站服務器 (3)
安裝 git yum install -y git
分析專用網站服務器 (4)
安裝 xhprof ( 以 /var/www/lib 為例 ) mkdir /var/www/lib cd /var/www/lib git clone https://github.com/preinheimer/xhprof
分析專用網站服務器 (5)
將 /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'] = ' 應用程式名稱'
分析專用網站服務器 (6)
修改 Apache 設定 …ServerName www.myserver.twphp_admin_value auto_prepend_file /var/www/lib/xhprof/external/header.php…
上述設定可以加在虛擬主機或是全域設定。 重新啟動 Apache
service httpd restart
數據收集 / 分析服務器 (1)
安裝 EPEL 下載合適的版本http://mirror01.idc.hinet.net/EPEL/6/i386/repoview/epel-release.html
安裝下載的 rpm
數據收集 / 分析服務器 (2)
安裝 MySQL yum install mysql-server
設定 MySQL 帳號與密碼 修改 iptables 的設定,允許分析專用
網站服務器連結至 TCP 埠號 3306 。 重新啟動 iptables 與 mongodb 服務。
service iptables restart service mysqld restart
數據收集 / 分析服務器 (3)
建立數據收集所需資料庫 建立資料庫 xhprof 建立單獨使用的帳號 建立表格。表格 Schema 在檔案 /var/www/lib/xhprof/xhprof_lib/utils/Db/Mysql.php 內。
數據收集 / 分析服務器 (4)
安裝 git yum install -y git
數據收集 / 分析服務器 (5)
安裝 xhprof ( 以 /var/www/lib 為例 ) mkdir /var/www/lib cd /var/www/lib git clone https://github.com/preinheimer/xhprof
數據收集 / 分析服務器 (6)
修改 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 位址 ) 。
xhprof
現象
現象 ( 續 )
載入時間佔據整體運行時間一半以上 (22911ms/37569ms) 。
建議事項
1. 開啟 opcode 快取機制,如 apc 。
Opcode Caching Revised
APC (Alternative PHP Cache) yum install php-pecl-apc
APC
APC ( 續 )
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 ,對於一整個網頁的完整下載時間仍受到其他因素影響,所以仍須用其他方法持續改進使用者的感受。
Final Thoughts
當運用 xhprof 在線上環境時,為了避免產生過多的數據而影響網站運行,可以採用取樣的方式。舉例來說,可以每一千個請求才記錄一次 (隨機 ) 。
採樣的頻率除了必須依據網站流量進行適當的調整外,對於不同的應用時機也必須隨之改變。例如當日常收集時可以採用較低的比例,但是如果要追蹤特定的問題時,就可以暫時提高取樣的頻率,以便 "近距離 "觀察。
結論
PHP 之類的腳本語言 (Scripting Language) ,在每次執行前都必須經過比編譯語言更多的程序。透過 opcode 快取的方式,可以大幅減少腳本程式解析所需的時間。
透過實際觀察線上環境的效能數據,可以讓我們發現一些設定錯誤或網站成長所造成的效能瓶頸。
解決效能問題是一連串不斷的改進,解決了一個,還有下一個更困難的正在等著呢。
om