PHP 開發(fā)中的外圍資源性能分析(一)

暫且不討論「PHP 是不是最好的編程語(yǔ)言」,本文我們將分別分析一下在 PHP 程序的后端外圍資源和前端外圍資源,它們對(duì)整個(gè) PHP Web 應(yīng)用體驗(yàn)的影響,這往往比語(yǔ)言本身大得多。

首先穷绵,后端外圍資源,是指跟 PHP 運(yùn)行過程中與語(yǔ)言本身無關(guān)的網(wǎng)絡(luò)與 IO 操作特愿、存儲(chǔ)服務(wù)仲墨、中間件代理勾缭、緩存和數(shù)據(jù)庫(kù)訪問等,在本文中目养,我們先分析 IO 操作和中間件服務(wù)俩由。

為什么外圍資源的性能分析,要以以上三者分析為主癌蚁?我們可以看如下國(guó)內(nèi)專業(yè)的性能監(jiān)控工具 OneAPM 的 PHP Web 應(yīng)用后臺(tái)截取下來的總覽圖幻梯,通過這個(gè)圖可以看到,數(shù)據(jù)庫(kù)所花費(fèi)的時(shí)間在總 PHP 響應(yīng)時(shí)間中努释,占據(jù)著 60% 甚至更大的比重碘梢,而 Memcached 緩存服務(wù),在這張圖里所占的響應(yīng)時(shí)間伐蒂,幾乎看不見煞躬。

OneAPM 后臺(tái)總覽圖顯示的 PHP 響應(yīng)時(shí)間和數(shù)據(jù)庫(kù)訪問的比例
OneAPM 后臺(tái)總覽圖顯示的 PHP 響應(yīng)時(shí)間和數(shù)據(jù)庫(kù)訪問的比例

下面正式開始。

一饿自、IO 操作

PHP 語(yǔ)言本身盡管有性能的差異汰翠,但是從對(duì) PHP 的性能微觀分析也可以看出龄坪,如果只執(zhí)行單次操作昭雌,實(shí)際中這種差別是非常小的,前面的實(shí)驗(yàn)中健田,十萬次以上操作烛卧,才有百 ms 級(jí)的差別,因?yàn)?PHP 語(yǔ)言本身操作的是內(nèi)存妓局,一次內(nèi)存訪問总放,大約在 50ns 左右。而 IO 操作好爬,則是磁盤訪問局雄,一次磁盤訪問所費(fèi)時(shí)間在 5ms 以上。僅從這個(gè)數(shù)量級(jí)看是 10 萬倍的差距存炮,實(shí)際上炬搭,根據(jù)實(shí)驗(yàn),也有百倍級(jí)的差距(順序訪問和隨機(jī)訪問差距巨大穆桂,實(shí)際中兩者同時(shí)進(jìn)行宫盔,還會(huì)有磁盤緩存等)。

順序與隨機(jī)訪問差別巨大
順序與隨機(jī)訪問差別巨大

所以對(duì)比語(yǔ)言本身享完,IO 成為瓶頸的可能性更大灼芭。首先看一下,IO 操作帶來的性能差別般又。

一個(gè) PHP 腳本彼绷,通過 PHP 命令方式運(yùn)行巍佑,正常時(shí),消耗時(shí)間如下:

運(yùn)行腳本的正常時(shí)間
運(yùn)行腳本的正常時(shí)間

當(dāng)使用如下命令清空磁盤緩存后:

 echo 3 | sudo tee /proc/sys/vm/drop_caches

得到的第一次運(yùn)行時(shí)間下如下圖所示:

清空磁盤緩存后的運(yùn)行時(shí)長(zhǎng)
清空磁盤緩存后的運(yùn)行時(shí)長(zhǎng)

代碼一模一樣苛预,但是運(yùn)行時(shí)間卻是正常運(yùn)行時(shí)間的 6 倍句狼。當(dāng)然這個(gè)時(shí)間的慢,并不僅僅是由于程序本身的 IO 操作導(dǎo)致热某,而更大的慢的因素是在 CGI 模式下腻菇,PHP 腳本的每一次運(yùn)行都需要加載所有模塊,這個(gè)加載昔馋,也伴隨著大量的 IO 操作筹吐。

