Linux CPU 占用率高的解決方案
Linux 系統(tǒng)下,您可以按如下步驟進(jìn)行排查:
1、定位問(wèn)題。找到影響帶寬和 CPU 跑滿或跑高的具體進(jìn)程。
2、分析處理。排查影響帶寬和 CPU 跑滿或跑高的進(jìn)程是否正常,并分類進(jìn)行處理
3、對(duì)于 正常進(jìn)程:您需要對(duì)程序進(jìn)行優(yōu)化或者升級(jí)服務(wù)器配置。
4、對(duì)于 異常進(jìn)程:您可以手動(dòng)對(duì)進(jìn)程進(jìn)行查殺,也可以使用第三方安全工具去查殺。
如果云服務(wù)器 Linux 系統(tǒng)的 CPU 持續(xù)跑高,則會(huì)對(duì)系統(tǒng)穩(wěn)定性和業(yè)務(wù)運(yùn)行造成影響。本文對(duì) CPU 占用率較高問(wèn)題的排查分析做簡(jiǎn)要說(shuō)明。
CPU 跑滿或跑高的問(wèn)題定位
若云服務(wù)器的 CPU 持續(xù)跑高,會(huì)對(duì)系統(tǒng)的穩(wěn)定性和業(yè)務(wù)運(yùn)行造成影響。Linux 系統(tǒng)下,查看進(jìn)程的常用命令如下:
ps -aux
ps -ef
top
Linux 系統(tǒng)中,通常使用 top 命令來(lái)查看系統(tǒng)的負(fù)載問(wèn)題,并定位耗用較多 CPU 資源的進(jìn)程。
說(shuō)明:資源負(fù)載異常時(shí),通常無(wú)法通過(guò) SSH 進(jìn)行遠(yuǎn)程連接,建議您通過(guò)控制臺(tái)管理終端進(jìn)行連接。
通過(guò) top 命令查看系統(tǒng)當(dāng)前的運(yùn)行情況。
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
針對(duì)負(fù)載問(wèn)題,您只需關(guān)注回顯的第一行和第三行信息,詳細(xì)說(shuō)明如下。
top 命令的第一行顯示的內(nèi)容 17:27:13 up 27 days, 3:13, 1 user, load average: 0.02, 0.03, 0.05 依次為 系統(tǒng)當(dāng)前時(shí)間 、系統(tǒng)到目前為止已運(yùn)行的時(shí)間、當(dāng)前登錄系統(tǒng)的用戶數(shù)量、系統(tǒng)負(fù)載,這與直接執(zhí)行 uptime 命令查詢結(jié)果一致。
top 命令的第三行會(huì)顯示當(dāng)前 CPU 資源的總體使用情況,下方會(huì)顯示各個(gè)進(jìn)程的資源占用情況。
通過(guò)字母鍵 P,可以對(duì) CPU 使用率進(jìn)行倒序排列,進(jìn)而定位系統(tǒng)中占用 CPU 較高的進(jìn)程。
說(shuō)明:通過(guò)字母鍵 M, 您可以對(duì)系統(tǒng)內(nèi)存使用情況進(jìn)行排序。如果有多核 CPU,數(shù)字鍵 1 可以顯示每核 CPU 的負(fù)載狀況。
通過(guò) ll /proc/PID/exe 可以查看每個(gè)進(jìn)程 ID 對(duì)應(yīng)的程序文件。
CPU 跑滿或跑高的分析處理
CPU 的跑滿或跑高,在確認(rèn)具體的進(jìn)程結(jié)果后,針對(duì)異常的進(jìn)程,您需要通過(guò) top 命令將其終止;而對(duì)于 kswapd0 進(jìn)程導(dǎo)致的內(nèi)存不足等問(wèn)題,您需要對(duì)系統(tǒng)進(jìn)行規(guī)格的升級(jí)或程序的優(yōu)化。
使用 top 直接終止 CPU 消耗較大的進(jìn)程
您可以直接在 top 運(yùn)行界面快速終止相應(yīng)的異常進(jìn)程。操作步驟如下:
若您想要終止某個(gè)進(jìn)程,只需按下小寫的 k 鍵。
輸入想要終止的進(jìn)程 PID (top 輸出結(jié)果的第一列)。例如,若您想要終止 PID 為 86 的進(jìn)程,輸入 86 后按回車即可。
操作成功后,界面會(huì)出現(xiàn)類似 Send pid 86 signal [15/sigterm] 的提示信息。按回車確認(rèn)即可。
kswapd0 進(jìn)程占用導(dǎo)致 CPU 較高
操作系統(tǒng)都用分頁(yè)機(jī)制來(lái)管理物理內(nèi)存,系統(tǒng)會(huì)把一部分硬盤空間虛擬成內(nèi)存使用。由于內(nèi)存的速度要比磁盤快得多,所以系統(tǒng)要按照某種換頁(yè)機(jī)制將不需要的頁(yè)面換到磁盤中,將需要的頁(yè)面調(diào)到內(nèi)存中。
kswapd0 是虛擬內(nèi)存管理中負(fù)責(zé)換頁(yè)的進(jìn)程,當(dāng)服務(wù)器內(nèi)存不足的時(shí)候 kswapd0 會(huì)執(zhí)行換頁(yè)操作,這個(gè)換頁(yè)操作是十分消耗主機(jī) CPU 資源的。操作步驟如下:
通過(guò) top 命令查看 kswapd0 進(jìn)程。
檢查該進(jìn)程是否持續(xù)處于非睡眠狀態(tài),且運(yùn)行時(shí)間較長(zhǎng)。若是,可以初步判定系統(tǒng)在持續(xù)地進(jìn)行換頁(yè)操作,kswapd0 進(jìn)程占用了系統(tǒng)大量 CPU 資源。
您可以通過(guò) free 、ps 等指令進(jìn)一步查詢系統(tǒng)及系統(tǒng)內(nèi)進(jìn)程的內(nèi)存占用情況,做進(jìn)一步排查分析。
針對(duì)系統(tǒng)當(dāng)前內(nèi)存不足的問(wèn)題,您可以重啟 Apache,釋放內(nèi)存。
說(shuō)明:從長(zhǎng)遠(yuǎn)的角度來(lái)看,您需要對(duì)內(nèi)存進(jìn)行升級(jí)。
帶寬跑滿或跑高的分析處理
對(duì)于正常進(jìn)程導(dǎo)致的帶寬跑滿或跑高的問(wèn)題,需要對(duì)服務(wù)器的帶寬進(jìn)行升級(jí)。對(duì)于異常進(jìn)程,有可能是由于惡意程序問(wèn)題,或者是部分 IP 惡意訪問(wèn)導(dǎo)致,也可能是服務(wù)遭到了 CC 攻擊。
通常情況下,您可以使用 iftop 工具或 nethogs 查看流量的占用情況,進(jìn)而定位到具體的進(jìn)程。
使用 iftop 工具排查
在服務(wù)器內(nèi)部安裝 iftop 流量監(jiān)控工具。
yum install iftop -y
服務(wù)器外網(wǎng)帶寬被占滿時(shí),如果通過(guò)遠(yuǎn)程無(wú)法登陸,可進(jìn)入到服務(wù)器內(nèi)部,運(yùn)行下面命令查看流量占用情況:
iftop -i eth1 -P
注意:-P 參數(shù)將會(huì)顯示請(qǐng)求端口。執(zhí)行 iftop -i eth0 -P 命令,可以查看通過(guò)服務(wù)器哪個(gè)端口建立的連接,以及內(nèi)網(wǎng)流量。舉例如下:
在上圖中,您可以查看到流量高耗的是服務(wù)器上 53139 端口和 115.205.150.235 地址建立的連接。
執(zhí)行 netstat 命令反查 53139 端口對(duì)應(yīng)的進(jìn)程。
netstat -tunlp |grep 53139
經(jīng)反查,服務(wù)器上 vsftpd 服務(wù)產(chǎn)生大量流量,您可以通過(guò)停止服務(wù)或使用 iptables 服務(wù)來(lái)對(duì)指定地址進(jìn)行處理,如屏蔽 IP 地址或限速,以保證服務(wù)器帶寬能夠正常使用。
使用 nethogs 進(jìn)行排查
在服務(wù)器內(nèi)部安裝 nethogs 流量監(jiān)控工具。
yum install nethogs -y
通過(guò) nethogs 工具來(lái)查看網(wǎng)卡上進(jìn)程級(jí)的流量信息,若未安裝可以通過(guò) yum、apt-get 等方式安裝。舉例如下:
若 eth1 網(wǎng)卡跑滿,執(zhí)行命令 nethogs eth1。
查看每個(gè)進(jìn)程的網(wǎng)絡(luò)帶寬情況以及進(jìn)程對(duì)應(yīng)的 PID。
確定導(dǎo)致帶寬跑滿或跑高的具體進(jìn)程。
若進(jìn)程確定是惡意程序,可以通過(guò)執(zhí)行 kill -TERM 來(lái)終止程序。
說(shuō)明: 如果是 Web 服務(wù)程序,您可以使用 iftop 等工具來(lái)查詢具體 IP 來(lái)源,然后分析 Web 訪問(wèn)日志是否為正常流量。日志分析可以使用 logwatch 或 awstats 等工具進(jìn)行。