性能瓶頸--CPU(使用率)

CPU使用率是最長(zhǎng)見的CPU性能指標(biāo)

CPU使用率

當(dāng)使用top命令的時(shí)候烹俗,就會(huì)看到很多的CPU指標(biāo)。

$ top
top - 19:16:40 up 21:00,  4 users,  load average: 0.00, 0.01, 0.05
Tasks: 178 total,   1 running, 177 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  3.0 sy,  0.0 ni, 97.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3861512 total,  2438584 free,   197496 used,  1225432 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  3331204 avail Mem 

這里介紹下命令輸出的第三行兔仰。

  • user (縮寫:us) 蕉鸳,表示用戶態(tài)CPU時(shí)間,不包括nice時(shí)間榕吼,但包括了guest時(shí)間友题。
  • nice (縮寫:ni)戴质,表示低優(yōu)先級(jí)用戶態(tài)的CPU時(shí)間,也就是進(jìn)程的nice值為 1-19之間的CPU時(shí)間戈抄,nice的取之范圍是 -20 -- 19划鸽,數(shù)值越大戚哎,優(yōu)先級(jí)反而越大。
  • system(縮寫:sys)型凳,表示內(nèi)核態(tài)CPU甘畅。
  • idle(縮寫:id)疏唾,表示空閑時(shí)間,但是不包括等待I/O的時(shí)間(iowait)槐脏。
  • iowait(縮寫:wa)顿天,表示等待I/O的時(shí)間重抖。
  • irq(縮寫:hi),表示處理硬中斷的CPU時(shí)間局扶。
  • softriq(縮寫:si)叁扫,表示處理軟中斷的CPU時(shí)間。
  • steal(縮寫:st)畴蒲,表示當(dāng)系統(tǒng)運(yùn)行虛擬機(jī)的時(shí)候模燥,被其他虛擬機(jī)占用的CPU時(shí)間。
  • guest(縮寫:guest)蔫骂,表示通過虛擬化運(yùn)行其他操作系統(tǒng)的時(shí)間辽旋,也就是運(yùn)行虛擬機(jī)的時(shí)間檐迟。
  • guest_nice(縮寫:gnice),表示以底優(yōu)先級(jí)運(yùn)行虛擬機(jī)的時(shí)間追迟。
    CPU的使用率計(jì)算方式不一樣怔匣,事實(shí)上不同的性能工具都是通過取一段時(shí)間(比如3秒)的兩次值,作差后金闽,才計(jì)算出CPU使用率代芜,這也是為什么不同的CPU性能工具的結(jié)果不太一樣浓利。

分析CPU使用率為什么高

可以直接定位的cpu使用率高的進(jìn)程钞速。

通過top渴语,ps驾凶,pidstat 工具可以快速的找到CPU使用率高的進(jìn)程掷酗,但是想知道占用CPU的到底是代碼里的哪個(gè)函數(shù)呢泻轰。找到它,才能更高效的針對(duì)性優(yōu)化虚婿。

perf

perf 是以性能事件采樣為基礎(chǔ)雳锋,不僅可以分析系統(tǒng)的各種事件和內(nèi)核性能羡洁,還可以用來分析制定的應(yīng)用程序的性能問題筑煮。
使用perf分析CPU性能問題真仲。

  • perf top
    他能夠?qū)崟r(shí)顯示占用CPU時(shí)鐘最多的函數(shù)或者指令,因此可以查找熱點(diǎn)函數(shù)虑凛。
$ perf top
Samples: 833  of event 'cpu-clock', Event count (approx.): 97742399
Overhead  Shared Object       Symbol
   7.28%  perf                [.] 0x00000000001f78a4
   4.72%  [kernel]            [k] vsnprintf
   4.32%  [kernel]            [k] module_get_kallsym
   3.65%  [kernel]            [k] _raw_spin_unlock_irqrestore
...

第一行為采樣數(shù)(Samples)桑谍、事件類型(event)和事件總數(shù)(Event Count)祸挪。
第二行的數(shù)據(jù)格式。

  1. OverHead 是該符號(hào)的性能事件在所有的采樣中的比例增热,用百分比表示。
  2. Shared 是該函數(shù)或者指令所在的動(dòng)態(tài)共享對(duì)象(Dynamic Shared Object)峻仇,如內(nèi)核票顾,進(jìn)程名奠骄,動(dòng)態(tài)鏈接庫(kù)含鳞,內(nèi)核模塊等蝉绷。
  3. Object 是動(dòng)態(tài)共享對(duì)象的類型熔吗。[.] 表示用戶空間的可執(zhí)行程序桅狠、或者動(dòng)態(tài)鏈接庫(kù)轿秧,而[k]表示的內(nèi)核空間中跌。
  4. Symbol 是符號(hào)名,也是就函數(shù)名菇篡,當(dāng)函數(shù)名未知時(shí)漩符,用16進(jìn)制的地址來表示。
  • perf record 和 perf report
    perf top 雖然展示了系統(tǒng)的性能信息驱还,但是缺點(diǎn)是不能保存下來進(jìn)行分析嗜暴。而perf record 就可以提供保存數(shù)據(jù)的功能,保存后的數(shù)據(jù)可以使用perf report解析并且展示议蟆。
