主要方便排查系統(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)聽,