load average?基礎(chǔ)
平均負(fù)載(load average)提供了一個快速查看系統(tǒng)整體性能的手段盈罐,反映了系統(tǒng)整體的負(fù)載情況锤岸。
它是指單位時間內(nèi)麦箍,系統(tǒng)處于可運行狀態(tài)和不可中斷狀態(tài)的平均進程數(shù)的指數(shù)衰減平均值应闯。
這個 "指數(shù)衰減平均" 只是一種更快速的計算方式期丰,你把它直接當(dāng)成活躍進程數(shù)的平均值。
所謂可運行狀態(tài)的進程敌完,是指正在使用 CPU 或者正在等待 CPU 的進程储耐。
也就是我們常用 ps/top 命令看到的處于 R 狀態(tài)(Running 或 Runnable)的進程。
不可中斷狀態(tài)的進程則是正處于內(nèi)核態(tài)中的進程滨溉,并且這些流程是不可被打斷的什湘。
比如最常見的是等待硬件設(shè)備的 I/O 響應(yīng),也就是我們在 ps/top 命令中看到的 D 狀態(tài)(Uninterruptible Sleep业踏,也稱為 Disk Sleep)的進程禽炬。
比如,當(dāng)一個進程向磁盤讀寫數(shù)據(jù)時勤家,為了保證數(shù)據(jù)的一致性,在得到磁盤 Ack 前柳恐,它是不能被其他進程打斷的伐脖,這個時候的進程就處于不可中斷狀態(tài)热幔。如果此時的進程被打斷了,就容易出現(xiàn)磁盤與進程內(nèi)數(shù)據(jù)不一致的問題讼庇。
因此绎巨,不可中斷狀態(tài)實際上是系統(tǒng)對進程和硬件設(shè)備的一種保護機制。
既然平均的是活躍進程數(shù)蠕啄,那么最理想的场勤,就是每個 CPU 上都剛好運行著一個進程,這樣每個 CPU 都得到了充分利用歼跟。
比如當(dāng)平均負(fù)載為 2 時和媳,意味著什么呢?
1哈街、在只有 2 個 CPU 的系統(tǒng)上留瞳,意味著所有的 CPU 都剛好被完全占用;
2骚秦、在 4 個 CPU 的系統(tǒng)上她倘,意味著 CPU 有 50% 的空閑;
3作箍、而在只有 1 個 CPU 的系統(tǒng)中硬梁,則意味著有一半的進程競爭不到CPU。
平均負(fù)載最理想的情況是等于 CPU 個數(shù)胞得。所以在評判平均負(fù)載時靶溜,首先你要知道系統(tǒng)有幾個 CPU。
這可以通過 top(按 1) 命令懒震、lscpu 命令或者從文件 /proc/cpuinfo 中讀取
# grep 'model name' /proc/cpuinfo | wc -l
推薦的方法是監(jiān)控系統(tǒng)的平均負(fù)載罩息,根據(jù)更多的歷史數(shù)據(jù),來判斷系統(tǒng)負(fù)載的變化趨勢个扰。
一旦負(fù)載過高瓷炮,就可能導(dǎo)致進程響應(yīng)變慢,進而影響服務(wù)的正常功能递宅。
既然平均負(fù)載代表的是平均活躍進程數(shù)娘香,那平均負(fù)載高了,不就意味著CPU 使用率高嗎办龄?
我們還是要回到平均負(fù)載的含義上來烘绽,平均負(fù)載是指單位時間內(nèi),處于可運行狀態(tài)和不可中斷狀態(tài)的進程數(shù)俐填。
所以安接,它不僅包括了正在使用 CPU 的進程,還包括等待 CPU 和等待 I/O 的進程英融。
而 CPU 使用率盏檐,是單位時間內(nèi) CPU 繁忙情況的統(tǒng)計歇式,跟平均負(fù)載并不一定完全對應(yīng)。
比如以下幾種情況:
1胡野、CPU 密集型進程材失,使用大量 CPU 會導(dǎo)致平均負(fù)載升高,此時這兩者是一致的硫豆。
2龙巨、I/O 密集型進程,等待 I/O 也會導(dǎo)致平均負(fù)載升高熊响,但 CPU 使用率不一定很高旨别。
3、大量等待 CPU 的進程調(diào)度也會導(dǎo)致平均負(fù)載升高耘眨,此時的 CPU 使用率也會比較高(主要是 sys cpu 較高)昼榛。比如 CPU上下文切換。
注意:系統(tǒng)的平均負(fù)載(load average)和 CPU 使用率并沒直接關(guān)系剔难。
Linux load average 的誤區(qū)
Load average 的概念源自 Unix 系統(tǒng)胆屿,用于衡量 runnable processes 的數(shù)量。
但是在 Linux 上的 load average 除了包括 Running 和 Runnable process 數(shù)量之外偶宫,還包括 uninterruptible sleep 的進程數(shù)量非迹。
通常等待 I/O 設(shè)備、等待網(wǎng)絡(luò)的時候纯趋,進程會處于 uninterruptible sleep 狀態(tài)憎兽。
Linux 設(shè)計者可能認(rèn)為 uninterruptible sleep 應(yīng)該都是非常短暫的,所以被等同于 runnable吵冒。
然而現(xiàn)實世界中 uninterruptible sleep 未必很短暫纯命。大量的、或長時間的 uninterruptible sleep 通常意味著 I/O 設(shè)備可能遇到了瓶頸痹栖。
我們知道:sleep 狀態(tài)的進程是不需要 CPU 的亿汞,即使所有的 CPU 都空閑,正在 sleep 的進程也是運行不了的揪阿。
所以 Linux 把 uninterruptible sleep 進程加入到 load average 的計算的做法直接顛覆了 load average 本來的意義疗我。
因此在 Linux 系統(tǒng)上,當(dāng)看到 load average 很高的時候南捂,你不知道是 runnable 進程太多還是 uninterruptible sleep 進程太多吴裤,也就無法判斷是 CPU 不夠用還是 I/O 設(shè)備有瓶頸。