生產(chǎn)環(huán)境突發(fā)高負(fù)載!是“誰”偷走了你的服務(wù)器性能?
場景描述
網(wǎng)站上線后一直穩(wěn)定運行,事情發(fā)生在今天早上,剛到公司,還沒走到工位,手機(jī)收到告警信息,生產(chǎn)環(huán)境中的某臺服務(wù)器突發(fā)高負(fù)載!立馬開啟電腦,放下手中早餐,開始排查處理。下面是診斷引起系統(tǒng)CPU性能問題的過程,希望能給到大家一些診斷問題時的一些思路。
業(yè)務(wù)環(huán)境:PHP
排查過程
1、使用top命令查看當(dāng)前系統(tǒng)情況,并按[1]展開CPU列表
2、上圖可以看出來CPU占用主要是php進(jìn)程導(dǎo)致,當(dāng)前可用內(nèi)存足夠。現(xiàn)在重點看下CPU的情況。
此例子中CPU 主要消耗在內(nèi)核態(tài)「sy」,而非用戶態(tài)「us」。 需要跟蹤程序行為一般會用到兩個工具:
內(nèi)核態(tài)的函數(shù)調(diào)用跟蹤用「strace」
用戶態(tài)的函數(shù)調(diào)用跟蹤用「ltrace」
下面使用strace來分析這次的問題:
[root@localhost ~]# strace -cp
從上圖可以看到CPU總耗時最長的操作是一個名為clone的調(diào)用函數(shù),單獨追蹤下這個命令:
[root@localhost ~]# strace -T -e clone -p
可以看到,一個 clone 操作需要幾百毫秒,clone操作的作用簡單來說就是調(diào)用系統(tǒng)函數(shù)去創(chuàng)建(fork)一個新進(jìn)程。現(xiàn)在回歸到PHP側(cè)分析為什么會出現(xiàn)此類系統(tǒng)調(diào)用。
查詢業(yè)務(wù)代碼看到了 exec 函數(shù),這個命令導(dǎo)致了系統(tǒng)不斷會fork進(jìn)程,去處理exec執(zhí)行的外部命令,導(dǎo)致CPU開銷很大。
通過如下命令驗證它確實會導(dǎo)致 clone 系統(tǒng)調(diào)用:
[root@localhost ~]# strace -e clone php -r 'exec("ls");'
有同學(xué)要疑問了,同是Linux運維工程師,自己從來都是登陸服務(wù)器觀察資源使用情況才獲取到高負(fù)載告警,之前還有因未及時發(fā)現(xiàn)服務(wù)器高負(fù)載情況,使得業(yè)務(wù)短時間崩潰,損失慘重。
你是如何在還沒到工位時就收到服務(wù)器高負(fù)載的告警信息的呢?
我是使用了一個云運維工具——王教授,對于日常運維工作幫助確實非常大,可以及時提醒我云資源的變化情況,例如:服務(wù)器 CPU 使用率偏高、服務(wù)器安全組設(shè)置不安全、云數(shù)據(jù)庫存在慢SQL等。使用云,運維云的同學(xué)可以選擇使用。
王教授工具地址:https://prof.wang。
新聞熱點
疑難解答