Linux 常見異常分析,請收好這份排查指南~

Linksla發表於2022-11-09

1 常用的 Load 分析方法

CPU高、Load高

  1. 透過  top  命令查詢佔用CPU最高的程式PID;

  2. 透過 top -Hp PID 查詢佔用CPU最高的執行緒TID;

  3. 對於 java 程式,使用 jstack 列印執行緒堆疊資訊;

  4. 透過 printf %x tid 列印出最消耗CPU執行緒的十六進位制;

CPU低、Load高

產生的原因一句話總結就是:等待磁碟I/O完成的程式過多,導致程式佇列長度過大,但是CPU執行的程式卻很少,這樣就體現到負載過大了,cpu使用率低。

  • 透過 top 命令檢視CPU等待IO時間,即 %wa
  • 透過 iostat -d -x -m 1 10 檢視磁碟IO情況; (安裝命令  yum install -y sysstat )
  • 透過 sar -n DEV 1 10 檢視網路IO情況;
  • 透過如下命令查詢佔用IO的程式;
ps -e -L h o state,cmd  | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr

2 CPU高、Load高情況分析

  • 使用 vmstat  檢視系統緯度的 CPU 負載;

  • 使用  top  檢視程式緯度的 CPU 負載;

2.1 使用 vmstat 檢視系統緯度的 CPU 負載

可以透過 vmstat 從系統維度檢視 CPU 資源的使用情況

格式: vmstat -n 1 -n 1  表示結果一秒重新整理一次

[root@VM-1-14-centos ~]# vmstat -n 1procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 1  0      0 250304 163472 2154300    0    0     1    16    0    4  1  0 98  0  0 0  0      0 250412 163472 2154332    0    0     0     0  937 1439  1  1 99  0  0 0  0      0 250428 163472 2154332    0    0     0     4  980 1329  0  0 100  0  0 0  0      0 250444 163472 2154332    0    0     0     0  854 1227  0  0 99  0  0 0  0      0 250444 163472 2154332    0    0     0    68  832 1284  0  1 99  1  0 0  0      0 250016 163472 2154332    0    0     0     0  929 1389  1  1 99  0  0

返回結果中的主要資料列說明:

  • r表示系統中 CPU 等待處理的執行緒。由於 CPU 每次只能處理一個執行緒,所以,該數值越大,通常表示系統執行越慢。
  • b表示阻塞的程式,這個不多說,程式阻塞,大家懂的。
  • us使用者CPU時間,我曾經在一個做加密解密很頻繁的伺服器上,可以看到us接近100,r執行佇列達到80(機器在做壓力測試,效能表現不佳)。
  • sy系統CPU時間,如果太高,表示系統呼叫時間長,例如是IO操作頻繁。
  • waIO 等待消耗的 CPU 時間百分比。該值較高時,說明 IO 等待比較嚴重,這可能磁碟大量作隨機訪問造成的,也可能是磁碟效能出現了瓶頸。
  • id處於空閒狀態的 CPU 時間百分比。如果該值持續為 0,同時 sy 是 us 的兩倍,則通常說明系統則面臨著 CPU 資源的短缺。

常見問題及解決方法:

  • 如果 r 經常大於4,且id經常少於40,表示cpu的負荷很重。
  • 如果pi,po長期不等於0,表示記憶體不足。
  • 如果disk經常不等於0,且在b中的佇列大於3,表示io效能不好。
2.2 使用 top 檢視程式緯度的 CPU 負載

可以透過 top 從程式緯度來檢視其 CPU、記憶體等資源的使用情況。

top - 19:49:59 up 36 days, 23:15,  3 users,  load average: 0.11, 0.04, 0.05Tasks: 133 total,   1 running, 131 sleeping,   0 stopped,   1 zombie%Cpu(s):  3.1 us,  3.1 sy,  0.0 ni, 93.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 stKiB Mem :  3880188 total,   241648 free,  1320424 used,  2318116 buff/cacheKiB Swap:        0 total,        0 free,        0 used.  2209356 avail Mem   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                1793 mysql     20   0 1608796 236708   9840 S   6.7  6.1  83:36.23 /usr/sbin/mysqld                                        1 root      20   0  125636   3920   2444 S   0.0  0.1   4:34.13 /usr/lib/systemd/systemd                                     2 root      20   0       0      0      0 S   0.0  0.0   0:00.90 [kthreadd]                                                                                                4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [kworker/0:0H]                                                                                            6 root      20   0       0      0      0 S   0.0  0.0   0:15.46 [ksoftirqd/0]                                                                                             7 root      rt   0       0      0      0 S   0.0  0.0   0:12.02 [migration/0]

預設介面上第三行會顯示當前 CPU 資源的總體使用情況,下方會顯示各個程式的資源佔用情況。
可以直接在介面輸入大小字母 P,來使監控結果按 CPU 使用率倒序排列,進而定位系統中佔用 CPU 較高的程式。最後,根據系統日誌和程式自身相關日誌,對相應程式做進一步排查分析,以判斷其佔用過高 CPU 的原因。

3 CPU低、Load高

問題描述

Linux 系統沒有業務程式執行,透過 top 觀察,類似如下圖所示,CPU 很空閒,但是 load average 卻非常高:

問題分析

CPU低而負載高也就是說等待磁碟I/O完成的程式過多,就會導致佇列長度過大,這樣就體現到負載過大了,但實際是此時CPU被分配去執行別的任務或空閒,具體場景有如下幾種:

場景一:磁碟讀寫請求過多就會導致大量I/O等待

上面說過,cpu的工作效率要高於磁碟,而程式在cpu上面執行需要訪問磁碟檔案,這個時候cpu會向核心發起呼叫檔案的請求,讓核心去磁碟取檔案,這個時候會切換到其他程式或者空閒,這個任務就會轉換為不可中斷睡眠狀態。當這種讀寫請求過多就會導致不可中斷睡眠狀態的程式過多,從而導致負載高,cpu低的情況。

場景二:MySQL中存在沒有索引的語句或存在死鎖等情況

我們都知道MySQL的資料是儲存在硬碟中,如果需要進行sql查詢,需要先把資料從磁碟載入到記憶體中。當在資料特別大的時候,如果執行的sql語句沒有索引,就會造成掃描表的行數過大導致I/O阻塞,或者是語句中存在死鎖,也會造成I/O阻塞,從而導致不可中斷睡眠程式過多,導致負載過大。具體解決方法可以在MySQL中執行show full processlist命令檢視執行緒等待情況,把其中的語句拿出來進行最佳化。

場景三:外接硬碟故障,常見有掛了NFS,但是NFS server故障

比如我們的系統掛載了外接硬碟如NFS共享儲存,經常會有大量的讀寫請求去訪問NFS儲存的檔案,如果這個時候NFS Server故障,那麼就會導致程式讀寫請求一直獲取不到資源,從而程式一直是不可中斷狀態,造成負載很高。

處理辦法

  • load average 是對 CPU 負載的評估,其值越高,說明其任務佇列越長,處於等待執行的任務越多。
  • 出現此種情況時,可能是由於僵死程式導致的。 可以透過指令ps -axjf檢視是否存在 D 狀態程式。
  • D 狀態是指不可中斷的睡眠狀態。 該狀態的程式無法被 kill,也無法自行退出。只能透過恢復其依賴的資源或者重啟系統來解決。
等待 I/O 的程式透過處於 uninterruptible sleep 或 D 狀態;透過給出這些資訊我們就可以簡單的查詢出處在wait狀態的程式。

    ps -e -L h o state,cmd  | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr

    作者:Honest1y
    來源:


    來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70013542/viewspace-2922476/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章