天天看點

Linux性能故障排查工具,Linux系統線上故障排查的幾種技巧

無論是開發還是運維,和 Linux 打交道是每個技術人的日常。然而,性能優化、故障排查也是軟體系統中最有挑戰的工作之一,甭管看了多少資料和書,一旦涉及到解決具體問題,照樣兒一臉懵逼,比如:

流量高峰期,伺服器 CPU 使用率過高報警,你登入 Linux 上去 top 完之後,卻不知道怎麼進一步定位,到底是系統 CPU 資源太少,還是程式并發部分寫得有問題?

系統并沒有跑什麼吃記憶體的程式,但在敲完 free 指令之後,卻發現已經沒什麼記憶體了,到底是哪裡占用了記憶體?為什麼?

一大早就收到 Zabbix 告警,你發現某台存放監控資料的資料庫主機 CPU 的 I/O Wait 較高,該怎麼辦?

Linux性能故障排查工具,Linux系統線上故障排查的幾種技巧

下面,介紹幾個 CPU 使用率過高的排查技巧:

1、通過top指令定位占用cpu高的程序

執行top指令得到以下結果:

Linux性能故障排查工具,Linux系統線上故障排查的幾種技巧

通過上圖可以明顯看出程序PID41843占用cpu過高,明顯存在問題,定位到了程序id。當然如果你想隻觀察程序PID41843的CPU和記憶體以及負載情況,可以使用以下指令

top-p 41843

結果如下:

Linux性能故障排查工具,Linux系統線上故障排查的幾種技巧

2、通過top指令定位問題程序中每個線程占用cpu情況

通過問題程序中每個線程占用cpu情況使用可以使用如下指令:

top-p 41843 -H

檢視程序PID41843的每一個線程占用CPU情況,如圖。

Linux性能故障排查工具,Linux系統線上故障排查的幾種技巧

由上圖明顯可以發現,線程PID41892CPU占用率***,接下來定位該線程的代碼是否出現異常導緻cpu占用過高。

3、通過jstack 指令定位問題代碼

上一步發現PID41892占用的CPU過高,就将這個PID轉換成16進制,易知,PID41892轉化成16進制為a3a4。使用如下指令指令定位問題代碼:

jstack 41892 | grep a3a4

輸出如下:

"Thread"prio=10 tid=0x00007f950043e000 nid=0x54eeintest();

可以分析得到: 線程Thread下的wait()函數cpu使用率很高,檢視源代碼中的test()函數代碼如下:

Linux性能故障排查工具,Linux系統線上故障排查的幾種技巧

while循環無法結束,一直搶占cpu,導緻程式cpu使用過高,修改代碼即可。

當然了,除了cpu以外,還有很多其它問題,這種類似的排查經驗隻能從實踐中總結,原理書是不會告訴你這些的。幾年前,我自己學習那會兒也看了不少書,嘗試從網上找過些零零散散的資料。但說真的,Linux 性能優化是個系統工程,除了要學習那些基礎知識點之外,還有 2 點比較重要:

掌握性能優化的思路和方法,嘗試大量 Linux 性能工具

從學習到輸出,說白了就是不斷實踐,從實踐中總結經驗

【編輯推薦】

【責任編輯:武曉燕 TEL:(010)68476606】

點贊 0