註:這是我們 PHP 應用效能分析系列的第一篇,閱讀第二篇可深入瞭解 xhgui,第三篇則關注於效能調優實踐。
什麼是效能分析?
效能分析是衡量應用程式在代碼層級的相對效能。效能分析將捕捉的事件包括:CPU的使用,記憶體的使用,函數的調用時間長度和次數,以及調用圖。效能分析的行為也會影響應用效能。
影響的程度取決於基準測試。基準測試在外部執行,用于衡量應用真實效能。所謂真實效能,即終端使用者所體驗的應用表現。
什麼時候應該進行效能分析?
在考慮是否進行效能分析時,你首先要想:應用是否存在效能問題?如果有,你要進一步考慮:這個問題有多大?
如果你不這樣做,將會陷入一個陷阱??過早最佳化,這可能會浪費你的時間。
為了評斷應用是否存在效能問題,你應該確定效能目標。例如,100個並發使用者的回應時間小於1s。然後,你需要進行基準測試,看是否達到這個目標。一個常見的錯誤是,在開發環境進行基準測試。事實上,你必須在生產環境進行基準測試。(實際生產環境或類比的生產環境,後者很容易在 SaaS 實現(見:OneAPM 效能線上分析)。
用於基準測試的產品很多,包括 ab,siege 和 JMeter。我個人比較喜歡JMeter的功能集,但 ab 和 siege 更加易用。
一旦你確定應用存在效能問題,就需要分析其效能,實施改進,然後再一次進行基準測試,查看問題是否解決。每一次變更之後,你都該進行基準測試查看效果。如果你做了很多變更,卻發現應用效能有所下降,你就無法確定具體是哪一次變更導致了這個問題。
是我定義的效能生命週期:
效能下降的一般原因
導致效能下降的一般原因中,有些相當出人意料。即便是像 PHP 這樣的進階語言,代碼的好壞也很少是問題的根源。在當今的硬體設定條件下,CPU 很少是效能限制的原因。常見的原因反而是:
資料存放區
PostgreSQL
MySQL
Oracle
MSSQL
MongoDB
Riak
Cassandra
Memcache
CouchDB
Redis
外部資源
糟糕的代碼
選擇哪一種效能分析器?
在 PHP 世界裡,有兩個截然不同的的效能分析器??主動和被動。
主動 VS 被動效能分析
主動分析器在開發過程中使用,由開發人員啟用。主動分析器收集的資訊比被動分析器多,對效能的影響更大。通常,主動分析器不能用在生產環境中。Xdebug 就是一種主動分析器。
因為無法在生產環境中使用主動分析器,Facebook 推出了一個被動分析器??XHprof。XHprof 是為了在生產環境中使用而打造的。它對效能的影響最小,同時收集足夠的資訊用於診斷效能問題。XHprof 和 OneAPM 都是被動分析器。
通常,Xdebug 收集的額外資訊對於一般的效能問題分析並不必要。這意味著,被動分析器是用於不間斷效能分析的更佳選擇,即使是在開發環境中。
Xhprof + Xhgui
Xhprof 由 Facebook 開發的,包含一個基本的使用者介面用於查看效能資料。此外,Paul Reinheimer 開發了 Xhgui 和一個增強使用者介面(UI)用於查看、比較和分析效能資料。
安裝
安裝 XHPROF
Xhprof 可通過 PECL 安裝,步驟如下:
$pecl install xhprof-beta
該 pecl 命令將嘗試自動更新你的 php.ini 設定。pecl 嘗試更新的檔案可以使用以下命令找到:
$ pecl config-getphp_ini
它會在指定的檔案(如果有的話)頂部增加新的配置行。你可能想把他們移到一個更合適的位置。
一旦你編譯了該擴充程式,您必須啟用它。為此,您需要在 PHP INI 檔案添加以下代碼:
[xhprof]extension=xhprof.so
之後,結合 Xhgui 就能輕鬆地執行效能分析與檢查。
安裝 XHGUI
安裝 Xhgui,必須直接從 git 擷取。該項目可以在 github 上找到,地址為 https://github.com/perftools/xhgui
Xhgui 要求:
首先,複製項目到任意位置。在基於 Debian 的 Linux 系統(例如 Ubuntu 等等),可能是 /var/www。在 Mac OS X 系統,可能是 /Library/WebServer/Documents。
$cd /var/www$ git clone https://github.com/perftools/xhgui.git$ cd xhgui$ php install.php
最後一個命令是運行 composer 以安裝依賴並檢查 xhgui 緩衝目錄的許可權。如果失敗,你可以手動運行 composer install。
下一步,你可能需要建立設定檔。這一步很容易實現,可以使用在 /path/to/xhgui/config/config.default.php 下的預設設定檔。
如果你在本地運行 mongodb ,沒有身分識別驗證,則可能不需要這樣做。因為它將回退為預設值。而在多伺服器環境中,你會需要一個所有伺服器都能進行儲存的遠程 mongodb 伺服器,並進行恰當的配置。
為提高 MongoDB 的效能,你可以運行以下指令以添加索引:
$ mongo
use xhprof
其他配置
如果你不想在生產環境中安裝 mongo ,或無法讓 Web 服務器訪問 mongo 伺服器,您可以將效能分析資料儲存在磁碟中,再匯入到本地MongoDB 供以後分析。
為此,請在 config.php 中進行以下修改:
<?php'save.handler' = 'file','save.handler.filename' => '/path/to/xhgui/xhprof-' .uniqid("", true). '.dat',?>
改變檔案中的 save.handler,然後取消批註 save.handler.filename ,為其賦一個恰當的值。
注意:預設每天只儲存一個分析檔案。
一旦分析資料的準備就緒,你就可以使用 xhgui 附帶的指令碼匯入之:
$ php /path/to/xhgui/external/import.php /path/to/file.dat
在此之後的步驟都相同。
運行 Xhgui
Xhgui 是以 PHP 為基礎的 Web 應用程式,你可以以 /path/to/xhgui/webroot為根檔案,設定一個標準的虛擬機器主機。
或者,你可以簡單地使用 PHP 5.4 + cli-server 例如:
$cd/path/to/xhgui$ php -S0:8080-t webroot/
這將使 Xhgui 在所有網路介面都可通過 8080 連接埠進行通訊。
運行效能分析器
運行分析器時,你需要在待分析的所有頁麵包含 external/header.php 指令碼。為此,你可以在 PHP ini 檔案設定 auto_prepend_file 。你既可以直接在公用 INI 檔案進行設定,也可以限制到單一的虛擬機器主機。
對於 Apache 伺服器,添加以下代碼:
php_admin_value auto_prepend_file "/path/to/xhgui/external/header.php"
對於 Nginx 伺服器,在伺服器配置中添加以下代碼:
fastcgi_param PHP_VALUE "auto_prepend_file=/path/to/xhgui/external/header.php";
如果您使用 PHP 5.4 + cli-server(PHP - S),則必須通過命令列標記進行設定:
$ php -S 0:8080 -dauto_prepend_file=/path/to/xhgui/external/header.php
預設情況下,分析器運行時只分析(大約)1%的請求。這是由以下 external/header.php 代碼控制的:
<?phpif (rand(0, 100) !== 42) { return;}?>
如果你想分析每一個請求(例如,在開發階段),你可以將這段代碼注釋掉。如果你想讓分析10%的請求,你可以做如下改動:
<?phpif (rand(0, 10) !== 4) { return;}?>
這允許你對一小部分使用者請求進行分析,而不過多影響單個使用者或太多使用者。
如果你想在效能分析時進行手動控制,你可以這樣做:
<?phpif (!isset($_REQUEST['A9v3XUsnKX3aEiNsUDZzV']) && !isset($_COOKIE['A9v3XUsnKX3aEiNsUDZzV'])) { return;} else { // Remove trace of the special variable from REQUEST_URI $_SERVER['REQUEST_URI'] = str_replace(array('?A9v3XUsnKX3aEiNsUDZzV', '&A9v3XUsnKX3aEiNsUDZzV'), '', $_SERVER['REQUEST_URI']); setcookie('A9v3XUsnKX3aEiNsUDZzV', 1);}if (isset($_REQUEST['no-A9v3XUsnKX3aEiNsUDZzV'])) { setcookie('A9v3XUsnKX3aEiNsUDZzV', 0, time() - 86400); return;}?>
這段代碼會檢查一個隨機命名的 GET/POST/COOKIE 變數(在此例中為:A9v3XUsnKX3aEiNsUDZzV),同時建立一個同名的 Cookie ,用於分析該請求的整個過程,例如:表單提交後的重新導向,Ajax 請求等等。
此外,它允許一個名為 no-A9v3XUsnKX3aEiNsUDZzV 的 GET/POST 變數來刪除 cookie ,停止分析。
當然,我們歡迎大家嘗試使用 OneAPM 來為您的 PHP 和 Java 應用做免費的效能分析。OneAPM 專屬的探針能夠深入到所有 PHP 和 Java 應用內部完成應用效能管理和監控,包括代碼層級效能問題的可見度、效能瓶頸的快速識別與追溯、真實使用者體驗監控、伺服器監控和端到端的應用效能管理。 OneAPM 可以追溯到效能表現差的 SQL 陳述式 Traces 記錄、效能表現差的第三方 API、Web 服務、Cache 等等。
在下一篇文章中,我們將深入研究 Xhgui ,以及用於展示、比較 xhprof 資料的使用者介面 。