linux 使cpu使用率升高_关于linux系统CPU篇---gt;CPU使用率升高
1.CPU使用率為單位時(shí)間內(nèi)CPU使用情況的統(tǒng)計(jì),以百分比的方式展示。
LINUX作為一個(gè)多任務(wù)操作系統(tǒng),將每個(gè)CPU的時(shí)間劃分為很短的時(shí)間片,再通過(guò)調(diào)度器輪流分配給各個(gè)任務(wù)使用,因此造成多任務(wù)同時(shí)運(yùn)行的錯(cuò)覺(jué)
2.如何查看CPU使用率?
TOP和PS是最常用的性能分析工具。TOP顯示了系統(tǒng)總體的CPU和內(nèi)存使用情況,以及各個(gè)進(jìn)程的資源使用情況
PS則只顯示了每個(gè)進(jìn)程的資源使用情況
pidstat是專(zhuān)門(mén)分析每個(gè)進(jìn)程的CPU使用情況的工具
TOP輸出:
# 默認(rèn)每 3 秒刷新一次
$ top
top - 11:58:59 up 9 days, 22:47, 1 user, load average: 0.03, 0.02, 0.00
Tasks: 123 total, 1 running, 72 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8169348 total, 5606884 free, 334640 used, 2227824 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 7497908 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 78088 9288 6696 S 0.0 0.1 0:16.83 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
TOP默認(rèn)顯示的是所有CPU的平均值,這時(shí)候按下1,就可以切換到每個(gè)CPU的使用率了
下面的pidstat命令,就間隔1秒,展示了進(jìn)程的5組CPU使用率,包括:
%usr用戶(hù)態(tài)CPU使用率
%system 系統(tǒng)CPU使用率
%guest 運(yùn)行虛擬機(jī)CPU使用率
%wait 等待IO CPU使用率
%cpu 總的CPU使用率
最后的average部分,還計(jì)算了5組數(shù)據(jù)的平均值
pidstat輸出:
# 每隔 1 秒輸出一組數(shù)據(jù),共輸出 5 組
$ pidstat 1 5
15:56:02 UID PID %usr %system %guest %wait %CPU CPU Command
15:56:03 0 15006 0.00 0.99 0.00 0.00 0.99 1 dockerd
...
Average: UID PID %usr %system %guest %wait %CPU CPU Command
Average: 0 15006 0.00 0.99 0.00 0.00 0.99 - dockerd
3.CPU使用率過(guò)高怎么辦?
使用top,ps,pidstat等工具,能夠輕松找到占用CPU使用率較高(100%)的進(jìn)程,接下來(lái),你可能想知道占用CPU的是哪個(gè)函數(shù)呢,找到它,才能更有效,更針對(duì)性的進(jìn)行性能優(yōu)化。
那么那種工具最適合在第一時(shí)間分析進(jìn)程的CPU問(wèn)題呢,推薦的是perf。perf是linux2.6.31以后內(nèi)置的性能分析工具,包含了perf top ,perf record,perf report
第一種:perf top,類(lèi)似于top,它能夠?qū)崟r(shí)顯示占用CPU時(shí)鐘最多的函數(shù)或者指令,因此可以用來(lái)查找熱點(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
...
輸出結(jié)果中,第一行包含三個(gè)數(shù)據(jù),分別是采樣數(shù),事件類(lèi)型和事件總數(shù)量,輸出中可以看到perf采集了833個(gè)CPU時(shí)鐘事件,而總事件數(shù)則為97742399
如果輸出結(jié)果中,采樣數(shù)(Samples)只有10幾個(gè),那下面的排序和百分比就沒(méi)什么實(shí)際參考價(jià)值
Overhead:該符號(hào)的性能事件,在所有采樣中的比例,用百分比來(lái)展示
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ì)象的類(lèi)型。比如[.]表示用戶(hù)空間的可執(zhí)行程序,或者動(dòng)態(tài)鏈接庫(kù),而[k]則表示內(nèi)核空間
Symbol:是符號(hào)名,也就是函數(shù)名。當(dāng)函數(shù)名未知時(shí),用十六進(jìn)制地址表示
從上面的輸出中可以看到,占用CPU最多的是perf工具自身,不過(guò)它的比例也只有7.28%,說(shuō)明系統(tǒng)并沒(méi)有CPU性能問(wèn)題。
第二種常見(jiàn)用法:也就是perf record和perf report
perf record 提供了保存數(shù)據(jù)的功能,保存后的數(shù)據(jù),可以用perf report 解析展示
4.案例分析:
(1).使用兩臺(tái)linux虛擬機(jī),其中一臺(tái)用作web服務(wù)器,模擬性能問(wèn)題。需要安裝docker,nginx,perf,sysstat等工具
另外一臺(tái)用作客戶(hù)端,需要安裝ab,curl
(2).在第一臺(tái)虛擬機(jī)中執(zhí)行下面命令運(yùn)行nginx和php應(yīng)用:
docker run --name nginx -p 10000:80 -itd feisky/nginx
docker run --name phpfpm -itd --network container:nginx feisky/php-fpm
(3).在第二臺(tái)虛擬機(jī)(客戶(hù)端)執(zhí)行curl 命令,確認(rèn)nginx已經(jīng)正常啟動(dòng):
# 192.168.0.10 是第一臺(tái)虛擬機(jī)的 IP 地址
$ curl http://192.168.0.10:10000/
It works!
(4).測(cè)試nginx服務(wù)的性能:
# 并發(fā) 10 個(gè)請(qǐng)求測(cè)試 Nginx 性能,總共測(cè)試 100 個(gè)請(qǐng)求
$ ab -c 10 -n 100 http://192.168.0.10:10000/
This is ApacheBench, Version 2.3
Copyright 1996 Adam Twiss, Zeus Technology Ltd,
...
Requests per second: 11.63 [#/sec] (mean)
Time per request: 859.942 [ms] (mean)
...
從ab的結(jié)果輸出中,發(fā)現(xiàn)nginx能承受的每秒平均請(qǐng)求數(shù)只有11.63.性能比較差
(5)繼續(xù)執(zhí)行ab,將請(qǐng)求數(shù)增加到10000,這樣在第一個(gè)終端使用性能分析工具時(shí),nginx壓力還是繼續(xù)
ab -c 10 -n 10000 http://192.168.0.10:10000/
(6).回到第一個(gè)終端運(yùn)行top命令,并按下數(shù)字1,切換到每個(gè)CPU的使用率:
$ top
...
%Cpu0 : 98.7 us, 1.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 99.3 us, 0.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
...
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21514 daemon 20 0 336696 16384 8712 R 41.9 0.2 0:06.00 php-fpm
21513 daemon 20 0 336696 13244 5572 R 40.2 0.2 0:06.08 php-fpm
21515 daemon 20 0 336696 16384 8712 R 40.2 0.2 0:05.67 php-fpm
21512 daemon 20 0 336696 13244 5572 R 39.9 0.2 0:05.87 php-fpm
21516 daemon 20 0 336696 16384 8712 R 35.9 0.2 0:05.61 php-fpm
發(fā)現(xiàn)占用CPU最多的是PHP-fpm進(jìn)程
(7).怎么知道是php-fpm的那個(gè)函數(shù)導(dǎo)致了CPU使用率升高呢,我們來(lái)用perf分析一下。在第一個(gè)終端運(yùn)行下面的perf命令
# -g 開(kāi)啟調(diào)用關(guān)系分析,-p 指定 php-fpm 的進(jìn)程號(hào) 21515
$ perf top -g -p 21515
(8).按方向鍵切換到php-fpm,再按下會(huì)車(chē)鍵展開(kāi)php-fpm的調(diào)用關(guān)下,發(fā)現(xiàn)調(diào)用關(guān)系最終到了sqrt和add_function
(9).拷貝出nginx應(yīng)用的源碼,看看是不是調(diào)用了這兩個(gè)函數(shù):
# 從容器 phpfpm 中將 PHP 源碼拷貝出來(lái)
$ docker cp phpfpm:/app .
# 使用 grep 查找函數(shù)調(diào)用
$ grep sqrt -r app/ # 找到了 sqrt 調(diào)用
app/index.php: $x += sqrt($x);
$ grep add_function -r app/ # 沒(méi)找到 add_function 調(diào)用,這其實(shí)是 PHP 內(nèi)置函數(shù)
原來(lái)只有sqrt函數(shù)在ap/idex.php文件中調(diào)用了。看看這個(gè)文件的源碼:
$ cat app/index.php
// test only.
$x = 0.0001;
for ($i = 0; $i <= 1000000; $i++) {
$x += sqrt($x);
}
echo "It works!"
發(fā)現(xiàn)原來(lái)是測(cè)試代碼沒(méi)刪就直接發(fā)布應(yīng)用了。
(10).優(yōu)化:
# 停止原來(lái)的應(yīng)用
$ docker rm -f nginx phpfpm
# 運(yùn)行優(yōu)化后的應(yīng)用
$ docker run --name nginx -p 10000:80 -itd feisky/nginx:cpu-fix
$ docker run --name phpfpm -itd --network container:nginx feisky/php-fpm:cpu-fix
(11).重新在第二臺(tái)虛擬機(jī)中測(cè)試nginx性能:
$ ab -c 10 -n 10000 http://10.240.0.5:10000/
...
Complete requests:? ? ? 10000
Failed requests:? ? ? ? 0
Total transferred:? ? ? 1720000 bytes
HTML transferred:? ? ? ?90000 bytes
Requests per second:? ? 2237.04 [#/sec] (mean)
Time per request:? ? ? ?4.470 [ms] (mean)
Time per request:? ? ? ?0.447 [ms] (mean, across all concurrent requests)
Transfer rate:? ? ? ? ? 375.75 [Kbytes/sec] received
...
從這里可以發(fā)現(xiàn),現(xiàn)在每秒的請(qǐng)求數(shù),已經(jīng)從原來(lái)的11變成了2237
總結(jié):
CPU使用率是最直觀和最常用的系統(tǒng)性能指標(biāo),更是我們?cè)谂挪橄到y(tǒng)性能問(wèn)題時(shí)。通常會(huì)關(guān)注的第一個(gè)指標(biāo)。所以我們要熟悉它的含義,尤其要弄清楚用戶(hù)(user%)、NIce(%nice)、系統(tǒng)(%system),等待IO(%iowait),中斷(%irq),軟中斷(%softirq)
這幾種不同的CPU使用率。
(1).用戶(hù)和Nice CPU高,說(shuō)明用戶(hù)進(jìn)程占用了較多的CPU,所以應(yīng)該著重排查進(jìn)程的性能問(wèn)題
(2).系統(tǒng)CPU高,說(shuō)明內(nèi)核態(tài)占用了較多的CPU,所以應(yīng)該著重排查內(nèi)核線程或系統(tǒng)調(diào)用的性能問(wèn)題
(3).IO等待CPU高,說(shuō)明等待IO的時(shí)間比較長(zhǎng),應(yīng)該著重排查系統(tǒng)存儲(chǔ)是不是出現(xiàn)了IO問(wèn)題
(4).軟中斷和硬中斷高,說(shuō)明軟中斷或硬中斷處理程序占用了較多的CPU,所以應(yīng)該著重排查內(nèi)核中的中斷服務(wù)程序
碰到CPU使用率升高的問(wèn)題,可以借助TOP,pidstat等工具,確認(rèn)引發(fā)CPU性能問(wèn)題的來(lái)源,再使用perf等工具,排查出引起性能問(wèn)題的具體函數(shù)
標(biāo)簽:php,perf,0.0,nginx,linux,使用率,CPU
來(lái)源: https://www.cnblogs.com/maxwellsky/p/10658523.html
總結(jié)
以上是生活随笔為你收集整理的linux 使cpu使用率升高_关于linux系统CPU篇---gt;CPU使用率升高的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【技术白皮书】第四章:信息抽取技术产业应
- 下一篇: NDK 开发实战 - 封装 java 层