Linux之《荒島餘生》(二)CPU篇

舒適提示,動圖已壓縮,流量黨放心查看。CPU方面內容很少,咱們順便學點命令。本篇是《荒島餘生》系列第二篇,垂直觀測CPU。其他參見:java

Linux之《荒島餘生》(一)準備篇git

如何作一個CPU

cpu是芯片的一種,咱們以漢芯爲例,看一下製做七步曲。github

  • 提純精度11個9的硅片(99.999999999%)
  • 生成晶圓
  • 使用光刻機加工晶圓
  • 使用刻蝕機溝槽
  • 完成P型半導體制做
  • 使用200號的粗砂紙抹掉原標誌
  • 塗上新標誌 bingo,完工!

雖然CPU很小,但生產它的設備可不簡單。以下圖,就是一臺重十幾噸,佔地上百平米,全世界都當寶貝的光刻機! centos

你我就這樣飽受科技的恩澤,有時間探討在中央處理器上發生的故事了。

找到佔用CPU最高的線程

接下來看一個實際的例子。公司有點窮,因此機器上混合部署了多個java應用,忽然有一天,CPU炸了,咱們要找到是誰引發的。這個誰不是進程,而是線程,離真相最近的那個。安全

傳統作法

一般的作法是:bash

  • 在命令行輸入top,而後shift+p查看佔用CPU最高的進程,記下進程號
  • 在命令行輸入top -Hp 進程號,查看佔用CPU最高的線程
  • 使用printf 0x%x 線程號,獲得其16進制線程號
  • 使用jstack 進程號獲得java執行棧,而後grep16進制找到相應的信息 錄個屏先

拔蘿蔔帶泥

但我想經過另一種方式來實現這個功能(最多樣化),順便學幾個其餘經常使用的命令。服務器

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 微信

接下來,試着寫一下腳本吧。

有哪些查看CPU的命令

top

其實從上面命令就能夠瞧出來,top和ps的命令是互通的,只不過表現形式不一樣,咱們直接拿top來講。按數字1就能夠顯示每核CPU的使用狀況。基本上都是些單詞的縮寫,看幾遍就忘不掉了。好比 :網絡

us ==> user CPU time
複製代碼

先記住這些判斷準則,咱們在示例中再聊:

  • 若是load超過了cpu核數,則負載太高
  • 若是wa太高,可初步判斷I/O有問題
  • sy,si,hi,st,任何一個超過5%,都有問題
  • 進程狀態長時處於D、Z、T狀態,提升注意度
  • cpu不均衡,判斷親和性和優先級問題

vmstat

vmstat 以另外一種形式來展現一些信息。如圖: socket

除了關注相似top的一些指標,還有:

  • b 置於等待隊列(等待資源、等待輸入/輸出)的內核線程數目。數字過大則cpu太忙。
  • cs 若是頻繁的進行上下文切換,則考慮是不是線程數開的過多
  • si/so 顯示了交換分區的現狀,有時候會形成cpu問題,一併關注

sar

是目前Linux上最爲全面的系統性能分析工具之一,但可能沒有預裝。在centos上使用如下命令便可安裝。

yum install sysstat -y
複製代碼

sar主要的好處是能夠看到歷史,顯示友好,能夠對結果進行二次處理。sar還有圖形化工具,執行sar -A便可得到全部數據。

https://github.com/vlsi/ksar
複製代碼

針對於CPU方面,咱們關注:

  • sar -u 默認
  • sar -P ALL 每顆cpu的使用狀態信息
  • sar -q cpu隊列的長度,runq-sz>cpu count就代表有瓶頸了
  • sar -w 每秒上下文交換 能夠瞧見,關注的也就那幾個點而已。
    ##mpstat 還有pidstat,包括彩色的dstat,功能都差很少, 用熟一個就ok了。

數據從何而來

那麼數據從何而來? /proc目錄是一個虛擬目錄,存儲的是當前內核的一系列特殊文件,你不只能查看一些狀態,甚至能修改一些值來改變系統的行爲。

好比top的load (使用uptime命令獲得一樣的結果)。讀取的就是 /proc/loadavg 文件 而每核cpu的信息,讀取 /proc/stat文件

這些命令,是對/proc目錄中一系列信息的解析和友好的展現,這些值,Linux內核都算好了躺在那呢。

(圖片來源網絡) 建立這個目錄的人真是天才!

幾個例子

此文歸屬微信公衆號「小姐姐味道」,轉載註明出處。CPU太高是表象。除了系統確實負載已經到了極限,其餘的,都是由其餘緣由引發的,好比I/O;好比設備。這些咱們放在其餘章節進行討論。

GC引發的CPU太高

接着咱們最開始的例子來。經過查看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%佔比太高

st太高通常是物理CPU資源不足所致,也就是隻發生在虛擬機上。 若是你買的虛擬機st一直很高,那你的服務提供商可能在超賣,擠佔你的資源。不信雙11的時候看下你的虛擬機?

網卡致使單cpu太高

業務方几臺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使用率低,但負載高

cpu id%高,也就是空閒,好比90%。但 load average很是高,好比4核達到10。

分析:load average高,說明其任務已經排隊,許多任務正在等待。出現此種狀況,可能存在大量不可中斷的進程。

使用top或者ps能夠看到進程相應的狀態。

ps aux 
複製代碼

一種狀況就是有大量進程處於D的狀態,也就是不可中斷的睡眠狀態,因此極可能是硬件問題。 詳見 《Linux進程狀態(ps stat)之R、S、D、T、Z、X》

高頻問題:load

load表明的是啥

說句白話,load表明的就是你目前系統進程的排隊狀況。

如圖,以單核爲例,將CPU資源抽象成一條單行馬路。則會發生三種狀況:

  • 馬路上的車只有4輛,車輛暢通無阻,load大約是0.5
  • 馬路上的車有8輛,正好能首尾相接安全經過,此時load大約爲1
  • 馬路上的車有12輛,除了在馬路上的8輛車,還有4輛交集的等在外面,也就是超出容量了,須要排隊。此時load大約爲1.5

load爲1表明的是啥

針對這個問題,誤解仍是比較多的。不少同窗認爲,load達到1,系統就到了瓶頸,這不徹底正確。 load的值和cpu核數息息相關:

  • 單核的cpu達到100%,load約1
  • 雙核的cpu都達到100%,load約2
  • 四核的cpu都達到100%,load約爲4

因此,對於一個load到了10,倒是16核的機器,你的系統還遠沒有達到負載極限。

結尾

本篇實際的排查過程較少,由於cpu問題通常都伴隨着其餘問題。但文中出現的這些命令可不簡單,尤爲是它們豐富的參數。這些參數,執行一下man,就能夠一睹芳容了。好比:

man top
複製代碼

固然,也能夠這樣~

no woman、 no love,果真是一個只有男人的世界!
相關文章
相關標籤/搜索