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ù)格式。
- OverHead 是該符號(hào)的性能事件在所有的采樣中的比例增热,用百分比表示。
- Shared 是該函數(shù)或者指令所在的動(dòng)態(tài)共享對(duì)象(Dynamic Shared Object)峻仇,如內(nèi)核票顾,進(jìn)程名奠骄,動(dòng)態(tài)鏈接庫(kù)含鳞,內(nèi)核模塊等蝉绷。
- Object 是動(dòng)態(tài)共享對(duì)象的類型熔吗。[.] 表示用戶空間的可執(zhí)行程序桅狠、或者動(dòng)態(tài)鏈接庫(kù)轿秧,而[k]表示的內(nèi)核空間中跌。
- 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)成火焰圖,然后打開看。
可以看到右上角。主要是在執(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/