本文主要介紹當Linux系統ECS執行個體CPU使用率或CPU負載較高時,如何排查分析及常見案例說明。
操作環境
在您使用ECS執行個體過程中,可能會遇到執行個體CPU使用率或CPU負載持續較高的情況,您可以按照以下步驟排查定位具體問題。
找到影響CPU使用率或CPU負載過高的具體進程。
排查影響CPU使用率或CPU負載過高的進程是否正常,並分類進行處理。
對於正常進程:您需要對程式進行最佳化或者升配執行個體規格。具體操作,請參見訂用帳戶執行個體升配規格或隨用隨付執行個體變更配置規格。
對於異常進程:您可以手動對進程進行查殺,也可以使用第三方安全工具去查殺。
CPU負載的查詢分析
在Linux系統中,查看進程的常用命令如下所示。本文主要介紹vmstat和top常用命令的使用。
vmstat
top
ps -aux
ps -ef
vmstat命令的使用
vmstat(VirtualMemoryStatistics,虛擬記憶體統計),通過vmstat命令,從系統維度查看作業系統的虛擬記憶體、進程、CPU等的整體情況。
vmstat命令
常用vmstat命令如下所示。
vmstat [-n] [delay [count]]
[-n]:只在開始時顯示一次各欄位名稱。
[delay]:重新整理時間間隔。如果不指定,只顯示一條結果。
[count]:重新整理次數。如果不指定重新整理次數,但指定了重新整理時間間隔,這時重新整理次數為無窮。
使用樣本
執行如下命令,使用vmstat每1秒統計一次各進程的CPU使用方式,連續統計4次。
vmstat -n 1 4
返回樣本類似如下。
procs -----------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 2684984 310452 2364304 0 0 5 17 19 35 4 2 94 0 0
0 0 0 2687504 310452 2362268 0 0 0 252 1942 4326 5 2 93 0 0
0 0 0 2687356 310460 2362252 0 0 0 68 1891 4449 3 2 95 0 0
0 0 0 2687252 310460 2362256 0 0 0 0 1906 4616 4 1 95 0 0
顯示結果主要欄位說明
r:表示系統中CPU等待處理的線程。一個CPU每次只能處理一個線程,所以該數值越大,通常表示系統運行越慢。
us:使用者模式消耗的CPU時間百分比。該值較高時,說明使用者進程消耗的CPU時間比較多。如果該值長期超過50%,則需要對程式演算法或代碼等進行最佳化。
sy:核心模式消耗的CPU時間百分比。
wa:I/O等待消耗的CPU時間百分比。該值較高時,說明IO等待比較嚴重,這可能是磁碟大量作隨機訪問造成的,也可能是磁碟效能出現了瓶頸。
id:處於空閑狀態的CPU時間百分比。如果該值持續為0,同時sy是us的兩倍,則通常說明系統面臨CPU資源短缺。
top命令的使用
top命令是Linux系統中常用的效能分析工具,可以即時顯示系統中各進程的資源佔用情況。
top命令
top [-n] [-d]
[-n]:重新整理次數。如果不指定重新整理次數,但指定了重新整理時間間隔,這時重新整理次數為無窮。
[-d] :重新整理時間間隔。
使用樣本
遠端連線Linux系統的ECS執行個體。
具體操作,請參見串連方式概述。
執行如下命令,查看系統中各進程的資源佔用情況。
如下命令表示:每2秒統計一次各進程相關資訊,統計5次後停止。
top -n 5 -d 2
系統顯示類似如下。
top - 17:27:13 up 27 days, 3:13, 1 user, load average: 0.02, 0.03, 0.05 Tasks: 94 total, 1 running, 93 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.3 us, 0.1 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.1 st KiB Mem: 1016656 total, 946628 used, 70028 free, 169536 buffers KiB Swap: 0 total, 0 used, 0 free. 448644 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 41412 3824 2308 S 0.0 0.4 0:19.01 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd
顯示結果主要欄位說明
針對CPU使用率和CPU負載問題,您只需關注回顯的第一行和第三行資訊,詳細說明如下。
第一行:顯示的內容
17:27:13 up 27 days, 3:13, 1 user, load average: 0.02, 0.03, 0.05
,依次為系統目前時間、系統到目前為止已啟動並執行時間、當前登入系統的使用者數量、系統負載。第三行:顯示當前CPU資源的總體使用方式,下方會顯示各個進程的資源佔用情況。
在top命令執行過程中,可以使用一些互動命令。
通過P鍵,可以對CPU使用率進行倒序排列,方便定位系統中佔用CPU較高的進程。
通過M鍵,您可以對系統記憶體使用量情況進行排序。如果有多核CPU,數字鍵1可以顯示每核CPU的負載狀況。
執行
ll /proc/PID/exe
命令,可以查看每個進程ID對應的程式檔案。終止CPU消耗較大的進程。
先寫入小寫字母k。
輸入想要終止的進程PID,按Enter鍵。
預設為輸出結果的第一個PID,如下圖所示,假如想要終止PID為23的進程,輸入23後按Enter鍵。
操作成功後,介面會出現類似
Send pid 23 signal [15/sigterm]
的提示資訊,按Enter鍵確認即可。
常見CPU資源過高案例分析
案例一:CPU使用率較低但負載較高
問題現象
當前Linux系統沒有業務程式運行。通過top命令觀察,發現CPU使用率不高,但是CPU負載(load average)卻非常高,如下圖所示。
問題原因
該問題可能是因為殭屍(zombie)進程過多導致。
load average是對CPU負載進行評估的,其值越高說明其任務隊列越長,處於等待執行的任務越多。
解決方案
您可以通過ps -axjf
命令查看是否存在D+狀態進程,該狀態是指不可中斷的睡眠狀態。
處於該狀態的進程無法終止,也無法自行退出,只能通過恢複其依賴的資源或者重啟系統來解決。
案例二:kswapd0進程佔用CPU較高
問題現象
ECS執行個體運行卡頓,使用top
命令查看,kswapd0進程佔用了99% CPU。
問題原因
出現該問題可能是系統此時在持續進行換頁操作,導致佔用大量CPU資源。
kswapd0是虛擬記憶體管理中負責換頁的進程,當ECS執行個體實體記憶體不足時,kswapd0會執行換頁操作,換頁操作會消耗大量的CPU資源。
解決方案
您可以通過修改vm.swappiness核心參數來控制交換空間的大小,來解決kswapd0進程佔用CPU較高的問題。
登入Linux執行個體。
具體操作,請參見串連方式概述。
查看swappiness參數。
cat /proc/sys/vm/swappiness
系統顯示類似如下,表示當實體記憶體低於60%(100-40)時使用swap空間。
說明swappiness參數越低,表示Linux系統盡量少用swap分區,多用實體記憶體;swappiness參數值越高,表示使核心更多地去使用swap空間。
根據業務需要,修改swappiness參數。
開啟核心參數設定檔sysctl.conf。
vi /etc/sysctl.conf
根據業務需要,修改swappiness參數值。
如在sysctl.conf檔案中,修改
vm.swappiness = 10
。按
Esc
鍵,輸入:wq
儲存修改。重新載入sysctl設定檔,使配置生效。
sysctl -p
若該問題還未解決,建議您升配執行個體規格。具體操作,請參見訂用帳戶執行個體升配規格或隨用隨付執行個體變更配置規格。
案例三:CPU使用率過高100%問題排查
問題現象
使用ECS執行個體的過程中,如果遇到CPU使用率高達100%等異常情況,且無法通過top、htop等命令查詢到消耗CPU資源的具體進程。
問題原因
該問題可能是病毒導致。
解決方案
查看CloudMonitor監控資料。
在左側導覽列,單擊主機監控。
找到異常主機,單擊操作列的監控圖表。
在作業系統監控頁簽下,查看該主機的CPU使用率並記錄具體時間點。
查看Linux執行個體的命令修改記錄。
登入Linux執行個體。
具體操作,請參見串連方式概述。
執行如下命令,查看當前Linux系統命令最近是否被修改過。
stat /usr/bin/top
系統顯示類似如下,系統命令有被修改。查看更改時間是否和CloudMonitor中CPU使用率出現100%的時間點吻合。
分別執行如下命令,查看
ps
或top
命令是否被修改過。rpm -Vf /bin/ps rpm -Vf /usr/bin/top
正常情況下,系統無返回修改資訊。
系統異常情況下,顯示類似如下,表示
ps
和top
命令被修改過。
執行如下命令,查看當前執行個體是否串連到異常網域名稱。
iftop -i [$Device] -n -P
說明[$Device]請替換為當前系統使用的網卡,如eth0。
系統顯示類似如下,若您沒有串連過crypto-pool.fr,則crypto-pool.fr是異常網域名稱。
綜合以上表現,top、ps命令被修改,並且串連到異常網域名稱,判斷您的ECS執行個體已被破壞入侵,可以參考以下方案。
備份ECS執行個體資料,具體操作,請參見建立一個雲端硬碟快照。
重新初始化系統硬碟,然後使用Security Center對ECS執行個體進行安全強化。更多資訊,請參見重新初始化系統硬碟和什麼是Security Center。