1. 程式人生 > 其它 >一文讓你明白平均負載

一文讓你明白平均負載

1. 什麼是平均負載

首先,我們先理解下什麼是平均負載。

平均負載是指單位時間內,系統處於可執行狀態不可中斷狀態的平均程序數,也就是平均活躍程序數,它和 CPU 使用率並沒有直接關係。(為什麼和 CPU 使用率沒直接關係,這個我後面說明)

那麼問題來了,可執行狀態和不可中斷狀態又是什麼東西呢?

所謂可執行狀態的程序,是指正在使用 CPU 或者正在等待 CPU 的程序,也就是我們常用 ps 命令看到的,處於 R 狀態(Running 或 Runnable)的程序。

而不可中斷狀態的程序,則是正處於核心態關鍵流程中的程序,並且這些流程是不可打斷的,比如最常見的是等待硬體裝置的 I/O 響應,也就是我們在 ps 命令中看到的 D 狀態(Uninterruptible Sleep,也稱為 Disk Sleep)的程序。

比如,當一個程序向磁碟讀寫資料時,為了保證資料的一致性,在得到磁盤迴復前,它是不能被其他程序或者中斷打斷的,這個時候的程序就處於不可中斷狀態。如果此時的程序被打斷了,就容易出現磁碟資料與程序資料不一致的問題。

所以,不可中斷狀態實際上是系統對程序和硬體裝置的一種保護機制。

明白了什麼是平均負載後,那麼自然就是要知道怎麼用了。

2. 如何檢視平均負載

當我們使用 uptime 命令時,會出現以下結果(這是我本機的結果,每個人的機器情況不一樣)

$ uptime
02:34:03 up 2 days, 20:14,  1 user,  load average: 0.63, 0.83, 0.88

對應解釋:

02:34:03              // 當前時間
up 2 days, 20:14      // 系統執行時間
1 user                // 正在登入使用者數

最後三個數字呢,依次則是過去 1 分鐘、5 分鐘、15 分鐘的平均負載(Load Average)。

明白了怎麼看平均負載後,那麼平均負載到底是多少才是合理的呢?

3. 平均負載的合理值

當平均負載高於 CPU 數量 70% 的時候。就應該分析排查負載高的問題了。一旦負載過高,就可能導致程序響應變慢,進而影響服務的正常功能。

但 70% 這個數字並不是絕對的,最推薦的方法,還是把系統的平均負載監控起來,然後根據更多的歷史資料,判斷負載的變化趨勢(可從 uptime 得到的三個數字分析)。當發現負載有明顯升高趨勢時,比如說負載翻倍了,你再去做分析和調查。

平均負載在最理想的情況下,就是每個 CPU 上都剛好執行著一個程序,這樣每個 CPU 都得到了充分利用。

比如當平均負載為 2 時,意味著什麼呢?

  • 在只有 2 個 CPU 的系統上,意味著所有的 CPU 都剛好被完全佔用。
  • 在 4 個 CPU 的系統上,意味著 CPU 有 50% 的空閒。
  • 而在只有 1 個 CPU 的系統中,則意味著有一半的程序競爭不到 CPU。

好了,關於平均負載的基本知識差不多就是這樣。現在,我來填下開頭的坑 —— 為什麼和 CPU 使用率沒直接關係呢?

4. 平均負載與 CPU 使用率

在文章最開始的時候就有提到,平均負載是指單位時間內,處於可執行狀態和不可中斷狀態的平均程序數。所以,它不僅包括了正在使用 CPU的程序,還包括等待 CPU等待 IO的程序。

而 CPU 使用率,是單位時間內 CPU 繁忙情況的統計,跟平均負載並不一定完全對應。比如:

  • CPU 密集型程序,使用大量 CPU 會導致平均負載升高,此時這兩者是一致的。
  • I/O 密集型程序,等待 I/O 也會導致平均負載升高,但 CPU 使用率不一定很高。
  • 大量等待 CPU 的程序排程也會導致平均負載升高,此時的 CPU 使用率也會比較高

以上,就是文章的全部內容了,如果覺得有幫助的話,那就點個贊吧

本文整理自極客時間:《Linux效能優化實戰》