做效能測試的必備知識系列,可以看下面連結的文章哦
https://www.cnblogs.com/poloyy/category/1806772.html
uptime 命令入門
每次發現系統變慢時,通常做的第一件事,就是執行 top 或者 uptime 命令,來了解系統的負載情況
六個引數講解
引數 | 含義 |
10:08:47 | 當前時間 |
up 10:24 | 系統執行時間 |
1 user | 正在登入使用者數 |
0.13 | 過去 1 分鐘的平均負載 |
0.09 | 過去 5 分鐘的平均負載 |
0.03 | 過去 15 分鐘的平均負載 |
靈魂拷問
平均負載就是單位時間內的 CPU 使用率嗎?上面的0.13,代表 CPU 使用率是13%是嗎?
靈魂回答
其實並不是這樣的,我們通過 man uptime 檢視 uptime 命令的解釋
接下來,我們可以進入下一個知識點了
什麼是平均負載?
簡單來說
單位時間內,系統處於可執行狀態和不可中斷狀態的平均程式數,也就是平均活躍程式數,它和 CPU 使用率並沒有直接關係
可執行狀態的程式
正在使用 CPU 或者正在等待 CPU 的程式,在 ps 命令看到的,處於 R 狀態(Running 或 Runnable)的程式
不可中斷狀態的程式
- 正處於核心態關鍵流程中的程式,並且這些流程是不可打斷的
- 比如:最常見的是等待硬體裝置的 I/O 響應,也就是在 ps 命令中看到的 D 狀態(Uninterruptible Sleep,也稱為 Disk Sleep)的進
不可中斷狀態程式的具體栗子
- 一個進程向磁碟讀寫資料時,為了保證資料的一致性,在得到磁碟迴復前,它是不能被其他程式或者中斷打斷的,這個時候的程式就處於不可中斷狀態
- 如果此時的程式被打斷了,就容易出現磁碟資料與程式資料不一致的問題
總結
- 不可中斷狀態實際上是系統對程式和硬體裝置的一種保護機制
- 平均負載可理解成平均活躍程式數
- 平均活躍程式數,就是單位時間內的活躍程式數
平均負載的理想狀態
每個 CPU 上都剛好執行著一個程式,這樣每個 CPU 都得到了充分利用
栗子
比如平均負載 = 2時
- 當系統有 2 個 CPU,意味著所有 CPU 剛好被完全佔用
- 當系統有 4 個 CPU,意味著有 50% 的 CPU 是空閒的
- 當系統有 1 個 CPU,意味著一半的程式競爭不到 CPU
平均負載為多少時合理
靈魂拷問一
在 uptime 命令的結果裡,那三個時間段的平均負載數,多大的時候能說明系統負載高?或是多小的時候就能說明系統負載很低呢?
回答
- 首先,我們得知道 CPU 數量,可以檢視這篇部落格:https://www.cnblogs.com/poloyy/p/13307051.html
- 當平均負載比 CPU 數量還大的時候,系統已出現了過載
靈魂拷問二
平均負載有三個數值,到底該參考哪一個呢?
回答
都要看,三個不同時間間隔的平均值,提供了分析系統負載趨勢的資料來源,可以更全面地瞭解目前的負載狀態
參考栗子
- 1 分鐘、5 分鐘、15 分鐘的三個值基本相同,相差不大:系統負載很平穩
- 1 分鐘的值遠小於 15 分鐘的值:系統最近 1 分鐘的負載在減少,而過去 15 分鐘內卻有很大的負載
- 1 分鐘的值遠大於 15 分鐘的值:系統最近 1 分鐘的負載在增加,這種情況需要觀察,因為可能是臨時性的,也可能是持續性;
- 一旦 1 分鐘的平均負載接近或超過了 CPU 的個數,就意味著系統正在發生過載的問題,這時就得分析調查是哪裡導致的問題,並要想辦法優化了
實際栗子
假設在一個單 CPU 系統上看到平均負載為 1.73,0.60,7.98
- 1 分鐘內:系統有 73% 的超載
- 15分鐘內:系統有 698% 的超載
- 從整體趨勢來看:系統的負載在降低
靈魂拷問三
在實際生產環境中,平均負載多高時,需要重點關注?
回答
- 當平均負載高於 CPU 數量 70% 的時候,就應該考慮分析排查負載高的問題了
- 一旦負載過高,可能導致程式響應變慢,進而影響服務的正常功能
- 但 70% 這個數字只是建議,可根據業務變化
- 最好的辦法還是將系統的平均負載監控起來,然後根據更多的歷史資料,判斷負載的變化趨勢
- 當發現負載有明細升高趨勢時,比如:負載翻倍了,再去做分析和調查
平均負載和 CPU 使用率的關係
提出疑問
平均負載就是平均活躍程式數,那活躍程式數多了,不就等於 CPU 使用率高嘛?
回答
- 前面說到,平均負載時指單位時間內,處於可執行狀態和不可中斷狀態的程式數
- 這裡包括了:正在使用 CPU 的程式,等待使用 CPU 的程式,等待 I/O 的程式
- 而 CPU 使用率,是單位時間內 CPU 繁忙情況的統計,跟平均負載並不一定完全對應
平均負載和 CPU 使用率的一些小栗子
- CPU 密集型程式:使用大量 CPU 會導致平均負載升高,此時兩者是一致的
- I/O密集型程式:等待 I/O 也會導致平均負載身高,但 CPU 使用率不一定很高
- 大量等待 CPU 的程式排程也會導致平均負載升高,此時的 CPU 使用率也會比較高