暫且不討論「PHP 是不是最好的程式設計語言」,本文我們將分別分析一下在 PHP 程式的後端外圍資源和前端外圍資源,它們對整個 PHP Web 應用程式體驗的影響,這往往比語言本身大得多。
上一篇中我們分析了後端外圍資源中 IO 操作和中介軟體服務對整個 PHP Web 應用程式體驗的影響。今天我們分析資料庫給整個應用效能帶來的影響。
資料庫
首先直觀地看兩張圖,一張是來自 OneAPM 背景 Web 事務輸送量圖,也就是每分鐘有多少次 Web 事務被觸發、多少次資料庫事務被觸發,。
如上可以看到,Web 事務,每分鐘在 150-200 次上下浮動,而相應的資料操作,也達到了相應的量。
以上是從直觀的感受看到資料庫的請求總量,與總請求量的一個比重,可以看到資料庫的使用是非常重的。而眾所周知,這種平均的分析思路是不對的。因為在計算流量高峰時,我們可能只計算 30% 的時間為高峰時間,同時,也只關注 20% 的主要請求的效能問題。所以,從具體的某個頁面來看,一個普通的 Web 應用程式頁面,資料庫使用在其中的佔比。
從以上 XHProf 報表可以看出,這一個頁面,總共資料庫請求達 89 次,耗費了頁面總時間的 44.5%,這還是一個正常的頁面和正常的請求,如此之多的請求次數,可以很容易地想到,如果遠端資料庫慢一點,網路卡一點,每個請求所耗費的平均時間達到3-5ms,則整體頁面速度就會從 208ms 延時向 500ms 逼近。
總結
PHP 語言本身的最佳化雖然顯著,但是這始終是可控的,而效能的瓶頸,往往出現在不可控的外部資源之上。比如每年一度的 12306 崩潰,也不是語言本身的效能導致的崩潰,而是外部資源的不足和架構問題導致的問題。當然,我們也不能否認,語言與語言之間的巨大差別為資源帶來的節省,比如滴滴出行的後台服務,就正在由 PHP向 Go 切換中,就是 PHP 本身的資源消耗是 Go 的數倍。
本文作為針對 PHP 外圍資源性的能分析,比較簡單地設計了一些實驗情境,看到了外部資源,包括 IO、中介軟體和資料庫資源給程式效能帶來的影響。這些情境的瓶頸又如何消除和最佳化呢?這其實是一個很大的課題,本文不再細緻地深入討論,但是也向大家介紹外部資源最佳化總的原則。是筆者所欣賞的一張圖,非常形象且非常全面精要地概括了資料庫最佳化的法則,這些法則對於其他外部資源的最佳化也同樣適用,。
這張圖可以看出幾點:
1、對於外部資源的使用,最大的最佳化就是減少資源的使用。也就商務邏輯的最佳化和緩衝,這兩者帶來的效能提升往往是數量級層級的提升
2、而所有的最佳化都是一個綜合的工程,不會是從某個單點下手而一勞永逸。中,分別考慮到對磁碟、網路、CPU 和記憶體等各方面的最佳化下手。
3、增加資源,也就是增加硬體設定是最佳化的最末方案。在可能的情況下,儘可能地使用軟體最佳化,帶來的效能提升,相比硬體帶來的提升,既廉價又高效。
有關影響 PHP 程式效能的後端外圍資源就到這裡,在下一篇中,我們將分析前端或者前後端結合給頁面延時帶來的影響。
OneAPM for PHP 能夠深入到所有 PHP 應用內部完成應用效能管理能夠深入到所有 PHP 應用內部完成應用效能管理和監控,包括代碼層級效能問題的可見度、效能瓶頸的快速識別與追溯、真實使用者體驗監控、伺服器監控和端到端的應用效能管理。