舒適提示,動圖已壓縮,流量黨放心查看。CPU方面內容很少,咱們順便學點命令。本篇是《荒島餘生》系列第二篇,垂直觀測CPU。其他參見:java
cpu是芯片的一種,咱們以漢芯爲例,看一下製做七步曲。github
雖然CPU很小,但生產它的設備可不簡單。以下圖,就是一臺重十幾噸,佔地上百平米,全世界都當寶貝的光刻機! centos
接下來看一個實際的例子。公司有點窮,因此機器上混合部署了多個java應用,忽然有一天,CPU炸了,咱們要找到是誰引發的。這個誰不是進程,而是線程,離真相最近的那個。安全
一般的作法是:bash
top
,而後shift+p
查看佔用CPU最高的進程,記下進程號top -Hp 進程號
,查看佔用CPU最高的線程printf 0x%x 線程號
,獲得其16進制線程號jstack 進程號
獲得java執行棧,而後grep
16進制找到相應的信息 錄個屏先
但我想經過另一種方式來實現這個功能(最多樣化),順便學幾個其餘經常使用的命令。服務器
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最高的進程之使用CPU最高的線程的16進制號。 這麼長的命令,是否是暈了?別怕,咱們一點點來。一般狀況下,練習熟練了命令中出現的這幾個,就可以應對50%的經常使用工做了。Come on,上圖。 15423589014500.jpg 微信
其實從上面命令就能夠瞧出來,top和ps的命令是互通的,只不過表現形式不一樣,咱們直接拿top來講。按數字1就能夠顯示每核CPU的使用狀況。基本上都是些單詞的縮寫,看幾遍就忘不掉了。好比 :網絡
us ==> user CPU time
複製代碼
vmstat 以另外一種形式來展現一些信息。如圖: socket
b
置於等待隊列(等待資源、等待輸入/輸出)的內核線程數目。數字過大則cpu太忙。cs
若是頻繁的進行上下文切換,則考慮是不是線程數開的過多si
/so
顯示了交換分區的現狀,有時候會形成cpu問題,一併關注是目前Linux上最爲全面的系統性能分析工具之一,但可能沒有預裝。在centos上使用如下命令便可安裝。
yum install sysstat -y
複製代碼
sar主要的好處是能夠看到歷史,顯示友好,能夠對結果進行二次處理。sar還有圖形化工具,執行sar -A
便可得到全部數據。
https://github.com/vlsi/ksar
複製代碼
針對於CPU方面,咱們關注:
pidstat
,包括彩色的dstat
,功能都差很少, 用熟一個就ok了。那麼數據從何而來? /proc
目錄是一個虛擬目錄,存儲的是當前內核的一系列特殊文件,你不只能查看一些狀態,甚至能修改一些值來改變系統的行爲。
好比top的load (使用uptime命令獲得一樣的結果)。讀取的就是 /proc/loadavg
文件 而每核cpu的信息,讀取 /proc/stat
文件
這些命令,是對/proc目錄中一系列信息的解析和友好的展現,這些值,Linux內核都算好了躺在那呢。
此文歸屬微信公衆號「小姐姐味道」,轉載註明出處。CPU太高是表象。除了系統確實負載已經到了極限,其餘的,都是由其餘緣由引發的,好比I/O;好比設備。這些咱們放在其餘章節進行討論。
接着咱們最開始的例子來。經過查看jstack找到相應的16進制進程,結果發現是GC線程。
"VM Thread" prio=10 tid=0x00007f06d8089000 nid=0x58c7 runnable
"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f06d801b800 nid=0x58d7 runnable
複製代碼
這種狀況,通常都是JVM內存不夠用了,瘋狂GC,多是socket/線程忘了關閉了,也多是大對象沒有回收。這種狀況只能經過重啓來解決了,記得重啓以前,使用jmap dump一下堆棧哦。固然,你可能會獲得jdk版本的問題。
st太高通常是物理CPU資源不足所致,也就是隻發生在虛擬機上。 若是你買的虛擬機st一直很高,那你的服務提供商可能在超賣,擠佔你的資源。不信雙11的時候看下你的虛擬機?
業務方几臺kafka,cpu使用處於正常水平,才10%左右,但有一核cpu,負載特別的高,si奇高。
mpstat -I SUM -P ALL 查看cpu使用狀況,cpu0的中斷確實比較多。
20:15:18 CPU intr/s
20:15:23 all 34234.20
20:15:23 0 9566.20
20:15:23 1 0.00
複製代碼
網卡須要cpu服務時,都會拋出一箇中斷,中斷告訴cpu發生了什麼事情,cpu就要中止目前的工做來處理這個中斷。其實,默認全部的中斷處理都集中在cpu0 上,致使服務器負載太高。cpu0 成了瓶頸,而其餘cpu卻還閒着。 ➊ 解決方式1:使用CPU親和性功能,kafka略過網卡所使用的CPU ➋ 解決方式2: 更換網卡 ➌ 一般修改的方式仍是有些複雜了,好比,修改/proc/irq/{seq}/smp_affinity 咱們能夠直接安裝irqbalance
,而後執行就能夠了。
yum install irqbalance -y
service irqbalance start
複製代碼
cpu id%高,也就是空閒,好比90%。但 load average很是高,好比4核達到10。
分析:load average高,說明其任務已經排隊,許多任務正在等待。出現此種狀況,可能存在大量不可中斷的進程。
使用top或者ps能夠看到進程相應的狀態。
ps aux
複製代碼
說句白話,load表明的就是你目前系統進程的排隊狀況。
針對這個問題,誤解仍是比較多的。不少同窗認爲,load達到1,系統就到了瓶頸,這不徹底正確。 load的值和cpu核數息息相關:
因此,對於一個load到了10,倒是16核的機器,你的系統還遠沒有達到負載極限。
本篇實際的排查過程較少,由於cpu問題通常都伴隨着其餘問題。但文中出現的這些命令可不簡單,尤爲是它們豐富的參數。這些參數,執行一下man,就能夠一睹芳容了。好比:
man top
複製代碼
固然,也能夠這樣~