Linux之《荒岛余生》(二)CPU篇
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
溫馨提示,動(dòng)圖已壓縮,流量黨放心查看。CPU方面內(nèi)容不多,我們順便學(xué)點(diǎn)命令。本篇是《荒島余生》系列第二篇,垂直觀測CPU。其余參見:
Linux之《荒島余生》(一)準(zhǔn)備篇
如何做一個(gè)CPU
cpu是芯片的一種,我們以漢芯為例,看一下制作七步曲。
? 提純精度11個(gè)9的硅片(99.999999999%)
? 生成晶圓
? 使用光刻機(jī)加工晶圓
? 使用刻蝕機(jī)溝槽
? 完成P型半導(dǎo)體制作
? 使用200號(hào)的粗砂紙抹掉原標(biāo)志
? 涂上新標(biāo)志
bingo,完工!
雖然CPU很小,但生產(chǎn)它的設(shè)備可不簡單。如下圖,就是一臺(tái)重十幾噸,占地上百平米,全世界都當(dāng)寶貝的光刻機(jī)!
你我就這樣飽受科技的恩澤,有時(shí)間探討在中央處理器上發(fā)生的故事了。
找到占用CPU最高的線程
接下來看一個(gè)實(shí)際的例子。公司有點(diǎn)窮,所以機(jī)器上混合部署了多個(gè)java應(yīng)用,突然有一天,CPU炸了,我們要找到是誰引起的。這個(gè)誰不是進(jìn)程,而是線程,離真相最近的那個(gè)。
傳統(tǒng)做法
通常的做法是:
? 在命令行輸入top,然后shift+p查看占用CPU最高的進(jìn)程,記下進(jìn)程號(hào)
? 在命令行輸入top -Hp 進(jìn)程號(hào),查看占用CPU最高的線程
? 使用printf 0x%x 線程號(hào),得到其16進(jìn)制線程號(hào)
? 使用jstack 進(jìn)程號(hào)得到j(luò)ava執(zhí)行棧,然后grep16進(jìn)制找到相應(yīng)的信息
錄個(gè)屏先
拔蘿卜帶泥
但我想通過另外一種方式來實(shí)現(xiàn)這個(gè)功能(最多樣化),順便學(xué)幾個(gè)其他常用的命令。
ps -eo %cpu,pid |sort -n -k1 -r | head -n 1 | ?awk '{print $2}' |xargs ?top -b -n1 -Hp | grep COMMAND -A1 | tail -n 1 | awk '{print $1}' | xargs printf 0x%x這一行Shell的意思是,找到使用CPU最高的進(jìn)程之使用CPU最高的線程的16進(jìn)制號(hào)。
這么長的命令,是不是暈了?別怕,我們一點(diǎn)點(diǎn)來。通常情況下,練習(xí)熟練了命令中出現(xiàn)的這幾個(gè),就能夠應(yīng)對(duì)50%的常用工作了。Come on,上圖。
接下來,試著寫一下腳本吧。
有哪些查看CPU的命令
top
其實(shí)從上面命令就可以瞧出來,top和ps的命令是互通的,只不過表現(xiàn)形式不同,我們直接拿top來說。按數(shù)字1就可以顯示每核CPU的使用情況。基本上都是些單詞的縮寫,看幾遍就忘不掉了。比如 :
us ==> user CPU time先記住這些判斷準(zhǔn)則,我們?cè)谑纠性倭?#xff1a;
? 如果load超過了cpu核數(shù),則負(fù)載過高
? 如果wa過高,可初步判斷I/O有問題
? sy,si,hi,st,任何一個(gè)超過5%,都有問題
? 進(jìn)程狀態(tài)長時(shí)處于D、Z、T狀態(tài),提高注意度
? cpu不均衡,判斷親和性和優(yōu)先級(jí)問題
vmstat
vmstat 以另一種形式來展示一些信息。如圖:
除了關(guān)注類似top的一些指標(biāo),還有:
??b?置于等待隊(duì)列(等待資源、等待輸入/輸出)的內(nèi)核線程數(shù)目。數(shù)字過大則cpu太忙。
??cs?如果頻繁的進(jìn)行上下文切換,則考慮是否是線程數(shù)開的過多
??si/so?顯示了交換分區(qū)的現(xiàn)狀,有時(shí)候會(huì)造成cpu問題,一并關(guān)注
sar
是目前Linux上最為全面的系統(tǒng)性能分析工具之一,但可能沒有預(yù)裝。在centos上使用以下命令即可安裝。
yum install sysstat -ysar主要的好處是可以看到歷史,顯示友好,可以對(duì)結(jié)果進(jìn)行二次處理。sar還有圖形化工具,執(zhí)行sar -A即可獲得所有數(shù)據(jù)。
https://github.com/vlsi/ksar針對(duì)于CPU方面,我們關(guān)注:
? sar -u ?默認(rèn)
? sar -P ALL 每顆cpu的使用狀態(tài)信息
? sar -q ?cpu隊(duì)列的長度,runq-sz>cpu count就表明有瓶頸了
? sar -w ?每秒上下文交換
可以瞧見,關(guān)注的也就那幾個(gè)點(diǎn)而已。
mpstat
還有pidstat,包括彩色的dstat,功能都差不多, 用熟一個(gè)就ok了。
數(shù)據(jù)從何而來
那么數(shù)據(jù)從何而來?
/proc目錄是一個(gè)虛擬目錄,存儲(chǔ)的是當(dāng)前內(nèi)核的一系列特殊文件,你不僅能查看一些狀態(tài),甚至能修改一些值來改變系統(tǒng)的行為。
比如top的load (使用uptime命令得到同樣的結(jié)果)。讀取的就是
/proc/loadavg?文件
而每核cpu的信息,讀取
/proc/stat文件
這些命令,是對(duì)/proc目錄中一系列信息的解析和友好的展示,這些值,Linux內(nèi)核都算好了躺在那呢。
(圖片來源網(wǎng)絡(luò))
創(chuàng)建這個(gè)目錄的人真是天才!
幾個(gè)例子
CPU過高是表象。除了系統(tǒng)確實(shí)負(fù)載已經(jīng)到了極限,其他的,都是由其他原因引起的,比如I/O;比如設(shè)備。這些我們放在其他章節(jié)進(jìn)行討論。
GC引起的CPU過高
接著我們最開始的例子來。通過查看jstack找到相應(yīng)的16進(jìn)制進(jìn)程,結(jié)果發(fā)現(xiàn)是GC線程。
"VM Thread" prio=10 tid=0x00007f06d8089000 nid=0x58c7 runnable "GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f06d801b800 nid=0x58d7 runnable這種情況,一般都是JVM內(nèi)存不夠用了,瘋狂GC,可能是socket/線程忘了關(guān)閉了,也可能是大對(duì)象沒有回收。這種情況只能通過重啟來解決了,記得重啟之前,使用jmap dump一下堆棧哦。當(dāng)然,你可能會(huì)得到j(luò)dk版本的問題。
st%占比過高
st過高一般是物理CPU資源不足所致,也就是只發(fā)生在虛擬機(jī)上。
如果你買的虛擬機(jī)st一直很高,那你的服務(wù)提供商可能在超賣,擠占你的資源。不信雙11的時(shí)候看下你的虛擬機(jī)?
網(wǎng)卡導(dǎo)致單cpu過高
業(yè)務(wù)方幾臺(tái)kafka,cpu使用處于正常水平,才10%左右,但有一核cpu,負(fù)載特別的高,si奇高。
mpstat -I SUM -P ALL 查看cpu使用情況,cpu0的中斷確實(shí)比較多。
20:15:18 ?CPU ? ?intr/s ? 20:15:23 ?all ?34234.20 ? 20:15:23 ? ?0 ? 9566.20 ? 20:15:23 ? ?1 ? ? ?0.00網(wǎng)卡需要cpu服務(wù)時(shí),都會(huì)拋出一個(gè)中斷,中斷告訴cpu發(fā)生了什么事情,cpu就要停止目前的工作來處理這個(gè)中斷。其實(shí),默認(rèn)所有的中斷處理都集中在cpu0 上,導(dǎo)致服務(wù)器負(fù)載過高。cpu0 成了瓶頸,而其他cpu卻還閑著。
? 解決方式1:使用CPU親和性功能,kafka略過網(wǎng)卡所使用的CPU
? 解決方式2: 更換網(wǎng)卡
? 通常修改的方式還是有些復(fù)雜了,比如,修改
/proc/irq/{seq}/smp_affinity
我們可以直接安裝irqbalance,然后執(zhí)行就可以了。
yum install irqbalance -y service irqbalance startcpu使用率低,但負(fù)載高
cpu id%高,也就是空閑,比如90%。但 load average非常高,比如4核達(dá)到10。
分析:load average高,說明其任務(wù)已經(jīng)排隊(duì),許多任務(wù)正在等待。出現(xiàn)此種情況,可能存在大量不可中斷的進(jìn)程。
使用top或者ps可以看到進(jìn)程相應(yīng)的狀態(tài)。
ps aux一種情況就是有大量進(jìn)程處于D的狀態(tài),也就是不可中斷的睡眠狀態(tài),所以很可能是硬件問題。
詳見《Linux進(jìn)程狀態(tài)(ps stat)之R、S、D、T、Z、X》
高頻問題:load
load代表的是啥
說句白話,load代表的就是你目前系統(tǒng)進(jìn)程的排隊(duì)情況。
如圖,以單核為例,將CPU資源抽象成一條單行馬路。則會(huì)發(fā)生三種情況:
? 馬路上的車只有4輛,車輛暢通無阻,load大約是0.5
? 馬路上的車有8輛,正好能首尾相接安全通過,此時(shí)load大約為1
? 馬路上的車有12輛,除了在馬路上的8輛車,還有4輛交集的等在外面,也就是超出容量了,需要排隊(duì)。此時(shí)load大約為1.5
load為1代表的是啥
針對(duì)這個(gè)問題,誤解還是比較多的。很多同學(xué)認(rèn)為,load達(dá)到1,系統(tǒng)就到了瓶頸,這不完全正確。
load的值和cpu核數(shù)息息相關(guān):
? 單核的cpu達(dá)到100%,load約1
? 雙核的cpu都達(dá)到100%,load約2
? 四核的cpu都達(dá)到100%,load約為4
所以,對(duì)于一個(gè)load到了10,卻是16核的機(jī)器,你的系統(tǒng)還遠(yuǎn)沒有達(dá)到負(fù)載極限。
結(jié)尾
此文歸屬「小姐姐味道」,轉(zhuǎn)載注明出處。本篇實(shí)際的排查過程較少,因?yàn)閏pu問題一般都伴隨著其他問題。但文中出現(xiàn)的這些命令可不簡單,尤其是它們豐富的參數(shù)。這些參數(shù),執(zhí)行一下man,就可以一睹芳容了。比如:
man top當(dāng)然,也可以這樣~
no woman、 no love,果然是一個(gè)只有男人的世界!
轉(zhuǎn)載于:https://my.oschina.net/mskk/blog/3010793
總結(jié)
以上是生活随笔為你收集整理的Linux之《荒岛余生》(二)CPU篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是ie浏览器_?IE 浏览器为什么不
- 下一篇: 初学echart的简单使用