再做一個(gè)實(shí)驗(yàn),完全同樣功能的兩個(gè)頁(yè)面秘遏,一個(gè)采用了 MVC 的方式丘薛,把頭部,尾部拆開成獨(dú)立的模板(并未使用模板引擎)邦危,中間邏輯也使用獨(dú)立的 Model 類來處理洋侨。另一個(gè)只 require 了宏定義和數(shù)據(jù)庫(kù)操作兩個(gè)文件。

使用命令ab -c 40 -n 1000 http://xxxxx/0929/zuche/carlist.php
進(jìn)行壓力測(cè)試, 這兩個(gè)頁(yè)面運(yùn)行穩(wěn)定后壓測(cè)結(jié)果數(shù)據(jù)如圖所示倦蚪。

包含多文件的 MVC版壓測(cè)數(shù)據(jù)
包含多文件的 MVC版壓測(cè)數(shù)據(jù)
只包含數(shù)據(jù)配置與操作的版本壓測(cè)數(shù)據(jù)
只包含數(shù)據(jù)配置與操作的版本壓測(cè)數(shù)據(jù)

在這個(gè)頁(yè)面中希坚,MVC 版本所費(fèi)時(shí)間要多 6-8ms 左右。雖然只是多增加了幾個(gè)文件包含陵且,但是明顯增加了請(qǐng)求延時(shí)裁僧,如果文件操作本身更加復(fù)雜,比如文件上傳慕购、檢測(cè)聊疲、轉(zhuǎn)換,則延時(shí)會(huì)增加一個(gè)數(shù)量級(jí)以上沪悲。在實(shí)際的生產(chǎn)使用中获洲,也不是說有了文件操作,就一定會(huì)產(chǎn)生大的延時(shí)殿如,因?yàn)榫拖癖纠?require 而言贡珊,由于磁盤緩存等的存在,延時(shí)的影響已降低很多握截。

二飞崖、中間件代理

在正式使用中間件之前,我們先對(duì)比一下谨胞,使用數(shù)據(jù)庫(kù)與不使用數(shù)據(jù)庫(kù)的差別固歪,同樣是上面的這個(gè)例子,我們把數(shù)據(jù)結(jié)果集,從數(shù)據(jù)庫(kù)獲取轉(zhuǎn)換成為直接的結(jié)果數(shù)組設(shè)置牢裳,為了結(jié)構(gòu)化清楚逢防,采用 MVC 這一版。同時(shí)為了更顯著對(duì)比上一輪測(cè)試結(jié)果蒲讯,同時(shí)也消除語(yǔ)言本身的一些慢的因素忘朝,在本輪實(shí)驗(yàn)中,我們采用 PHP7判帮,得到結(jié)果是令人吃驚的局嘁。
如下圖是帶有數(shù)據(jù)庫(kù)連接和數(shù)據(jù)讀取的版本,PHP 擴(kuò)展使用的是 mysqli晦墙。

圖5的PHP7版
圖5的PHP7版

由于本頁(yè)面悦昵,只有一次數(shù)據(jù)庫(kù)操作,頁(yè)面結(jié)構(gòu)也比較簡(jiǎn)單晌畅,語(yǔ)言本身的影響因素非常大但指,PHP7 下速度有兩倍以上提升,原來平均響應(yīng)時(shí)長(zhǎng)為 37-40ms抗楔,現(xiàn)在則為 14ms棋凳。

將數(shù)據(jù)庫(kù)結(jié)構(gòu)換成數(shù)組的版本
將數(shù)據(jù)庫(kù)結(jié)構(gòu)換成數(shù)組的版本

