做性能測試的必備知識系列,可以看下面連結的文章哦
https://www.cnblogs.com/poloyy/category/1806772.html
每次發現系統變慢時,通常做的第一件事,就是執行 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 的程序,等待 I/O 的程序
而 CPU 使用率,是機關時間内 CPU 繁忙情況的統計,跟平均負載并不一定完全對應
CPU 密集型程序:使用大量 CPU 會導緻平均負載升高,此時兩者是一緻的
I/O密集型程序:等待 I/O 也會導緻平均負載身高,但 CPU 使用率不一定很高
大量等待 CPU 的程序排程也會導緻平均負載升高,此時的 CPU 使用率也會比較高