這篇文章將為大家詳細(xì)講解有關(guān)怎么在PHP中利用XHGui進(jìn)行性能測試,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
創(chuàng)新互聯(lián)專注于青州企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,成都商城網(wǎng)站開發(fā)。青州網(wǎng)站建設(shè)公司,為青州等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)Profiling是一項(xiàng)用來觀察程序性能的技術(shù),非常適用于發(fā)現(xiàn)程序的瓶頸或者緊張的資源。Profiling能夠深入程序的內(nèi)部,展現(xiàn)request處理過程中每一部分代碼的性能;同時(shí),也可以確定有問題的請求(request);對于有問題的請求,我們還可以確定性能問題發(fā)生在請求內(nèi)部的位置。對于PHP,我們有多種Profiling工具,本文主要集中在——XHGui,一款非常優(yōu)秀的工具。XHGui構(gòu)建在XHProf之上(XHProf由Facebook發(fā)布),但是對于剖析結(jié)果增加了更好的存儲,同時(shí)增加了更加良好的信息獲取接口。從這方面來說,XHGui更像是一個(gè)全新的工具。
XHGui已經(jīng)經(jīng)歷過幾個(gè)版本的迭代,但當(dāng)前版本提供了更加漂亮的用戶界面,并且使用MongoDB存儲其剖析結(jié)果。相比于前一版本來說,所有這些方面都是巨大的改進(jìn);因?yàn)?,前一版本更像是開發(fā)者設(shè)計(jì)的,采用文件來保存數(shù)據(jù),使得收集的數(shù)據(jù)非常難以使用。XHGui 2013是一個(gè)非常全面的Profiling工具,無論是對管理人員來說還是對于開發(fā)者;與此同時(shí),XHGui 2013被設(shè)計(jì)的足夠輕巧以便能夠在生產(chǎn)環(huán)境下運(yùn)行。
本文將一步一步演示程序的安裝,同時(shí)向你展現(xiàn)使用該工具可以收集的各方面信息。
第一步:安裝依賴
因?yàn)閄HGui有一些依賴項(xiàng),所以我們第一步就是解決這個(gè)問題。底下的所有的教程都是基于Ubuntu 13.04平臺的,當(dāng)然,你應(yīng)該可以把它們改編下并適用到到你自己的平臺上。目前而言,我們需要安裝MongoDB, PHP,并有一些安裝PECL拓展的能力。
首先,我們要安裝MongoDB,這邊有一些官方的安裝教程,你可以找到和你系統(tǒng)相關(guān)的細(xì)節(jié),但是現(xiàn)在我將通過簡單的通過APT來安裝:
aptitude install mongodb
通過這個(gè)方式獲取的MongoDB的版本可能不是新的,因?yàn)檫@個(gè)產(chǎn)品的更新速度真的很快。但是,如果你想讓它保持一個(gè)很新的版本,你可以把MongoDB提供的庫添加到你的包管理器里,這樣你就能得到一個(gè)新的了。
與此同時(shí),我們還需要針對PHP的Mongo 驅(qū)動(dòng)。在倉庫中該驅(qū)動(dòng)的版本有點(diǎn)老,為了今天的演示,我們將從Pecl中進(jìn)行獲取。如果你的機(jī)器上沒有pecl命令,你可以通過下面的命令進(jìn)行安裝:
aptitude install php-pear
然后,我們通過下面的命令向PHP添加MongoDB的驅(qū)動(dòng)程序:
pecl install mongo
為了完成安裝,最后我們需要在php.ini文件中新增加一行。但是,新版本的Ubuntu為配置PHP擴(kuò)展提供了一個(gè)新系統(tǒng),該系統(tǒng)更像Apache模塊安裝——將所有的配置保存在一個(gè)地方,然后創(chuàng)建一個(gè)符號鏈接以啟動(dòng)配置。首先,我們創(chuàng)建一個(gè)文件來保存設(shè)置,盡管在本示例中僅需要在設(shè)置中新增一行以啟動(dòng)擴(kuò)展。我們將其保存在文件/etc/php5/mods-available/mongo.ini,新增下面一行:
php5enmod mongo
再次使用pecl來安裝xhprof擴(kuò)展程序。該程序目前僅是beta版本,因此安裝命令如下:
pecl install xhprof-beta
命令行會再一次提示我們在php.ini新增一行。我們采用與上面一樣的方法,創(chuàng)建文件/etc/php5/mods-available/xhprof.ini,并在里面新增如下內(nèi)如:
extension=xhprof.so
此時(shí),我們可以檢查一下這些模塊是否正確安裝——通過在命令行運(yùn)行php -m命令。記住,不要忘記重啟Apache,以便web接口能夠啟用這些擴(kuò)展。
安裝XHGui
XHGui本身主要由web頁面組成,它為XHProf擴(kuò)展收集的數(shù)據(jù)提供更加友好的界面。你可以從代碼庫GitHub repo克?。灰部梢灾苯酉螺dzip文件,然后進(jìn)行解壓縮。獲取程序之后,確定緩存目錄有足夠的權(quán)限以便web服務(wù)器有權(quán)限寫入文件。最后,運(yùn)行安裝腳本:
php install.php
這就是程序安裝所需的一切,并且會自動(dòng)安裝一些依賴程序;如果發(fā)生異常,安裝程序也會給你提示。
我更喜歡將XHGui安裝在虛擬主機(jī)當(dāng)中;這需要.htaccess文件允許,也需要啟動(dòng)RUL重寫。啟動(dòng)URL重寫表明需要啟動(dòng)mod_rewrite模塊,通過下面的命令:
a2enmod rewrite
(不要忘記重啟Apache)。如果一切順利,你可以正常訪問XHGui的URL并且可以看到如下內(nèi)容:
在虛擬主機(jī)中啟動(dòng)XHGui
此時(shí),我們希望啟動(dòng)XHGui以便檢驗(yàn)我們網(wǎng)站的性能。注意,性能測試好在進(jìn)行任何優(yōu)化之前執(zhí)行一次,以便檢測優(yōu)化的效果。最簡單的方法是在虛擬主機(jī)中增加auto_prepend_file聲明,如下圖所示:
<VirtualHost *:80> ServerName example.local DocumentRoot /var/www/example/htdocs/ php_admin_value auto_prepend_file /var/www/xhgui/external/header.php <Directory /var/www/example/htdocs/> Options FollowSymLinks Indexes AllowOverride All </Directory> </VirtualHost>
一切就緒之后,你可以開始剖析網(wǎng)站的請求。XHGui只會剖析網(wǎng)站請求的1%,所以為了使XHGui獲取有意義的數(shù)據(jù),你需要讓XHGui運(yùn)行一段時(shí)間或者使用類似Apache Bench的測試工具批量提交一批請求。為什么在100個(gè)請求當(dāng)中XHGui只會剖析一個(gè)?因?yàn)閄HGui的設(shè)計(jì)初衷就是足夠的輕巧以便在生產(chǎn)環(huán)境中使用,它不想對每一個(gè)請求產(chǎn)生額外的開銷,1%的采樣率已經(jīng)能夠?yàn)榫W(wǎng)站的總體流量提供較為清晰的概覽。
滿足數(shù)據(jù)
我使用測試虛擬機(jī)運(yùn)行本文所有的示例,采用Joind.in API作為測試代碼。為了產(chǎn)生一些流量,我將API測試案例運(yùn)行了幾遍。你也可以在一定負(fù)載的情況下收集數(shù)據(jù),所以你可以在壓力測試時(shí)使用XHGui,你甚至可以在上線站點(diǎn)中使用XHGui收集數(shù)據(jù)(聽起來很瘋狂,但是Facebook正式為了此應(yīng)用才開發(fā)了該工具)。在向應(yīng)用發(fā)送了一定的請求之后,重新訪問XHGui,現(xiàn)在它就已經(jīng)保存了一些數(shù)據(jù):
該圖向我們展示了XHGui為我們分析的每一個(gè)請求,新的請求排在第一位,并且為每一個(gè)請求展示了一些額外信息。這些信息包括:
URL:請求所訪問的URL
Time:請求發(fā)起時(shí)間
wtor: "Wall Time" –請求所經(jīng)歷的所有時(shí)間. 這是 "wall clock" time的簡稱,表示用戶等待請求完成所有的時(shí)間
cpu:花費(fèi)在該請求上的CPU時(shí)間
mu:該請求所消耗的內(nèi)存
pmu:請求處理過程中所消耗的較大內(nèi)存
為了獲取每一遍請求("run")更為詳細(xì)的信息,你可以點(diǎn)擊每一個(gè)請求你感興趣的列。你可以點(diǎn)擊URL以便獲取該URL所有請求的詳細(xì)信息。無論哪種方法,你都可以獲取該請求更為詳細(xì)的信息:
這是一個(gè)非常長并且非常詳細(xì)的頁面,所以我引用了兩個(gè)截圖(如果展示所有的信息將需要5個(gè)截圖)。上面一幅圖的左邊部分展示了該請求相關(guān)的一些信息,以便幫助你跟蹤這些統(tǒng)計(jì)信息與哪些方面有關(guān);右邊的主要部分展示了最消耗時(shí)間的各部分以及在請求過程中每個(gè)函數(shù)調(diào)用所消耗的內(nèi)存。在圖的下方有一個(gè)主鍵以表明每一欄。
第二幅圖展示了該請求每一個(gè)組成部分更為詳細(xì)的信息。我們可以看到每一部分調(diào)用的次數(shù)以及時(shí)間消耗,還包括CPU和內(nèi)存信息。無論是inclusive還是exclusive信息都做了詳細(xì)的展示:exclusive表示僅僅是該方法調(diào)用所產(chǎn)生的消耗;inclusive不僅包括本函數(shù)所產(chǎn)生的消耗,還包括本函數(shù)調(diào)用的其他函數(shù)所產(chǎn)生的消耗。
XHGui另一個(gè)特性是“調(diào)用圖”(Callgraph),“調(diào)用圖”以生動(dòng)的虛擬方式展示了時(shí)間是如何消耗的:
這很好的展示了函數(shù)調(diào)用的層次。好的一點(diǎn)是,該圖是可交互的,你可以拖拽以更好的查看連接;你還可以用鼠標(biāo)滑過“圓環(huán)”(blob)以查看更多的信息。當(dāng)你與它交互時(shí),他會很好玩的彈回和移動(dòng),這不是一個(gè)非常重要的特性但卻讓我感覺非常好玩。
理解數(shù)據(jù)
擁有大量的統(tǒng)計(jì)數(shù)據(jù)非常重要,但是你很難知道從哪里下手。對于一個(gè)性能不如預(yù)期的頁面采用如下步驟:首先,對每一個(gè)函數(shù)的exclusive CPU時(shí)間進(jìn)行排序,查看最消耗時(shí)間的函數(shù)列表。分析這些耗時(shí)的函數(shù)調(diào)用并進(jìn)行重構(gòu)和優(yōu)化。
一旦做出了修改,讓剖析工具再次檢驗(yàn)新版本的程序,測試性能的改進(jìn)。XHGui內(nèi)置了完美的工具以比較兩次運(yùn)行;點(diǎn)擊詳細(xì)信息頁面右上角的“Compare this run"按鈕即可。該按鈕會向你展示該URL每一次測試的結(jié)果,從中選擇一個(gè)你要比較的對象。對你想比較的對象,點(diǎn)擊”compare“按鈕,XHGui將會轉(zhuǎn)向比較視圖,如下圖所示:
統(tǒng)計(jì)表格展示了新版和舊版統(tǒng)計(jì)信息的主要區(qū)別,包括每一個(gè)信息改動(dòng)的實(shí)際數(shù)字以及百分比。上圖顯示,新版的請求等待時(shí)間僅僅為舊版的8%。統(tǒng)計(jì)表格詳細(xì)展示了每一個(gè)統(tǒng)計(jì)信息的改變,這些統(tǒng)計(jì)信息我們在”詳細(xì)信息“頁面能夠經(jīng)常看到;你可以對任何一列進(jìn)行排序以便查找你感興趣的信息。
一旦你在某一方面成功的進(jìn)行了重構(gòu),查看詳細(xì)信息頁面(detail page)以檢查新版本的實(shí)際效果,然后挑選其他方面進(jìn)行優(yōu)化。嘗試對內(nèi)存使用或者exclusive wall time 進(jìn)行排序,以便挑選能夠較大限度提高應(yīng)用整體性能的函數(shù)進(jìn)行優(yōu)化。同時(shí),不要忘記檢查調(diào)用的次數(shù),一個(gè)重復(fù)調(diào)用的函數(shù)經(jīng)過優(yōu)化之后能夠成倍的提高程序的性能。
最優(yōu)化方法
你很難在量化成果之前知道自己改善了多少,這就是為什么我們經(jīng)常在對一個(gè)應(yīng)用進(jìn)行優(yōu)化之前檢測它--不然你怎么知道自己是否真的優(yōu)化了它?我們也需要想想一組真實(shí)的數(shù)據(jù)應(yīng)該怎樣表示,不然,我們可能會朝著一個(gè)不可能到達(dá)的目標(biāo)前進(jìn)。一個(gè)很有用的方法是:盡力去尋找需要使用的最適合的數(shù)據(jù)結(jié)構(gòu)以及最小存儲空間。如果在你擅長的工作環(huán)境中,不能在半秒內(nèi)運(yùn)行一個(gè)“Hello world”程序,那么就別指望用同樣的工具構(gòu)建的網(wǎng)頁能有多好的表現(xiàn)。
上面的敘述并不是對編程框架(framework)的不敬;編程框架之所以存在是因?yàn)槠浞奖闶褂?、支持快速開發(fā)、容易維護(hù)。相比親自手工編寫代碼,編程框架在性能上的降低是我們綜合各方面進(jìn)行折中的結(jié)果。采用編程框架進(jìn)行應(yīng)用開發(fā)是能夠盡快上線的一種很好的方法,當(dāng)需要的時(shí)候,你可以使用Profiling工具分析并改進(jìn)程序的性能。例如,Zend Framework 1的很多模塊能夠提供非好強(qiáng)大的特性,但是并能非常低下;采用Profiling工具就能確定性能低下的部分并將它們進(jìn)行替換。其他所有的框架都有類似的問題,XHGui能夠向您展示問題的所在并檢查他們是否對你的程序產(chǎn)生了可量化的影響。
在你的程序之外,一些其他的策略對占領(lǐng)上風(fēng)或許遲早有用:
當(dāng)心非危險(xiǎn)的慢速關(guān)聯(lián)函數(shù)(not-dangerously-slow-but-related functions)在一個(gè)頁面上露面。如果你的頁面在格式化要點(diǎn)處理的 view helper 中的一系列函數(shù)中花去了它時(shí)間的 50%(我承諾這是個(gè)假想的例子),那么你可能想要去研究重構(gòu)整個(gè)組件。
少做。嘗試移除特性,如果性能比它們重要。
當(dāng)心一個(gè)請求中生成但沒有在特殊的視圖中用到的內(nèi)容,或未改變卻被多次重新生成的內(nèi)容。
好的緩存策略。這將是關(guān)于它的另一篇文章,但是考慮用 PHP 中的一個(gè) OpCode 緩存(從 PHP 5.5 起內(nèi)置),在你的 web 服務(wù)器前方添加一個(gè)反向代理,簡單地為那些不怎么經(jīng)常改變的內(nèi)容發(fā)送適當(dāng)?shù)木彺骖^。
暴力去耦合。如果有一個(gè)可怕的資源緊張的特殊功能,把它從你的 web 服務(wù)器上去掉?;蛟S它可以被異步處理,所以你的程序可以僅僅添加一個(gè)消息到隊(duì)列,或移動(dòng)到另一個(gè)單獨(dú)的服務(wù)器并作為一個(gè)單獨(dú)的服務(wù)模型來訪問。無論哪種方式,分離將幫助減少你的 web 服務(wù)器的負(fù)載,同時(shí)啟用了有效的擴(kuò)展。
關(guān)于怎么在PHP中利用XHGui進(jìn)行性能測試就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
網(wǎng)頁標(biāo)題:怎么在PHP中利用XHGui進(jìn)行性能測試-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://jinyejixie.com/article34/jepse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、ChatGPT、服務(wù)器托管、虛擬主機(jī)、網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容