主要方便排查系統(tǒng)問題,了解性能優(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使用率問題時(shí),需要區(qū)分用戶CPU、系統(tǒng)CPU、等待I/O CPU、軟中斷和硬中斷等,用戶 CPU過高一般是進(jìn)程性能問題,系統(tǒng)CPU過高一般是系統(tǒng)調(diào)用的性能問題,IO等待的CPU過高一般是網(wǎng)絡(luò)/磁盤IO問題,中斷占用CPU過高可能是中斷服務(wù)程序問題。
平均負(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ù)載是否超過CPU核數(shù)。
看上下文切換是否過多。
看CPU緩存命中率。
看進(jìn)程狀態(tài),如running狀態(tài)、sleep狀態(tài)。
CPU使用率與負(fù)載的區(qū)別
CPU使用率,是單位時(shí)間內(nèi)CPU使用情況的統(tǒng)計(jì),跟平均負(fù)載并不一定完全對應(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高說明可能存在繞過緩存直接讀文件,網(wǎng)絡(luò)IO高說明可能出現(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ù);然后通過pidstat ,觀察進(jìn)程的自愿上下文切換和非自愿上下文切換情況;通過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)程長期處于不可中斷狀態(tài)(表示IO負(fù)載過高)。
top觀察tasks有多少個(gè)running狀態(tài)任務(wù),然后查看任務(wù)列表里具體處于R狀態(tài)和S狀態(tài)的任務(wù)。如果某個(gè)進(jìn)程PID一直在變,說明可能某個(gè)應(yīng)用程序一直在重啟。這種短時(shí)進(jìn)程需要使用pstree找到父進(jìn)程,然后查看父進(jìn)程是否正確處理,比如注冊SIGCHLD信號和調(diào)用waitpid接口。對于短時(shí)進(jìn)程,如果top/pidstat抓取不到CPU占用率過高的現(xiàn)場,可以通過 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來追蹤。
pidstat使用-w參數(shù)可以查看進(jìn)程切換情況,結(jié)合/proc/interrupts文件可以查看具體硬中斷情況。
使用shell命令排查問題時(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高,說明可能進(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對內(nèi)存回收也有影響,默認(rèn)多個(gè)node共享剩余內(nèi)存分配。
通用內(nèi)存問題分析思路:
先用free和top命令,查看系統(tǒng)整體的內(nèi)存使用情況;
再用vmstat和pidstat,查看一段時(shí)間的趨勢,從而判斷出內(nèi)存問題的類型。
最后進(jìn)行針對性分析,比如內(nèi)存分配分析、緩存/緩沖區(qū)分析、具體進(jìn)程的內(nèi)存使用分析pmap等。
OOM監(jiān)控問題
如果監(jiān)控大盤顯示內(nèi)存水位低卻發(fā)生了OOM,大概率是監(jiān)控頻率太低,因?yàn)槿绻麅?nèi)存在短時(shí)間內(nèi)暴漲,秒級尖刺體現(xiàn)到分鐘級監(jiān)控上很可能被平均值抹平。
軟中斷
/proc/softirqs文件可以查看具體軟中斷情況,使用watch可以實(shí)時(shí)查看軟中斷數(shù)據(jù)包處理情況:watch -d cat /proc/softirqs
sar -n可以用來查看指定的網(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的對比可以判斷是否有大量小包,比如可以確認(rèn)是否有網(wǎng)絡(luò)攻擊。tcpdump查看哪些端口在進(jìn)行監(jiān)聽,