性能分析是衡量應用程序在代碼級別的相對性能。性能分析將捕捉的事件包括:CPU的使用,內存的使用,函數的調用時長和次數,以及調用圖。性能分析的行爲也會影響應用性能。php
影響的程度取決於基準測試。基準測試在外部執行,用於衡量應用真實性能。所謂真實性能,即終端用戶所體驗的應用表現。html
在考慮是否進行性能分析時,你首先要想:應用是否存在性能問題?若是有,你要進一步考慮:這個問題有多大?java
若是你不這樣作,將會陷入一個陷阱——過早優化,這可能會浪費你的時間。git
爲了評斷應用是否存在性能問題,你應該肯定性能目標。例如,100 個併發用戶的響應時間小於 1s 。而後,你須要進行基準測試,看是否達到這個目標。一個常見的錯誤是,在開發環境進行基準測試。事實上,你必須在生產環境進行基準測試。(實際生產環境或模擬的生產環境,後者很容易在 SaaS 實現(例如:OneAPM PHP 應用性能在線分析示例 )。github
用於基準測試的產品不少,包括 ab,siege 和 JMeter。我我的比較喜歡 JMeter 的功能集,但 ab 和 siege 更加易用。web
一旦你肯定應用存在性能問題,就須要分析其性能,實施改進,而後再一次進行基準測試,查看問題是否解決。每一次變動以後,你都該進行基準測試查看效果。若是你作了不少變動,卻發現應用性能有所降低,你就沒法肯定具體是哪一次變動致使了這個問題。緩存
下圖是我定義的性能生命週期:服務器
致使性能降低的通常緣由中,有些至關出人意料。即使是像 PHP 這樣的高級語言,代碼的好壞也不多是問題的根源。在當今的硬件配置條件下,CPU 不多是性能限制的緣由。常見的緣由反而是:cookie
數據存儲網絡
外部資源
糟糕的代碼
在 PHP 世界裏,有兩個大相徑庭的的性能分析器——主動和被動。
主動分析器在開發過程當中使用,由開發人員啓用。主動分析器收集的信息比被動分析器多,對性能的影響更大。一般,主動分析器不能用在生產環境中。XDebug 就是一種主動分析器。
由於沒法在生產環境中使用主動分析器,Facebook 推出了一個被動分析器——XHProf。XHProf 是爲了在生產環境中使用而打造的。它對性能的影響最小,同時收集足夠的信息用於診斷性能問題。XHProf 和 OneAPM 都是被動分析器。
一般,XDebug 收集的額外信息對於通常的性能問題分析並沒必要要。這意味着,被動分析器是用於不間斷性能分析的更佳選擇,即便是在開發環境中。
XHProf 由 Facebook 開發的,包含一個基本的用戶界面用於查看性能數據。此外,Paul Reinheimer 開發了 XHGui 和一個加強的用戶界面(UI)用於查看、比較和分析性能數據。
XHProf 可經過 PECL 安裝,步驟以下:
$ pecl install xhprof-beta
該 pecl 命令將嘗試自動更新你的 php.ini 設置。pecl 嘗試更新的文件可使用如下命令找到:
$ pecl config-get php_ini
它會在指定的文件(若是有的話)頂部增長新的配置行。你可能想把他們移到一個更合適的位置。
一旦你編譯了該擴展程序,您必須啓用它。爲此,您須要在 PHP INI 文件添加如下代碼:
[xhprof] extension=xhprof.so
以後,結合 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 db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } ) db.results.ensureIndex( { 'profile.main().wt' : -1 } ) db.results.ensureIndex( { 'profile.main().mu' : -1 } ) db.results.ensureIndex( { 'profile.main().cpu' : -1 } ) db.results.ensureIndex( { 'meta.url' : 1 } )
若是你不想在生產環境中安裝 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 是以 PHP 爲基礎的 Web 應用程序,你能夠以 /path/to/xhgui/webroot 爲根文件,設置一個標準的虛擬主機。
或者,你能夠簡單地使用 PHP 5.4+ cli-server
例如:
$ cd /path/to/xhgui $ php -S 0: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 代碼控制的:
<?php if (rand(0, 100) !== 42) { return; } ?>
若是你想分析每個請求(例如,在開發階段),你能夠將這段代碼註釋掉。若是你想讓分析 10% 的請求,你能夠作以下改動:
<?php if (rand(0, 10) !== 4) { return; } ?>
這容許你對一小部分用戶請求進行分析,而不過多影響單個用戶或太多用戶。
若是你想在性能分析時進行手動控制,你能夠這樣作:
<?php if (!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 數據的用戶界面(本文系應用性能管理領軍企業 OneAPM 工程師編譯整理) 。