程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> Linux系統下使用XHProf和XHGui分析PHP運行性能

Linux系統下使用XHProf和XHGui分析PHP運行性能

編輯:PHP綜合

什麼是性能分析?
性能分析是衡量應用程序在代碼級別的相對性能。性能分析將捕捉的事件包括:CPU的使用,內存的使用,函數的調用時長和次數,以及調用圖。性能分析的行為也會影響應用性能。
什麼時候應該進行性能分析?
在考慮是否進行性能分析時,你首先要想:應用是否存在性能問題?如果有,你要進一步考慮:這個問題有多大?

如果你不這樣做,將會陷入一個陷阱——過早優化,這可能會浪費你的時間。

為了評斷應用是否存在性能問題,你應該確定性能目標。例如,100 個並發用戶的響應時間小於 1s 。然後,你需要進行基准測試,看是否達到這個目標。一個常見的錯誤是,在開發環境進行基准測試。事實上,你必須在生產環境進行基准測試。(實際生產環境或模擬的生產環境,後者很容易在 SaaS 實現。
用於基准測試的產品很多,包括 ab,siege 和 JMeter。我個人比較喜歡 JMeter 的功能集,但 ab 和 siege 更加易用。

一旦你確定應用存在性能問題,就需要分析其性能,實施改進,然後再一次進行基准測試,查看問題是否解決。每一次變更之後,你都該進行基准測試查看效果。如果你做了很多變更,卻發現應用性能有所下降,你就無法確定具體是哪一次變更導致了這個問題。

下圖是我定義的性能生命周期:

2015128164631254.png (1808×1620)

性能下降的一般原因
導致性能下降的一般原因中,有些相當出人意料。即便是像 PHP 這樣的高級語言,代碼的好壞也很少是問題的根源。在當今的硬件配置條件下,CPU 很少是性能限制的原因。常見的原因反而是:

數據存儲

  • PostgreSQL
  • MySQL
  • Oracle
  • MSSQL
  • MongoDB
  • Riak
  • Cassandra
  • Memcache
  • CouchDB
  • Redis

外部資源

  • APIs
  • 文件系統
  • 網絡接口
  • 外部流程
  • 糟糕的代碼

選擇哪一種性能分析器?
在 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-get php_ini

它會在指定的文件(如果有的話)頂部增加新的配置行。你可能想把他們移到一個更合適的位置。

一旦你編譯了該擴展程序,您必須啟用它。為此,您需要在 PHP INI 文件添加以下代碼:

[xhprof]
extension=xhprof.so 

之後,結合 XHGui 就能輕松地執行性能分析與檢查。

安裝 XHGui
安裝 XHGui,必須直接從 git 獲取。該項目可以在 github 上找到,地址為:https://github.com/perftools/xhgui

XHGui 要求:

  • PHP 5.3+
  • ext/mongo
  • composer
  • MongoDB (若只需要收集數據,則可選可不選;若需要數據分析,則為必選)

首先,克隆項目到任意位置。在基於 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
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 等等。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved