領域探索-PHP效能分析工具
領域探索·PHP效能分析工具
一、ApacheBench(ab)壓力測試工具
1.1 簡介
ab的全稱是ApacheBench,是 Apache附帶的一個小工具,專門用於 HTTPServer的benchmarktesting,可以同時模擬多個併發請求。
centos安裝ab:yuminstall httpd-tools
ApacheBench命令原理:ab命令會建立很多的併發訪問執行緒,模擬多個訪問者同時對某一URL地址進行訪問。它是針對http的訪問測試,因此,既可以用來測試Apache的負載壓力,也可以測試nginx、lighthttp、tomcat、IIS等其它Web伺服器的壓力。
1.2 使用
ApacheBench引數說明
格式:ab[options] [http://]hostname[:port]/path
引數說明:
-n requests Number of requests toperform //在測試會話中所執行的請求個數(本次測試總共要訪問頁面的次數)。預設時,僅執行一個請求。
-c concurrency Number of multiplerequests to make //併發請求數(預設是一次一個)
-t timelimit Seconds to max. wait forresponses //測試任務的最大時間限制(單位:秒),其內部隱含值是-n 50000。它可以實現對伺服器介面的測試在固定時間內完成,預設時,沒有時間限制。
-v verbosity How much troubleshooting info to print
//設定顯示資訊的詳細程度– 4或更大值會顯示頭資訊,3或更大值可以顯示響應程式碼
-w Print out results in HTML tables//以HTML表的格式輸出結果。預設時,它是白色背景的兩列寬度的一張表。
-i Use HEAD instead of GET// 執行HEAD請求,而不是GET。
-x attributes String to insert as table attributes
-y attributes String to insert as tr attributes
-z attributes String to insert as td or th attributes
-C attribute Add cookie, eg. -C “c1=1234,c2=2,c3=3″ (repeatable)//-Ccookie-name=value對請求附加一個Cookie:行。其典型形式是name=value的一個引數對。此引數可以重複,用逗號分割。提示:可以藉助session實現原理傳遞 JSESSIONID引數(JAVA伺服器預設傳遞sessionid的名稱為:JSESSIONID),實現保持會話的功能,如
-C ” c1=1234,c2=2,c3=3, JSESSIONID=FF056CD16DA9D71CB131C1D56F0319F8″ 。
-H attribute Add Arbitrary header line, eg. ‘Accept-Encoding: gzip’ Insertedafter all normal header lines. (repeatable)
-A attribute Add Basic WWW Authentication, the attributes are acolon separated username and password.
-P attribute Add Basic Proxy Authentication,the attributes are a colon separated username and password.//-Pproxy-auth-username:password對一箇中轉代理提供BASIC認證信任。使用者名稱和密碼由一個:隔開,並以base64編碼形式傳送。無論伺服器是否需要(即,是否傳送了401認證需求程式碼),此字串都會被髮送。
-X proxy:port Proxyserver and port number to use
-V Print version number and exit
-k Use HTTP KeepAlive feature
-d Do not show percentiles served table.
-S Do not show confidence estimators and warnings.
-g filename Output collected data to gnuplot format file.
-e filename Output CSV file with percentages served
-h Display usage information (this message) //-attributes 設定屬性的字串.缺陷程式中有各種靜態宣告的固定長度的緩衝區。另外,對命令列引數、伺服器的響應頭和其他外部輸入的解析也很簡單,這可能會有不良後果。它沒有完整地實現HTTP/1.x;僅接受某些’預想’的響應格式。
strstr(3)的頻繁使用可能會帶來效能問題,即你可能是在測試ab而不是伺服器的效能。
常用引數-n -c
1.3 例項
(1)固定引數
Requests per second: 1521.70 [#/sec] (mean)
最關心的指標之一:吞吐率(相當於LoadRunner中的每秒事務數,後面括號中的 mean表示這是一個平均值)。
Time per request: 6.572 [ms](mean)
最關心的指標之二:指的是使用者平均請求等待時間(相當於LR中的平均事務響應時間,後面括號中的 mean表示這是一個平均值)。
Time per request: 0.657 [ms](mean, across all concurrent requests)
最關心的指標之三:指的是伺服器平均請求處理時間。
(2)可變引數的POST請求
-p 引數表示POST的資料
1.txt檔案內容:
uid=5372539&count=50
uid=5372539&count=100
uid=5372539&count=100
uid=5372539&count=100
uid=5372539&count=100
二、XHProf效能分析工具
2.1 簡介
XHProf (A Hierarchical Profiler For PHP)是一個輕量級的分層效能測量分析器,是C實現的PHP Zend擴充套件,最初是facebook的程式設計師寫的,是分層的函式呼叫級別的分析函式執行的時間、CPU計算時間、記憶體消耗的PHP效能分析工具。
2.2 使用
(1)安裝XHProf
tar zxvf xhprof-0.9.2.tgz
cd xhprof-0.9.2
mkdir /data/xhprof/logs/
cp -r xhprof_html xhprof_lib <directory_for_htdocs>
cd extension/
/usr/local/webserver/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config
make
make install
(2)修改php.ini
[xhprof]
extension=xhprof.so
(3)安裝Graphviz
tar zxf graphviz-2.28.0.tar.gz
cd graphviz-2.28.0
./configure
make
make install
備註:./configure prefix=/home/users/tongzhen/smbiz/local/lib/graphviz--with-png=yes --disable-swig
(4)應用XHProf
xhprof類: ZxXhprof.php[下載]
{
ZxXhprof::xhprofStart();
//程式段
……
ZxXhprof::getXhprofData('plan');
}
2.3 例項
VHOST配置(示例:root直接指向bfwphpapp的上層目錄):
訪問連結:
xhprofui_detail表結構:
DROP TABLE IF EXISTS `xhprofui_detail`;
CREATE TABLE `xhprofui_detail` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`url` varchar(2048) NOT NULL,
`host` varchar(256) NOT NULL,
`uri` varchar(256) NOT NULL,
`xhprof_id` varchar(128) NOT NULL,
`xhprof_data` longtext,
`xhprof_time` varchar(32) NOT NULL,
`ct` int(11) NOT NULL,
`wt` int(11) NOT NULL,
`mu` int(11) NOT NULL,
`pmu` int(11) NOT NULL,
`cpu` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
該工具將原本記錄到日誌中的資料(xhprof原生資料記錄到日誌中),按用途區分統一儲存到了mysql資料庫中,可以實時監控生產環境下實時的介面耗時資料統計,功能分為單次請求統計和分時請求統計。
(1)單次請求統計,可以按照需求按介面類別以時間為維度記錄到各個介面的耗時情況,統計指標有:介面耗時總時間,記憶體使用、峰值記憶體使用以及CPU時間,同時從列表中可以檢視各個介面函式耗時的實時統計。(包含基礎的統計和分析功能)
示例圖【圖片點選可放大】:
檢視詳情【圖片點選可放大】:
(2)分時請求統計,可以實現對生產環境下資料的統計對比展現,按時間區分過去一小時、6小時、24小時,2天、一週和今天以及昨天對比的資料。(下圖為頁面樣式,因之前的測試資料是201507月份,暫看不到下方的曲線圖)
【圖片點選可放大】
三、專業的壓力測試工具
3.1 Jmeter
3.1.1 簡介
Apache JMeter是Apache組織開發的基於Java的壓力測試工具。
Apache JMeter 可以用於對靜態的和動態的資源(檔案,Servlet,Perl指令碼,java物件,資料庫和查詢,FTP伺服器等等)的效能進行測試。它可以用於對伺服器,網路或物件模擬繁重的負載來測試它們的強度或分析不同壓力型別下的整體效能。你可以使用它做效能的圖形分析或在大併發負載測試你的伺服器/指令碼/物件。
3.1.2 使用
windows下開啟:解壓下載包後,在對應的jmeter路徑中,找到解壓路徑\bin\jmeter.bat
常用名詞:
1、執行緒組:測試裡每個任務都要執行緒去處理,所有我們後來的任務必須線上程組下面建立。可以在“測試計劃->新增->執行緒組”來建立它,然後線上程組面板裡有幾個輸入欄:執行緒數、Ramp-UpPeriod(in seconds)、迴圈次數,其中Ramp-UpPeriod(in seconds)表示在這時間內建立完所有的執行緒。如有8個執行緒,Ramp-Up =200秒,那麼執行緒的啟動時間間隔為200/8=25秒,這樣的好處是:一開始不會對伺服器有太大的負載;
2、取樣器(Sampler):可以認為所有的測試任務都由取樣器承擔,有很種,如:HTTP請求;
3、斷言:對取樣器返回的請求結果給出判斷,是否正確;
4、monitor:它的功能是對取樣器的請求結果顯示、統計一些資料(吞吐量、KB/S……)等。
JMeter 的主要測試元件總結如下:
1、測試計劃是使用 JMeter進行測試的起點,它是其它 JMeter測試元件的容器。
2、執行緒組代表一定數量的併發使用者,它可以用來模擬併發使用者傳送請求。實際的請求內容在Sampler中定義,它被執行緒組包含。
3、monitor負責收集測試結果,同時也被告知了結果顯示的方式。
4、邏輯控制器可以自定義JMeter傳送請求的行為邏輯,它與Sampler結合使用可以模擬複雜的請求序列。
5、斷言可以用來判斷請求響應的結果是否如使用者所期望的。它可以用來隔離問題域,即在確保功能正確的前提下執行壓力測試。這個限制對於有效的測試是非常有用的。
6、配置元件維護Sampler需要的配置資訊,並根據實際的需要會修改請求的內容。
7、前置處理器和後置處理器負責在生成請求之前和之後完成工作。前置處理器常常用來修改請求的設定,後置處理器則常常用來處理響應的資料。
8、定時器負責定義請求之間的延遲間隔。
3.1.3 例項
(1)帶引數的測試計劃
示例指令碼:updatePlan.jmx
附加引數檔案內容樣式:plan0318.txt(“\t”分隔)
18624478,18628036,18651520,18652579,18751940
19555197,19581856,19582012
3.2 LoadRunner專業級效能測試
3.2.1 簡介
LoadRunner,是一種預測系統行為和效能的負載測試工具。通過以模擬上千萬使用者實施併發負載及實時效能監測的方式來確認和查詢問題,LoadRunner能夠對整個企業架構進行測試。企業使用LoadRunner能最大限度地縮短測試時間,優化效能和加速應用系統的釋出週期。LoadRunner可適用於各種體系架構的自動負載測試,能預測系統行為並評估系統性能。
LoadRunner是一款專業級的效能測試軟體(收費),一般是QA同學進行壓力測試最為權威的並被廣泛認可的工具,作為開發的同學需要了解一些LoadRunner的執行基本原理。
3.2.2 工作原理
LoadRunner由四大元件組成:VuGen、控制器、負載發生器和分析器。
1、VuGen發生器:捕捉使用者的業務流,並最終將其錄製成一個指令碼:(1)選擇相應的一種協議;(2)在客戶端模擬使用者使用過程中的業務流程,並錄製成一個指令碼;(3)編輯指令碼和設定Run-TimeSettings項;(4)編譯指令碼生成一個沒有錯誤的可執行的指令碼。
2、控制器(Controller):(1)設計場景,包括手動場景設計和目標場景設計兩種方式;(2)場景監控,可以實時監控指令碼的執行的情況。可以通過新增計數器來監控Windows資源、應用伺服器和資料庫使用情況。
場景設計的目的是設計出一個最接近使用者實際使用的場景,場景設計越接近使用者使用的實際情況,測試出來的資料就越接近真實值。
3、負載發生器(LoadGenerators):模擬使用者對伺服器提交請求。
通常,在效能測試過程中會將控制器和負載發生器分開;當使用多臺負載發生器時,一定要保證負載均衡(指在進行效能測試的過程中,保證每臺負載發生器均勻地對伺服器進行施壓)。
4、分析器(Analysis):主要用於對測試結果進行分析。
總結:
在實際應用中,我們最為關心的是介面的平均響應時間和吞吐量的值,這部分指標是可以通過ab工具或者jmeter等專業工具壓力測試得到結果的,但是具體到應用中各個功能的實現中的效能瓶頸xhprof工具絕對是不二選擇,可以通過檢視函式執行的流程定位到耗時嚴重的模組,這個耗時統計是基於函式級別的,對制定優化方案左右非常大,同時對優化前和優化後接口指標的評估還是需要像類似jmeter這類專業工具在相同引數和應用環境下來完成的。