加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

Linux系統(tǒng)性能問(wèn)題排查思路(面試必備)

11/11 12:20
1062
閱讀需 9 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

主要方便排查系統(tǒng)問(wèn)題,了解性能優(yōu)化的思路和方法,掌握常用的linux性能工具。

CPU

常用的分析CPU使用情況的工具包括top、ps和pidstat,特點(diǎn)為:

    • top顯示系統(tǒng)總體的CPU和內(nèi)存使用情況,以及各個(gè)進(jìn)程的資源使用情況。
    • ps顯示每個(gè)進(jìn)程的運(yùn)行和資源使用情況。
    • pidstat分析每個(gè)進(jìn)程 CPU 使用情況。

排查CPU使用率問(wèn)題時(shí),需要區(qū)分用戶CPU、系統(tǒng)CPU、等待I/O CPU、軟中斷和硬中斷等,用戶 CPU過(guò)高一般是進(jìn)程性能問(wèn)題,系統(tǒng)CPU過(guò)高一般是系統(tǒng)調(diào)用的性能問(wèn)題,IO等待的CPU過(guò)高一般是網(wǎng)絡(luò)/磁盤IO問(wèn)題,中斷占用CPU過(guò)高可能是中斷服務(wù)程序問(wèn)題。

平均負(fù)載

uptime或者top可以查看系統(tǒng)平均負(fù)載,平均負(fù)載指當(dāng)前平均活躍進(jìn)程數(shù)。

$ uptime

9:12 up 22:16, 2 users, load averages: 1.38 1.47 1.57

負(fù)載分析流程

首先使用top查看平均負(fù)載,然后查看服務(wù)器有幾個(gè)CPU:

grep 'model name' /proc/cpuinfo | wc -l

一般可以在zabbix監(jiān)控上配置平均負(fù)載高于CPU數(shù)量80%時(shí)告警。

看平均負(fù)載是否超過(guò)CPU核數(shù)。

看上下文切換是否過(guò)多。

看CPU緩存命中率。

看進(jìn)程狀態(tài),如running狀態(tài)、sleep狀態(tài)。

CPU使用率與負(fù)載的區(qū)別

CPU使用率,是單位時(shí)間內(nèi)CPU使用情況的統(tǒng)計(jì),跟平均負(fù)載并不一定完全對(duì)應(yīng)。比如:

CPU密集型進(jìn)程,使用大量CPU會(huì)導(dǎo)致平均負(fù)載升高,或者大量等待CPU的進(jìn)程調(diào)度也會(huì)導(dǎo)致平均負(fù)載升高,此時(shí)這兩者是一致的;

I/O密集型進(jìn)程,等待I/O也會(huì)導(dǎo)致平均負(fù)載升高,但CPU使用率不一定很高;

iowait分析點(diǎn)

Top中iowait很高,但是用戶cpu和系統(tǒng)cpu占用率很低,詳情中每個(gè)進(jìn)程的cpu占用率也很低,這種一般是存在IO密集型進(jìn)程,使用pidstat -d看看進(jìn)程磁盤IO讀寫情況,sar -n查看網(wǎng)絡(luò)IO讀寫情況,磁盤IO高說(shuō)明可能存在繞過(guò)緩存直接讀文件,網(wǎng)絡(luò)IO高說(shuō)明可能出現(xiàn)網(wǎng)卡接收發(fā)送隊(duì)列阻塞,或者SYN攻擊之類。

CPU使用率分析流程

用top/uptime,查看系統(tǒng)的平均負(fù)載;在平均負(fù)載升高后,用mpstat和pidstat ,觀察每個(gè)每個(gè)進(jìn)程的CPU使用情況和iowait,進(jìn)而找出導(dǎo)致平均負(fù)載升高的進(jìn)程。

用vmstat,查看系統(tǒng)的上下文切換次數(shù)和中斷次數(shù);然后通過(guò)pidstat ,觀察進(jìn)程的自愿上下文切換和非自愿上下文切換情況;通過(guò)pidstat ,觀察線程的上下文切換情況,找到上下文切換次數(shù)增多的進(jìn)程。

用top,查看系統(tǒng)和進(jìn)程的CPU使用情況,再用perf top,實(shí)時(shí)觀察占用CPU資源最多的函數(shù)。top除了看平均負(fù)載變化情況、僵尸進(jìn)程數(shù)量、iowait情況、CPU占用率,還可以查看是否有進(jìn)程長(zhǎng)期處于不可中斷狀態(tài)(表示IO負(fù)載過(guò)高)。

