一文理解 Linux 平均負(fù)載,附排查工具
公眾號(hào)關(guān)注“杰哥的IT之旅”,
選擇“星標(biāo)”,重磅干貨,第一時(shí)間送達(dá)!

什么是平均負(fù)載
平均負(fù)載可以對(duì)于我們來(lái)說(shuō)及熟悉又陌生,但我們問(wèn)平均負(fù)載是什么,但大部分人都回答說(shuō)平均負(fù)載不就是單位時(shí)間內(nèi)CPU使用率嗎?其實(shí)并不是這樣的,如果可以的話,可以 man uptime 來(lái)了解一下平均負(fù)載的詳細(xì)信息。
簡(jiǎn)單的說(shuō)平均負(fù)載是指單位時(shí)間內(nèi),系統(tǒng)處于可運(yùn)行狀態(tài)和不可中斷狀態(tài)的平均進(jìn)程數(shù),也就是說(shuō)平均活躍進(jìn)程數(shù),它和CPU使用率并沒(méi)有直接關(guān)系。這里解釋一下可運(yùn)行狀態(tài)和不可中斷這兩個(gè)詞。
可運(yùn)行狀態(tài):
指正在使用CPU或者正在等待CPU的進(jìn)程,我們使用ps命令查看處于R狀態(tài)的進(jìn)程
不可中斷狀態(tài):
進(jìn)程則是正處于內(nèi)核態(tài)關(guān)鍵流程中的進(jìn)程,并且這些流程是不可中斷的。例如:常見(jiàn)的等待硬件設(shè)備I/O的響應(yīng),也就是我們?cè)趐s命令查看處于D狀態(tài)的進(jìn)程
比如,當(dāng)一個(gè)進(jìn)程向磁盤讀寫數(shù)據(jù)時(shí),為了保證數(shù)據(jù)的一致性,在得到磁盤回復(fù)前,它是不能被其他進(jìn)程中斷或者打斷的,這個(gè)時(shí)候的進(jìn)程處于不可中斷狀態(tài),如果此時(shí)的進(jìn)程被打斷了,就容易出現(xiàn)磁盤數(shù)據(jù)和進(jìn)程數(shù)據(jù)不一致的問(wèn)題。
所以,不可中斷狀態(tài)實(shí)際上是系統(tǒng)進(jìn)程和硬件設(shè)備的一種保護(hù)機(jī)制。
因此,你可以簡(jiǎn)單理解為,平均負(fù)載就是平均活躍進(jìn)程數(shù)。平均活躍進(jìn)程數(shù),直觀上的理解就是單位時(shí)間內(nèi)的活躍進(jìn)程數(shù),但它實(shí)際上是活躍進(jìn)程數(shù)的指數(shù)衰減平均值。既然是平均活躍進(jìn)程數(shù),那么理想狀態(tài),就是每個(gè)CPU上都剛好運(yùn)行著一個(gè)進(jìn)程,這樣每個(gè)CPU都會(huì)得到充分的利用。例如平均負(fù)載為2時(shí),意味著什么呢?
在只有2個(gè)CPU的系統(tǒng)上,意味著所有的CPU剛好被完全占用
在4個(gè)CPU的系統(tǒng)上,意味著CPU有50%的空閑
而在只有1個(gè)CPU的系統(tǒng)上,則意味著有一半的進(jìn)程競(jìng)爭(zhēng)不到CPU
平均負(fù)載和CPU使用率
現(xiàn)實(shí)工作中,我們經(jīng)常容易把平均負(fù)載和CPU使用率混淆,所以在這里,我也做一個(gè)分區(qū)。
可能你會(huì)疑惑,既然平均負(fù)載代表的是活躍進(jìn)程數(shù),那平均負(fù)載高了,不就意味著CPU使用率高嗎?
我們還是要回到平均負(fù)載的含義上來(lái),平均負(fù)載是指單位時(shí)間內(nèi),處于可運(yùn)行狀態(tài)和不可中斷狀態(tài)的進(jìn)程數(shù),所以,它不僅包括了正常使用CPU的進(jìn)程,還包括了等待CPU和等待I/O的進(jìn)程。
而CPU使用率,是單位時(shí)間內(nèi)CPU的繁忙情況的統(tǒng)計(jì),跟平均負(fù)載并不一定完全對(duì)應(yīng),例如:
CPU密集型進(jìn)程,使用大量CPU會(huì)導(dǎo)致平均負(fù)載升高,此時(shí)這兩者是一致的
I/O密集型進(jìn)程,等待I/O也會(huì)導(dǎo)致平均負(fù)載升高,但CPU使用率不一定很高
大量等待CPU的進(jìn)程調(diào)度也會(huì)導(dǎo)致平均負(fù)載升高,此時(shí)的CPU使用率會(huì)很高
平均負(fù)載案例
這里我們需要安裝幾個(gè)工具sysstat、stress、stress-ng
這里Centos的sysstat版本會(huì)老一點(diǎn),最好升級(jí)到最新版本。手動(dòng)rpm安裝或者源碼安裝
場(chǎng)景一、CPU密集型
1、運(yùn)行一個(gè)stress命令,模擬一個(gè)CPU使用率100%場(chǎng)景
$?stress?--cpu?1?--timeout?600
2、開(kāi)啟第二個(gè)終端,uptime查看平均負(fù)載的變化情況
$?watch?-d?uptime
?09:40:35?up?80?days,?18:41,??2?users,??load?average:?1.62,?1.10,?0.87
3、開(kāi)啟第三個(gè)終端,mpstat 查看CPU使用率的變化情況
$?mpstat?-P?ALL?5?20
10:06:37?AM??CPU????%usr???%nice????%sys?%iowait????%irq???%soft??%steal??%guest??%gnice???%idle
10:06:42?AM??all???31.50????0.00????0.35????0.00????0.00????0.00????0.00????0.00????0.00???68.15
10:06:42?AM????0????1.20????0.00????0.80????0.00????0.00????0.00????0.00????0.00????0.00???98.00
10:06:42?AM????1????7.21????0.00????0.40????0.00????0.00????0.00????0.00????0.00????0.00???92.38
10:06:42?AM????2??100.00????0.00????0.00????0.00????0.00????0.00????0.00????0.00????0.00????0.00
10:06:42?AM????3???17.43????0.00????0.20????0.00????0.00????0.00????0.00????0.00????0.00???82.36
#?-P?ALL?表示監(jiān)控所有CPU,后面數(shù)字5?表示間隔5秒輸出一次數(shù)據(jù)
從第二個(gè)終端可以看到,1分鐘平均負(fù)載增加到1.62,從第三個(gè)終端我們可以看到有一個(gè)CPU使用率100%,但iowait為0,這說(shuō)明平均負(fù)載的升高正式由CPU使用率為100%
那我們查看是那個(gè)進(jìn)程導(dǎo)致了CPU使用率為100%呢?我們可以使用pidstat來(lái)查看:
#每5秒輸出一次數(shù)據(jù)
$?pidstat?-u?5?1?
10:08:41?AM???UID???????PID????%usr?%system??%guest???%wait????%CPU???CPU??Command
10:08:46?AM?????0?????????1????0.20????0.00????0.00????0.00????0.20?????0??systemd
10:08:46?AM?????0???????599????0.00????1.00????0.00????0.20????1.00?????0??systemd-journal
10:08:46?AM?????0??????1043????0.60????0.00????0.00????0.00????0.60?????0??rsyslogd
10:08:46?AM?????0??????6863??100.00????0.00????0.00????0.00??100.00?????3??stress
10:08:46?AM?????0??????7303????0.20????0.20????0.00????0.00????0.40?????2??pidstat
從這里我們可以看到是stress這個(gè)進(jìn)程導(dǎo)致的。
場(chǎng)景二、I/O密集型進(jìn)程
1、我們使用stress-ng命令,但這次模擬I/O壓力,既不停執(zhí)行sync:
#--hdd表示讀寫臨時(shí)文件
#-i?生成幾個(gè)worker循環(huán)調(diào)用sync()產(chǎn)生io壓力
$?stress-ng?-i?4?--hdd?1?--timeout?600
2、開(kāi)啟第二個(gè)終端運(yùn)行uptime查看平均負(fù)載情況
$?watch?-d?uptime?
?10:30:57?up?98?days,?19:39,??3?users,??load?average:?1.71,?0.75,?0.69
3、開(kāi)啟第三個(gè)終端運(yùn)行mpstat查看CPU使用率
$?mpstat?-P?ALL?5?20
10:32:09?AM??CPU????%usr???%nice????%sys?%iowait????%irq???%soft??%steal??%guest??%gnice???%idle
10:32:14?AM??all????6.80????0.00???33.75???26.16????0.00????0.39????0.00????0.00????0.00???32.90
10:32:14?AM????0????4.03????0.00???69.57???19.91????0.00????0.00????0.00????0.00????0.00????6.49
10:32:14?AM????1???25.32????0.00????9.49????0.00????0.00????0.95????0.00????0.00????0.00???64.24
10:32:14?AM????2????0.24????0.00???10.87???63.04????0.00????0.48????0.00????0.00????0.00???25.36
10:32:14?AM????3????1.42????0.00???36.93???14.20????0.00????0.28????0.00????0.00????0.00???47.16
從這里可以看到,1分鐘平均負(fù)載會(huì)慢慢增加到1.71,其中一個(gè)CPU的系統(tǒng)CPU使用率升到63.04。這說(shuō)明,平均負(fù)載的升高是由于iowait升高。
那么我們到底是哪個(gè)進(jìn)程導(dǎo)致的呢?我們使用pidstat來(lái)查看:
$?pidstat?-u?5?1
Average:??????UID???????PID????%usr?%system??%guest???%wait????%CPU???CPU??Command
Average:????????0?????????1????0.00????0.19????0.00????0.00????0.19?????-??systemd
Average:????????0????????10????0.00????0.19????0.00????1.56????0.19?????-??rcu_sched
Average:????????0???????599????0.58????1.75????0.00????0.39????2.33?????-??systemd-journal
Average:????????0??????1043????0.19????0.19????0.00????0.00????0.39?????-??rsyslogd
Average:????????0??????6934????0.00????1.56????0.00????1.17????1.56?????-??kworker/2:0-events_power_efficient
Average:????????0??????7383????0.00????0.39????0.00????0.78????0.39?????-??kworker/1:0-events_power_efficient
Average:????????0??????9411????0.00????0.19????0.00????0.58????0.19?????-??kworker/0:0-events
Average:????????0??????9662????0.00???97.67????0.00????0.19???97.67?????-??kworker/u8:0+flush-253:0
Average:????????0?????10793????0.00????0.97????0.00????1.56????0.97?????-??kworker/3:2-mm_percpu_wq
Average:????????0?????11062????0.00???21.79????0.00????0.19???21.79?????-??stress-ng-hdd
Average:????????0?????11063????0.00????1.95????0.00????1.36????1.95?????-??stress-ng-io
Average:????????0?????11064????0.00????2.72????0.00????0.39????2.72?????-??stress-ng-io
Average:????????0?????11065????0.00????1.36????0.00????1.75????1.36?????-??stress-ng-io
Average:????????0?????11066????0.00????2.72????0.00????0.58????2.72?????-??stress-ng-io
可以發(fā)現(xiàn)是stress-ng導(dǎo)致的
場(chǎng)景三、大量進(jìn)程的場(chǎng)景
當(dāng)系統(tǒng)中運(yùn)行進(jìn)程超出CPU運(yùn)行能力時(shí),就會(huì)出現(xiàn)等待CPU的進(jìn)程。
比如:我們使用stress,但這次模擬8個(gè)進(jìn)程:
$?stress?-c?8?--timeout?600
我們的系統(tǒng)只有4顆CPU,這時(shí)候要運(yùn)行8個(gè)進(jìn)程,是明顯不夠的,系統(tǒng)的CPU后嚴(yán)重過(guò)載,這時(shí)候負(fù)載值達(dá)到了4點(diǎn)多:
$??uptime
?10:56:22?up?98?days,?20:05,??3?users,??load?average:?4.52,?2.82,?2.67
接著我們運(yùn)行pidstat來(lái)查看一下進(jìn)程的情況:
$?pidstat?-u?5?1
Linux?5.0.5-1.el7.elrepo.x86_64?(k8s-m1)?????07/11/2019?????_x86_64_????(4?CPU)
10:57:33?AM???UID???????PID????%usr?%system??%guest???%wait????%CPU???CPU??Command
10:57:38?AM?????0?????????1????0.20????0.00????0.00????0.00????0.20?????1??systemd
10:57:38?AM?????0???????599????0.00????0.99????0.00????0.20????0.99?????2??systemd-journal
10:57:38?AM?????0??????1043????0.60????0.20????0.00????0.00????0.79?????1??rsyslogd
10:57:38?AM?????0?????12927???51.59????0.00????0.00???48.21???51.59?????0??stress
10:57:38?AM?????0?????12928???44.64????0.00????0.00???54.96???44.64?????0??stress
10:57:38?AM?????0?????12929???45.44????0.00????0.00???54.56???45.44?????2??stress
10:57:38?AM?????0?????12930???45.44????0.00????0.00???54.37???45.44?????2??stress
10:57:38?AM?????0?????12931???51.59????0.00????0.00???48.21???51.59?????3??stress
10:57:38?AM?????0?????12932???48.41????0.00????0.00???51.19???48.41?????1??stress
10:57:38?AM?????0?????12933???45.24????0.00????0.00???54.37???45.24?????3??stress
10:57:38?AM?????0?????12934???48.81????0.00????0.00???50.99???48.81?????1??stress
10:57:38?AM?????0?????13083????0.00????0.40????0.00????0.20????0.40?????0??pidstat
可以看出,8個(gè)進(jìn)程搶占4顆CPU,每個(gè)進(jìn)程等到CPU時(shí)間(%wait)高達(dá)50%,這些都超出CPU計(jì)算能力的進(jìn)程,最終導(dǎo)致CPU過(guò)載。
本文作者:大胖猴
本文鏈接:https://www.cnblogs.com/xzkzzz/p/11164089.html
如果您覺(jué)得這篇文章對(duì)您有點(diǎn)用的話,麻煩您為本文來(lái)個(gè)四連:轉(zhuǎn)發(fā)分享、點(diǎn)贊、點(diǎn)在看、留言,因?yàn)檫@將是我寫作與分享更多優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力!
本公眾號(hào)全部博文已整理成一個(gè)目錄,請(qǐng)?jiān)诠娞?hào)后臺(tái)回復(fù)「m」獲取!
推薦閱讀:
1、原創(chuàng)專輯 | Linux 基礎(chǔ)
2、原創(chuàng)專輯 | Linux 實(shí)戰(zhàn)
3、Linux 系統(tǒng)常用命令速查手冊(cè)
4、Linux!為何他一人就寫出這么強(qiáng)的系統(tǒng),中國(guó)卻做不出來(lái)?
5、5分鐘帶你了解 Linux 常用命令全稱!
6、Linux 的文件系統(tǒng)及文件緩存知識(shí)點(diǎn)整理
7、Linux 自帶神器 logrotate 詳解!
8、CentOS 7上搭建 Zabbix4.0!
9、CentOS 7 上搭建 K8s 環(huán)境教程!
10、記住!這些 Linux 命令千萬(wàn)不要運(yùn)行! 關(guān)注微信公眾號(hào)「杰哥的IT之旅」,后臺(tái)回復(fù)「1024」查看更多內(nèi)容,回復(fù)「加群」備注:地區(qū)-職業(yè)方向-昵稱?即可加入讀者交流群。
推薦閱讀:
2、原創(chuàng)專輯 | Linux 實(shí)戰(zhàn)
3、Linux 系統(tǒng)常用命令速查手冊(cè)
4、Linux!為何他一人就寫出這么強(qiáng)的系統(tǒng),中國(guó)卻做不出來(lái)?
5、5分鐘帶你了解 Linux 常用命令全稱!
6、Linux 的文件系統(tǒng)及文件緩存知識(shí)點(diǎn)整理
7、Linux 自帶神器 logrotate 詳解!
8、CentOS 7上搭建 Zabbix4.0!
9、CentOS 7 上搭建 K8s 環(huán)境教程!
10、記住!這些 Linux 命令千萬(wàn)不要運(yùn)行!
點(diǎn)個(gè)[在看],是對(duì)杰哥最大的支持!