實(shí)際案例

使用ab壓測(cè)工具對(duì)phpweb站點(diǎn)進(jìn)行壓測(cè)闷沥。

ab -c 30 -n 10000 http://localhost:10000/
...
Total transferred:      1720000 bytes
HTML transferred:       90000 bytes
Requests per second:    14.40 [#/sec] (mean)
Time per request:       2083.193 [ms] (mean)
...

每秒的平均請(qǐng)求數(shù)只有14個(gè)。性能很差勁咪鲜。
使用top命令查看狐赡,發(fā)現(xiàn)load很高,cpu的使用率也很高。前面的幾個(gè)都是php-fpm進(jìn)程颖侄,不用說了览祖。是php-fpm 的問題了又活。

top - 01:19:26 up  2:06,  2 users,  load average: 3.85, 1.04, 0.42
Tasks: 185 total,   6 running, 179 sleeping,   0 stopped,   0 zombie
%Cpu(s): 97.0 us,  3.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3861520 total,  2303384 free,   253588 used,  1304548 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  3216488 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                  
 20864 bin       20   0  336684   9360   1680 R  43.8  0.2   0:19.38 php-fpm: pool www                                                        
 20862 bin       20   0  336684   9368   1688 R  37.5  0.2   0:19.96 php-fpm: pool www                                                        
 20863 bin       20   0  336684   9364   1684 R  37.5  0.2   0:19.65 php-fpm: pool www                                                        
 20866 bin       20   0  336684   9360   1680 R  37.5  0.2   0:19.89 php-fpm: pool www                                                        
 20865 bin       20   0  336684   9360   1680 R  31.2  0.2   0:20.25 php-fpm: pool www    

使用perf命令記錄。

perf record -a -g -F 99 -p 21212
Warning:
PID/TID switch overriding SYSTEM^C[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.263 MB perf.data (2067 samples) ]

轉(zhuǎn)成火焰圖,然后打開看。


perf 火焰圖

可以看到右上角。主要是在執(zhí)行那兩個(gè)函數(shù)。
原來性能問題就出在那兩個(gè)函數(shù)上奖唯。

小結(jié)

CPU使用率是最直觀和最常用的系統(tǒng)性能指標(biāo)寂汇。

  • 用戶CPU和Nice值高時(shí)停巷,說明用戶態(tài)進(jìn)程占了較多的CPU,所以應(yīng)該著重排查進(jìn)程的性能問題。
  • 系統(tǒng)的CPU高吝羞,說明內(nèi)核態(tài)占用的CPU多均澳,應(yīng)該著重查看內(nèi)核線程或者系統(tǒng)調(diào)用的性能問題柏腻。
  • I/O 等待CPU高,說明等待I/O的時(shí)間比較長(zhǎng)躯枢,所以應(yīng)該著重查是不是出現(xiàn)了I/O問題。
  • 軟中斷和硬中斷高得糜,說明中斷處理程序占用了較多的CPU谍珊,應(yīng)該著重查看內(nèi)核中的中斷服務(wù)程序。

perf 的使用與動(dòng)態(tài)追蹤技術(shù):
http://www.reibang.com/p/3cdc0f05ac5d
動(dòng)態(tài)追蹤技術(shù)漫談
http://www.brendangregg.com/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捉超,一起剝皮案震驚了整個(gè)濱河市况芒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖腺阳,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焙蚓,死亡現(xiàn)場(chǎng)離奇詭異待德,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扒最,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門强挫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來八匠,“玉大人,你說我怎么就攤上這事胸私。” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)些举。 經(jīng)常有香客問我,道長(zhǎng)电禀,這世上最難降的妖魔是什么尖飞? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任辕坝,我火速辦了婚禮江场,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘权均。我一直安慰自己,他們只是感情好匆笤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布研侣。 她就那樣靜靜地躺著,像睡著了一般炮捧。 火紅的嫁衣襯著肌膚如雪庶诡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天咆课,我揣著相機(jī)與錄音末誓,去河邊找鬼。 笑死书蚪,一個(gè)胖子當(dāng)著我的面吹牛喇澡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播殊校,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晴玖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了为流?” 一聲冷哼從身側(cè)響起呕屎,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敬察,沒想到半個(gè)月后榨惰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡静汤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了居凶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虫给。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖侠碧,靈堂內(nèi)的尸體忽然破棺而出抹估,到底是詐尸還是另有隱情,我是刑警寧澤弄兜,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布药蜻,位于F島的核電站瓷式,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏语泽。R本人自食惡果不足惜贸典,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望踱卵。 院中可真熱鬧廊驼,春花似錦、人聲如沸惋砂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)西饵。三九已至酝掩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間眷柔,已是汗流浹背期虾。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闯割,地道東北人彻消。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宙拉,于是被迫代替她去往敵國(guó)和親宾尚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355