top觀察tasks有多少個(gè)running狀態(tài)任務(wù),然后查看任務(wù)列表里具體處于R狀態(tài)和S狀態(tài)的任務(wù)。如果某個(gè)進(jìn)程PID一直在變,說(shuō)明可能某個(gè)應(yīng)用程序一直在重啟。這種短時(shí)進(jìn)程需要使用pstree找到父進(jìn)程,然后查看父進(jìn)程是否正確處理,比如注冊(cè)SIGCHLD信號(hào)和調(diào)用waitpid接口。對(duì)于短時(shí)進(jìn)程,如果top/pidstat抓取不到CPU占用率過(guò)高的現(xiàn)場(chǎng),可以通過(guò) perf record和perf report進(jìn)行采集。

短時(shí)進(jìn)程存在的原因,可能是某個(gè)應(yīng)用程序因?yàn)槭裁丛虿煌V貑?,或者某個(gè)應(yīng)用不停在創(chuàng)建新進(jìn)程并銷毀,這種情況需要查看其父進(jìn)程的行為。pstree可以獲取進(jìn)程父子關(guān)系。一般進(jìn)程不停重啟的原因可能是端口被占用,或者讀寫某個(gè)文件/目錄缺乏權(quán)限。另外ptree展開進(jìn)程樹,可以發(fā)現(xiàn)僵尸進(jìn)程。

strace -p pid可以查看指定進(jìn)程的系統(tǒng)調(diào)用,如果strace失敗,可能是進(jìn)程狀態(tài)異常,也可能是某些行為是父進(jìn)程/子進(jìn)程造成的,可以使用-f來(lái)追蹤。

pidstat使用-w參數(shù)可以查看進(jìn)程切換情況,結(jié)合/proc/interrupts文件可以查看具體硬中斷情況。

使用shell命令排查問(wèn)題時(shí),echo $?可以打印上一條命令的返回值是否為0,從而確認(rèn)命令是否執(zhí)行成功。

內(nèi)存

free查看系統(tǒng)內(nèi)存情況,top、ps查看進(jìn)程內(nèi)存使用情況。

vmstat可以觀察內(nèi)存變化情況,包括free、buffer、cache,另外sar也可以觀察內(nèi)存變化情況。

觀察top,cpu使用率低,而iowait高,說(shuō)明可能進(jìn)程IO密集型,這時(shí)候使用iostat看一看磁盤IO,pidstat -d和iotop觀察進(jìn)程IO情況,使用strace觀察系統(tǒng)調(diào)用情況,lsof觀察進(jìn)程打開的端口、文件等:lsof -p PID;

另外,緩沖和延遲寫也可能導(dǎo)致捕捉不到write系統(tǒng)調(diào)用,但可能存在大量的數(shù)據(jù)在緩沖區(qū)中等待寫入。

numa對(duì)內(nèi)存回收也有影響,默認(rèn)多個(gè)node共享剩余內(nèi)存分配。

通用內(nèi)存問(wèn)題分析思路:

先用free和top命令,查看系統(tǒng)整體的內(nèi)存使用情況;

再用vmstat和pidstat,查看一段時(shí)間的趨勢(shì),從而判斷出內(nèi)存問(wèn)題的類型。

最后進(jìn)行針對(duì)性分析,比如內(nèi)存分配分析、緩存/緩沖區(qū)分析、具體進(jìn)程的內(nèi)存使用分析pmap等。

OOM監(jiān)控問(wèn)題

如果監(jiān)控大盤顯示內(nèi)存水位低卻發(fā)生了OOM,大概率是監(jiān)控頻率太低,因?yàn)槿绻麅?nèi)存在短時(shí)間內(nèi)暴漲,秒級(jí)尖刺體現(xiàn)到分鐘級(jí)監(jiān)控上很可能被平均值抹平。

軟中斷

/proc/softirqs文件可以查看具體軟中斷情況,使用watch可以實(shí)時(shí)查看軟中斷數(shù)據(jù)包處理情況:watch -d cat /proc/softirqs

sar -n可以用來(lái)查看指定的網(wǎng)卡網(wǎng)絡(luò)數(shù)據(jù)包收發(fā)情況,不僅可以觀察網(wǎng)絡(luò)收發(fā)的吞吐量BPS(每秒收發(fā)的字節(jié)數(shù)),還可以查看網(wǎng)絡(luò)收發(fā)的PPS(每秒收發(fā)的網(wǎng)絡(luò)幀數(shù))。

根據(jù)rxpck和rxkB的對(duì)比可以判斷是否有大量小包,比如可以確認(rèn)是否有網(wǎng)絡(luò)攻擊。tcpdump查看哪些端口在進(jìn)行監(jiān)聽(tīng),

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

機(jī)械轉(zhuǎn)行IT狗,目前在阿里巴巴淘寶事業(yè)群。日常記錄Linux應(yīng)用開發(fā)、嵌入式操作系統(tǒng)、無(wú)線網(wǎng)絡(luò)協(xié)議棧。剛深入使用Java,跟大家一起入門交流。