系統(tǒng)的load是指正在運(yùn)行running one和準(zhǔn)備好運(yùn)行runnable one的進(jìn)程的總數(shù)沦补。比如現(xiàn)在系統(tǒng)有2個(gè)正在運(yùn)行的進(jìn)程乳蓄,3個(gè)可運(yùn)行進(jìn)程,那么系統(tǒng)的load就是5夕膀。load average就是一定時(shí)間內(nèi)的load數(shù)量虚倒。
load average顯示的是最近1分鐘、5分鐘和15分鐘的系統(tǒng)平均負(fù)載产舞。系統(tǒng)平均負(fù)載表示系統(tǒng)平均負(fù)載被定義為在特定時(shí)間間隔內(nèi)運(yùn)行隊(duì)列中(在CPU上運(yùn)行或者等待運(yùn)行多少進(jìn)程)的平均進(jìn)程數(shù)裹刮。
下面來(lái)看看描述 CPU 的性能指標(biāo):
- CPU 使用率:CPU 使用率描述了非空閑時(shí)間占總 CPU 時(shí)間的百分比,根據(jù) CPU 上運(yùn)行任務(wù)的不同庞瘸,又被分為用戶 CPU捧弃、系統(tǒng) CPU、等待 I/O CPU擦囊、軟中斷和硬中斷等违霞。
- 平均負(fù)載(Load Average):是系統(tǒng)的平均活躍進(jìn)程數(shù)。它反應(yīng)了系統(tǒng)的整體負(fù)載情況瞬场,主要包括三個(gè)數(shù)值买鸽,分別指過(guò)去 1 分鐘、過(guò)去 5 分鐘和過(guò)去 15 分鐘的平均負(fù)載贯被。理想情況下眼五,平均負(fù)載等于邏輯 CPU 個(gè)數(shù),這表示每個(gè) CPU 都恰好被充分利用彤灶。如果平均負(fù)載大于邏輯 CPU 個(gè)數(shù)看幼,就表示負(fù)載比較重了。
- 進(jìn)程上下文切換:包括:無(wú)法獲取資源而導(dǎo)致的自愿上下文切換幌陕;被系統(tǒng)強(qiáng)制調(diào)度導(dǎo)致的非自愿上下文切換诵姜。
-
CPU 緩存的命中率:CPU 在訪問(wèn)內(nèi)存的時(shí)候,免不了要等待內(nèi)存的響應(yīng)搏熄。為了協(xié)調(diào)這兩者巨大的性能差距棚唆,CPU 緩存(通常是多級(jí)緩存)就出現(xiàn)了暇赤。
image.png
性能指標(biāo)和性能工具結(jié)合使用
思路:
使用top命令查看,如top 發(fā)現(xiàn)了軟中斷 CPU 使用率高后宵凌,下一步自然就想知道具體的軟中斷類型鞋囊。那在哪里可以觀察各類軟中斷的運(yùn)行情況呢?當(dāng)然是 proc 文件系統(tǒng)中的 /proc/softirqs 這個(gè)文件瞎惫。
注:從上圖中看到軟中斷包括了 10 個(gè)類別失暴,分別對(duì)應(yīng)不同的工作類型。比如 NET_RX 表示網(wǎng)絡(luò)接收中斷微饥,NET_TX 表示網(wǎng)絡(luò)發(fā)送中斷逗扒, BLOCK表示鎖三痰,TASKLET表示定時(shí)吁伺;SCHED表示調(diào)度等,可以通過(guò)查看 /proc/softirqs 來(lái)觀察軟中斷的運(yùn)行情況愧捕。
軟中斷高的舉例:
top發(fā)現(xiàn)軟中斷si很高
vmstat 確認(rèn)中斷很高
watch cat proc/softirqs 查看那個(gè)軟中斷變化最快肃续,發(fā)現(xiàn)是網(wǎng)絡(luò)接受最多
sar 查看哪個(gè)網(wǎng)口接受數(shù)據(jù)包最多
tcpdump 抓包80端口黍檩,發(fā)現(xiàn)全是S(sync)包
確定是SYN FLOOD
CPU 性能指標(biāo)的工具:
工具指標(biāo)”指南使用"
!
top、vmstat 和 pidstat 命令詳解
這三個(gè)命令始锚,幾乎包含了所有重要的 CPU 性能指標(biāo)刽酱,比如:
從 top 的輸出可以得到各種 CPU 使用率以及僵尸進(jìn)程和平均負(fù)載等信息。
從 vmstat 的輸出可以得到上下文切換次數(shù)瞧捌、中斷次數(shù)棵里、運(yùn)行狀態(tài)和不可中斷狀態(tài)的進(jìn)程數(shù)。
從 pidstat 的輸出可以得到進(jìn)程的用戶 CPU 使用率姐呐、系統(tǒng) CPU 使用率殿怜、以及自愿上下文切換和非自愿上下文切換情況。
例子1:pidstat 輸出的進(jìn)程用戶 CPU 使用率升高曙砂,會(huì)導(dǎo)致 top 輸出的用戶 CPU 使用率升高头谜。所以,當(dāng)發(fā)現(xiàn) top 輸出的用戶 CPU 使用率有問(wèn)題時(shí)鸠澈,可以跟 pidstat 的輸出做對(duì)比柱告,觀察是否是某個(gè)進(jìn)程導(dǎo)致的問(wèn)題。而找出導(dǎo)致性能問(wèn)題的進(jìn)程后笑陈,就要用進(jìn)程分析工具來(lái)分析進(jìn)程的行為际度,比如使用 strace 分析系統(tǒng)調(diào)用情況,以及使用 perf 分析調(diào)用鏈中各級(jí)函數(shù)的執(zhí)行情況新锈。
例子2:
top 輸出的平均負(fù)載升高甲脏,可以跟 vmstat 輸出的運(yùn)行狀態(tài)和不可中斷狀態(tài)的進(jìn)程數(shù)做對(duì)比眶熬,觀察是哪種進(jìn)程導(dǎo)致的負(fù)載升高妹笆。
如果是不可中斷進(jìn)程數(shù)增多了块请,那么就需要作 I/O 的分析,也就是用 dstat 或 sar 等工具拳缠,進(jìn)一步分析 I/O 的情況墩新。
如果是運(yùn)行狀態(tài)進(jìn)程數(shù)增多了,那就需要回到 top 和 pidstat窟坐,找出這些處于運(yùn)行狀態(tài)的到底是什么進(jìn)程海渊,然后再用進(jìn)程分析工具,做進(jìn)一步分析哲鸳。
例子3:
top 輸出的軟中斷 CPU 使用率升高時(shí)臣疑,可以查看 /proc/softirqs 文件中各種類型軟中斷的變化情況,確定到底是哪種軟中斷出的問(wèn)題徙菠。比如讯沈,發(fā)現(xiàn)是網(wǎng)絡(luò)接收中斷導(dǎo)致的問(wèn)題,那就可以繼續(xù)用網(wǎng)絡(luò)分析工具 sar 和 tcpdump 來(lái)分析婿奔。
查看磁盤io
先用iostat查看磁盤io 是否讀寫負(fù)載很高缺狠。
如果 iostat 沒(méi)有,要 yum install sysstat安裝萍摊。
如果%util接近100%,表明I/O請(qǐng)求太多,I/O系統(tǒng)已經(jīng)滿負(fù)荷挤茄,磁盤可能存在瓶頸,一般%util大于70%,I/O壓力就比較大,讀取速度有較多的wait冰木,然后再看其他的參數(shù)穷劈。
rrqm/s:每秒進(jìn)行merge的讀操作數(shù)目。即delta(rmerge)/s
wrqm/s:每秒進(jìn)行merge的寫操作數(shù)目踊沸。即delta(wmerge)/s
r/s:每秒完成的讀I/O設(shè)備次數(shù)囚衔。即delta(rio)/s
w/s:每秒完成的寫I/0設(shè)備次數(shù)。即delta(wio)/s
rsec/s:每秒讀扇區(qū)數(shù)雕沿。即delta(rsect)/s
wsec/s:每秒寫扇區(qū)數(shù)练湿。即delta(wsect)/s
rKB/s:每秒讀K字節(jié)數(shù)。是rsec/s的一半审轮,因?yàn)槊可葏^(qū)大小為512字節(jié)
wKB/s:每秒寫K字節(jié)數(shù)肥哎。是wsec/s的一半
avgrq-sz:平均每次設(shè)備I/O操作的數(shù)據(jù)大小(扇區(qū))。即delta(rsect+wsect)/delta(rio+wio)
avgqu-sz:平均I/O隊(duì)列長(zhǎng)度疾渣。即delta(aveq)/s/1000(因?yàn)閍veq的單位為毫秒)
await:平均每次設(shè)備I/O操作的等待時(shí)間(毫秒)篡诽。即delta(ruse+wuse)/delta(rio+wio)
svctm:平均每次設(shè)備I/O操作的服務(wù)時(shí)間(毫秒)。即delta(use)/delta(rio+wio)
%util:一秒中有百分之多少的時(shí)間用于I/O操作,或者說(shuō)一秒中有多少時(shí)間I/O隊(duì)列是非空的
iotop找占用io讀寫很高的進(jìn)程
yum install iotop -y
用iotop命令查看那個(gè)進(jìn)程的讀寫榴捡,找出進(jìn)程
CPU低而負(fù)載確很高 的場(chǎng)景
等待被授權(quán)予CPU運(yùn)行權(quán)限的進(jìn)程
等待磁盤I/O完成的進(jìn)程
cpu低而負(fù)載高也就是說(shuō)等待磁盤I/O完成的進(jìn)程過(guò)多杈女,就會(huì)導(dǎo)致隊(duì)列長(zhǎng)度過(guò)大,這樣就體現(xiàn)到負(fù)載過(guò)大了,但實(shí)際是此時(shí)cpu被分配去執(zhí)行別的任務(wù)或空閑达椰,具體場(chǎng)景有如下幾種翰蠢。
場(chǎng)景一:磁盤讀寫請(qǐng)求過(guò)多就會(huì)導(dǎo)致大量I/O等待
cpu的工作效率要高于磁盤,而進(jìn)程在cpu上面運(yùn)行需要訪問(wèn)磁盤文件啰劲,這個(gè)時(shí)候cpu會(huì)向內(nèi)核發(fā)起調(diào)用文件的請(qǐng)求梁沧,讓內(nèi)核去磁盤取文件,這個(gè)時(shí)候會(huì)切換到其他進(jìn)程或者空閑蝇裤,這個(gè)任務(wù)就會(huì)轉(zhuǎn)換為不可中斷睡眠狀態(tài)廷支。當(dāng)這種讀寫請(qǐng)求過(guò)多就會(huì)導(dǎo)致不可中斷睡眠狀態(tài)的進(jìn)程過(guò)多,從而導(dǎo)致負(fù)載高栓辜,cpu低的情況恋拍。
場(chǎng)景二:MySQL中存在沒(méi)有索引的語(yǔ)句或存在死鎖等情況
MySQL的數(shù)據(jù)是存儲(chǔ)在硬盤中,如果需要進(jìn)行sql查詢藕甩,需要先把數(shù)據(jù)從磁盤加載到內(nèi)存中芝囤。當(dāng)在數(shù)據(jù)特別大的時(shí)候,如果執(zhí)行的sql語(yǔ)句沒(méi)有索引辛萍,就會(huì)造成掃描表的行數(shù)過(guò)大導(dǎo)致I/O阻塞悯姊,或者是語(yǔ)句中存在死鎖,也會(huì)造成I/O阻塞贩毕,從而導(dǎo)致不可中斷睡眠進(jìn)程過(guò)多悯许,導(dǎo)致負(fù)載過(guò)大。
場(chǎng)景三:外接硬盤故障辉阶,常見有掛了NFS先壕,但是NFS server故障
系統(tǒng)掛載了外接硬盤如NFS共享存儲(chǔ),經(jīng)常會(huì)有大量的讀寫請(qǐng)求去訪問(wèn)NFS存儲(chǔ)的文件谆甜,如果這個(gè)時(shí)候NFS Server故障垃僚,那么就會(huì)導(dǎo)致進(jìn)程讀寫請(qǐng)求一直獲取不到資源,從而進(jìn)程一直是不可中斷狀態(tài)规辱,造成負(fù)載很高谆棺。