34
如如如如 xhprof 如如如如如如 ( 如如如如 2) [email protected]

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

[email protected]

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

Agent

前言 網站效能測試架構 安裝測試環境 分析 建議事項 結論

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

前言

儘管硬體能力不斷提昇,網站效能的重要性卻日益增加。原因在於應用與使用量的成長速度遠快於硬體的發展速度,所以僅靠硬體的擴充將無法滿足業務擴充之所需。另一方面,就算事前做了完整的效能規劃,系統在實際的運作過程當中還是有可能遭遇到不可預期的效能瓶頸。透過效能的分析 (profiling) ,可以讓我們了解網站在運作時的真實狀況,進而發現問題並解決之。

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

故事開始

在這個投影片中,我將利用 xhprof 這個工具來分析由 php 所撰寫的網站程式,以期了解其效能上的瓶頸,並提出改進建議。此網站為真實運作多年的服務,已擁有不少忠實的使用者。

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

xhprof 簡介

原本由 facebook 所開發,已於 2009 年成為開放源碼程式。

支援 php 程式語言的運行環境。 提供函式層級的相關資訊 (Wall 時

間、 CPU 時間、記憶體使用量 ) 。 內建基本的 web ui 介面。 為 PECL 下的一個模組。

http://pecl.php.net/package/xhprof

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

xhprof 的特性

透過編譯模組的方式運行於 php 的執行環境。 需要修改程式才能運作。

可以透過 php 設定值 auto_prepend_file 自動執行相關功能,進而避免修改所有程式。

函數層級的資訊雖然很有用,但是由於太過低層,所以與使用者的實際情境 (如網頁完整的下載時間 )之間必須有所對應。

僅提供一層的 traceback,對流程追蹤的能力有較大的限制。

可以將收集到的資訊用任何方式呈現,但內建的 web ui 僅提供檔案儲存方式的呈現。如要呈現其他的儲存方式,必須另尋工具或自行開發。

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

測試架構線上網站服務器群

NFS 服務器

分析專用網站服務器 (xhprof)

資料庫服務器

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

效能數據

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

測試環境說明

為了數據的精準性,理應收集線上網站服務器的運行數據。但是因為原本就有持續監測測試服務器的反應狀態,發現測試服務器與線上服務器有類似的反應趨勢,所以先以測試服務器當做收集目標 ( 分析專用網站服務器 ) 。一方面避免干擾原有的服務,另外一方面也可以讓收集的數據單純化以利分析。

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

測試環境說明 ( 續 )

我們將收集到的資料存放到監測主機的 MySQL 之中,並利用 xhprof 這個 web ui 加以分析。採用 MySQL 除了可以支援更多的資料筆數,未來各網站主機所收集的資訊也可以統一集中管理與分析。

分析專用網站服務器與數據收集 / 分析服務器皆安裝 CentOS 6 。

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

分析專用網站服務器 (2)

安裝 php-pecl-xhprof 與 php-pecl-mongo yum install -y php-pecl-xhprof php-pecl-mongo

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

分析專用網站服務器 (3)

安裝 git yum install -y git

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

分析專用網站服務器 (4)

安裝 xhprof ( 以 /var/www/lib 為例 ) mkdir /var/www/lib cd /var/www/lib git clone https://github.com/preinheimer/xhprof

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

分析專用網站服務器 (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'] = ' 應用程式名稱'

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

分析專用網站服務器 (6)

修改 Apache 設定 …ServerName www.myserver.twphp_admin_value auto_prepend_file /var/www/lib/xhprof/external/header.php…

上述設定可以加在虛擬主機或是全域設定。 重新啟動 Apache

service httpd restart

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

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

安裝 EPEL 下載合適的版本http://mirror01.idc.hinet.net/EPEL/6/i386/repoview/epel-release.html

安裝下載的 rpm

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

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

安裝 MySQL yum install mysql-server

設定 MySQL 帳號與密碼 修改 iptables 的設定,允許分析專用

網站服務器連結至 TCP 埠號 3306 。 重新啟動 iptables 與 mongodb 服務。

service iptables restart service mysqld restart

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

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

建立數據收集所需資料庫 建立資料庫 xhprof 建立單獨使用的帳號 建立表格。表格 Schema 在檔案 /var/www/lib/xhprof/xhprof_lib/utils/Db/Mysql.php 內。

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

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

安裝 git yum install -y git

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

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

安裝 xhprof ( 以 /var/www/lib 為例 ) mkdir /var/www/lib cd /var/www/lib git clone https://github.com/preinheimer/xhprof

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

數據收集 / 分析服務器 (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

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

開始測試

我們選定分析專用網站服務器上的首頁,使用瀏覽器對其進行存取。

連結至 http://192.168.0.10/xhprof ( 其中 192.168.0.1 請取代為數據收集 / 分析服務器的 IP 位址 ) 。

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

xhprof

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

現象

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

現象 ( 續 )

載入時間佔據整體運行時間一半以上 (22911ms/37569ms) 。

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

建議事項

1. 開啟 opcode 快取機制,如 apc 。

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

Opcode Caching Revised

APC (Alternative PHP Cache) yum install php-pecl-apc

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

APC

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

APC ( 續 )

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

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)

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

尚未結束

因為此一改進僅分別針對單一 URL ,對於一整個網頁的完整下載時間仍受到其他因素影響,所以仍須用其他方法持續改進使用者的感受。

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

Final Thoughts

當運用 xhprof 在線上環境時,為了避免產生過多的數據而影響網站運行,可以採用取樣的方式。舉例來說,可以每一千個請求才記錄一次 (隨機 ) 。

採樣的頻率除了必須依據網站流量進行適當的調整外,對於不同的應用時機也必須隨之改變。例如當日常收集時可以採用較低的比例,但是如果要追蹤特定的問題時,就可以暫時提高取樣的頻率,以便 "近距離 "觀察。

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

結論

PHP 之類的腳本語言 (Scripting Language) ,在每次執行前都必須經過比編譯語言更多的程序。透過 opcode 快取的方式,可以大幅減少腳本程式解析所需的時間。

透過實際觀察線上環境的效能數據,可以讓我們發現一些設定錯誤或網站成長所造成的效能瓶頸。

解決效能問題是一連串不斷的改進,解決了一個,還有下一個更困難的正在等著呢。

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

歡迎指教[email protected]

om