即使如此,不讀取數(shù)據(jù)庫(kù)時(shí)连躏,有 4ms 的差距剩岳,盡管數(shù)目上不大,但是對(duì)于一個(gè)總響應(yīng)時(shí)長(zhǎng)只有 14ms 的應(yīng)用反粥,這 4ms 已經(jīng)很顯著了卢肃,而這只是一個(gè)數(shù)據(jù)庫(kù)查詢操作疲迂。

接下來看一下才顿,當(dāng)增加一層數(shù)據(jù)庫(kù)中間件時(shí),效率又有怎么樣的變化呢尤蒿?由于筆者所使用的中間件郑气,目前并不支持 PHP7,所以我們還在老版 PHP 的基礎(chǔ)上來比對(duì)腰池。在同樣的服務(wù)器壓力下尾组,使用了中間件的版本慢了一倍以上。如下圖所示示弓。

使用了數(shù)據(jù)庫(kù)代理中間件的版本
使用了數(shù)據(jù)庫(kù)代理中間件的版本

從這個(gè)例子可以看出來讳侨,原本 PHP 直接連數(shù)據(jù)庫(kù),取得數(shù)據(jù)的操作奏属,增加了中間件之后跨跨,變了先到中間件,中間件再到數(shù)據(jù)庫(kù),返回亦如是勇婴,導(dǎo)致了速度的大幅度下降(這里已經(jīng)剔除了中間件本身占用資源的因素忱嘹,在原來直連的版本是 37-40ms 左右)。

這里也請(qǐng)讀者不要誤解耕渴,演示中間件使用速度下降的例子拘悦,并不是說為了說明中間件不好,在分布式環(huán)境下橱脸,使用中間件是非常必要的础米。而是說,程序的外部資源添诉,往往是影響性能的重要因素椭盏,尤其是當(dāng)外部資源的連接和數(shù)據(jù)獲取本身速度達(dá)不到理想的結(jié)果時(shí)。

對(duì)于 IO 操作和中間件服務(wù)的分析就到這里吻商,下篇將分析數(shù)據(jù)庫(kù)給整個(gè)應(yīng)用性能帶來的影響掏颊。

OneAPM for PHP 能夠深入到所有 PHP 應(yīng)用內(nèi)部完成應(yīng)用性能管理和監(jiān)控,包括代碼級(jí)別性能問題的可見性艾帐、性能瓶頸的快速識(shí)別與追溯乌叶、真實(shí)用戶體驗(yàn)監(jiān)控、服務(wù)器監(jiān)控和端到端的應(yīng)用性能管理柒爸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末准浴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子捎稚,更是在濱河造成了極大的恐慌乐横,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件今野,死亡現(xiàn)場(chǎng)離奇詭異葡公,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)条霜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門催什,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宰睡,你說我怎么就攤上這事蒲凶。” “怎么了拆内?”我有些...
    開封第一講書人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵旋圆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我麸恍,道長(zhǎng)灵巧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮孩等,結(jié)果婚禮上艾君,老公的妹妹穿的比我還像新娘。我一直安慰自己肄方,他們只是感情好冰垄,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著权她,像睡著了一般虹茶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上隅要,一...
    開封第一講書人閱讀 52,874評(píng)論 1 314
  • 那天蝴罪,我揣著相機(jī)與錄音,去河邊找鬼步清。 笑死要门,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的廓啊。 我是一名探鬼主播欢搜,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼谴轮!你這毒婦竟也來了炒瘟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤第步,失蹤者是張志新(化名)和其女友劉穎疮装,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粘都,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡廓推,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驯杜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片受啥。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡做个,死狀恐怖鸽心,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情居暖,我是刑警寧澤顽频,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站太闺,受9級(jí)特大地震影響糯景,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一蟀淮、第九天 我趴在偏房一處隱蔽的房頂上張望最住。 院中可真熱鬧,春花似錦怠惶、人聲如沸涨缚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脓魏。三九已至,卻和暖如春通惫,著一層夾襖步出監(jiān)牢的瞬間茂翔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來泰國(guó)打工履腋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留珊燎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓遵湖,卻偏偏與公主長(zhǎng)得像俐末,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奄侠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容