在用戶方的Linux服務(wù)器上排查故障問(wèn)題的冷靜處理方法-尚文網(wǎng)絡(luò).UP楠哥
#盡可能搞清楚問(wèn)題的前因后果
?故障的表現(xiàn)是什么?無(wú)響應(yīng)?報(bào)錯(cuò)?
故障是什么時(shí)候發(fā)現(xiàn)的?
?故障是否可重現(xiàn)?
有沒(méi)有出現(xiàn)的規(guī)律(比如每小時(shí)出現(xiàn)一次)
?最后一次對(duì)整個(gè)平臺(tái)進(jìn)行更新的內(nèi)容是什么(代碼、服務(wù)器等)?
故障影響的特定用戶群是什么樣的(已登錄的, 退出的, 某個(gè)地域的…)?
?基礎(chǔ)架構(gòu)(物理的、邏輯的)的文檔是否能找到?
是否有監(jiān)控平臺(tái)可用? (比如Nmon、Cacti、 Zabbix、Grafana)
#有誰(shuí)在
? $ w
? $ last
用這兩個(gè)命令看看都有誰(shuí)在線,有哪些用戶訪問(wèn)過(guò)。這不是什么關(guān)鍵步驟,不過(guò)最好別在其他用戶正干活的時(shí)候來(lái)調(diào)試系統(tǒng)。
#之前發(fā)生了什么
? $ history
查看一下之前服務(wù)器上執(zhí)行過(guò)的命令??匆幌驴偸菦](méi)錯(cuò)的,加上前面看的誰(shuí)登錄過(guò)的信息,應(yīng)該有點(diǎn)用。另外作為admin要注意,不要利用自己的權(quán)限去侵犯別人的隱私。
#現(xiàn)在在運(yùn)行的進(jìn)程是什么
? $ pstree -a
? $ ps aux
這都是查看現(xiàn)有進(jìn)程的。 ps aux 的結(jié)果比較雜亂, pstree -a 的結(jié)果比較簡(jiǎn)單明了,可以看到正在運(yùn)行的進(jìn)程及相關(guān)用戶。
#監(jiān)聽(tīng)的網(wǎng)絡(luò)服務(wù)
? $ netstat -tunlpa
? $ sss -tunlpa
找到所有正在運(yùn)行的服務(wù),檢查它們是否應(yīng)該運(yùn)行。查看各個(gè)監(jiān)聽(tīng)端口。在netstat顯示的服務(wù)列表中的PID 和 ps aux 進(jìn)程列表中的是一樣的。
#CPU&內(nèi)存
? $ free -m
? $ uptime
? $ top
注意以下問(wèn)題:
是否還有空余的內(nèi)存? 服務(wù)器是否正在內(nèi)存和硬盤(pán)之間進(jìn)行swap?
是否還有剩余的CPU? 服務(wù)器是幾核的? 是否有某些CPU核負(fù)載過(guò)多了?
服務(wù)器最大的負(fù)載來(lái)自什么地方? 平均負(fù)載是多少?
#I/O性能
? $ iostat -kx 2
? $ vmstat 2 10
? $ mpstat 2 10
這些命令對(duì)于調(diào)試后端性能非常有用。
檢查磁盤(pán)使用量:服務(wù)器硬盤(pán)是否已滿?
是否開(kāi)啟了swap交換模式 (si/so)?
CPU被誰(shuí)占用:系統(tǒng)進(jìn)程? 用戶進(jìn)程? 虛擬機(jī)?
dstat 是我的最?lèi)?ài)。用它可以看到誰(shuí)在進(jìn)行 IO: 是不是MySQL吃掉了所有的系統(tǒng)資源? 還是你的PHP進(jìn)程?
#系統(tǒng)日志和內(nèi)核消息
? $ dmesg
? $ tail -f /var/log/messages
? $ tail -f /var/log/secure
? $ tail -f /var/log/auth
查看錯(cuò)誤和警告消息,比如看看是不是很多關(guān)于連接數(shù)過(guò)多導(dǎo)致?
看看是否有硬件錯(cuò)誤或文件系統(tǒng)錯(cuò)誤?
分析是否能將這些錯(cuò)誤事件和前面發(fā)現(xiàn)的疑點(diǎn)進(jìn)行時(shí)間上的比對(duì)。