加入星計劃,您可以享受以下權益:

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

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

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

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

CPU

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

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

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

平均負載

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

$ uptime

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

負載分析流程

首先使用top查看平均負載,然后查看服務器有幾個CPU:

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

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

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

看上下文切換是否過多。

看CPU緩存命中率。

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

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

CPU使用率,是單位時間內CPU使用情況的統(tǒng)計,跟平均負載并不一定完全對應。比如:

CPU密集型進程,使用大量CPU會導致平均負載升高,或者大量等待CPU的進程調度也會導致平均負載升高,此時這兩者是一致的;

I/O密集型進程,等待I/O也會導致平均負載升高,但CPU使用率不一定很高;

iowait分析點

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

CPU使用率分析流程

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

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

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

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

短時進程存在的原因,可能是某個應用程序因為什么原因不停重啟,或者某個應用不停在創(chuàng)建新進程并銷毀,這種情況需要查看其父進程的行為。pstree可以獲取進程父子關系。一般進程不停重啟的原因可能是端口被占用,或者讀寫某個文件/目錄缺乏權限。另外ptree展開進程樹,可以發(fā)現(xiàn)僵尸進程。

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

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

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

內存

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

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

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

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

numa對內存回收也有影響,默認多個node共享剩余內存分配。

通用內存問題分析思路:

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

再用vmstat和pidstat,查看一段時間的趨勢,從而判斷出內存問題的類型。

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

OOM監(jiān)控問題

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

軟中斷

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

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

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

相關推薦

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

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