<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一文理解 Linux 平均負(fù)載,附排查工具

          共 7115字,需瀏覽 15分鐘

           ·

          2020-11-10 18:14

          公眾號(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è)方向-昵稱?即可加入讀者交流群。

          點(diǎn)個(gè)[在看],是對(duì)杰哥最大的支持!


          瀏覽 30
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大香蕉网伊人在线 | 色女孩国产视频 | 婷婷在线无码 | 日韩黄页网站免 | 美女精品视频 |