01 uptime命令
通常我們發現系統變慢時,我們都會執行top或者uptime命令,來查看當前系統的負載情況,比如像下面,我執行了uptime,系統回傳的了結果,
[root@lincoding ~]# uptime
08:31:49 up 27 min, 1 user, load average: 0.07, 0.04, 0.00
前幾列的資訊,相信大家都很熟悉,它們分別是當前時間、系統運行時間和正在登陸的用戶個數,最后一個就是系統平均負載的情況,
08:31:49 // 當前時間
up 27 min // 系統運行時間
1 user // 正在登錄用戶數
load average: 0.07, 0.04, 0.00 // 平均負載的情況
Load Average的三個數字,依次則是過去1分鐘、5分鐘、15分鐘的平均負載,可以通過觀察這三個數字的大小,可以簡單判斷系統的負載是下降的趨勢還是上升的趨勢,
- 如果
load average: 1.00, 5.00, 10.00三個數字依次增大,則說明在過去的 1 分鐘系統的負載比過去 15 分鐘系統的負載小,表明系統的負載是下降的趨勢, - 如果
load average: 10.00, 5.00, 1.00三個數字依次降低,則說明在過去的 1 分鐘系統的負載比過去 15 分鐘系統的負載大,表明系統的負載是上升的趨勢, - 如果
load average: 0.07, 0.04, 0.0三個數字基本相同,或者相差不大, 表明系統的負載是平穩的,
所以分析系統的負載情況,必須要看三個不同時間間隔的平均值,
02 平均負載概念
平均負載很多人容易理解成單位時間內的 CPU 使用率,這是不正確的,平均負載確實與 CPU 使用率有關系,但不是直接的關系,
簡單來說,平均負載是指單位時間內,系統處于可運行狀態和不可中斷狀態的平均行程數,也就是平均活躍行程數,它和 CPU 使用率并沒有直接關系,
- 可運行狀態,是指正在使用 CPU 或者正在等待 CPU 的行程,也就是在 ps 命令看到的 R 狀態的行程,
- 不可中斷狀態,是指正處于內核關鍵流程中的行程,并且這些流程是不可以打斷的,比如最常見的等待硬體設備的 I/O 回應,也就是在 ps 命令看到的 D 狀態的行程,
因此,平均負載其實就是平均活躍行程數,可以更直觀的理解成單位時間內的活躍行程數,
既然平均的是活躍行程數,那么最理想的,就是每個CPU上剛好運行著一個行程,這樣每個CPU就得到了充分利用,
比如當平均負載為2時,意味著:
- 在只有 2 個 CPU 的系統上,意味著所有的 CPU 都剛好被完全占用,
- 在4個CPU的系統上,意味著 CPU 有 50% 的空閑,
- 在只有 1 個 CPU 的系統中,則意味著有一半的行程競爭不到 CPU,
03 平均負載為多少時合理
在評判你當前的系統平均負載是否合理的時,首先你要知道系統有幾個 CPU,可以通過 lscpu 命令或者從檔案 /proc/cpuinfo 中讀取
# lscpu 命令查看 CPU 個數
[root@lincoding ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4 # 這里數字表示 CPU 個數
....
# 從檔案 /proc/cpuinfo 中查看 CPU 個數
[root@lincoding ~]# grep 'model name' /proc/cpuinfo | wc -l
4
有了 CPU 個數,我們就可以判斷出,當平均負載比 CPU 個數還大的時候,系統已經出現了過載,
這里我再舉個例子,假設我們在一個單 CPU 系統上看到平均負載為 1.73,0.60,7.98
- 在過去 1 分鐘內,系統有 73% 的超載
- 在過 15 分鐘內,有 698%的超載,從整體趨勢來看,系統的負載在降低,
平均負載高于 CPU 數量 70% 的時候,就應該分析排查負載高的問題了,一旦負載過高,就可能導致行程回應變慢,進而影響服務的正常功能,
04 平均負載與 CPU 使用率
我們經常容易把平均負載和 CPU 使用率混淆,所以在這里,我也做一個區分,
再次說明下,平均負載是指單位時間內,處于可運行狀態和不可中斷狀態的行程數,所以,它不僅包括了正在使用 CPU 的行程,還包括等待 CPU 和等待 I/O 的行程,
而 CPU 使用率,是單位時間內 CPU 繁忙情況的統計,跟平均負載并不一定完全對應,比如:
- CPU 密集型行程,使用大量 CPU 會導致平均負載升高,此時這兩者是一致的;
- I/O 密集型行程,等待 I/O 也會導致平均負載升高,但 CPU 使用率不一定很高;
- 大量等待 CPU 的行程調度也會導致平均負載升高,此時的 CPU 使用率也會比較高,
05 平均負載升高分析命令
我們現在很清楚的知道導致平均負載高的情況,不只是看 CPU 的使用率,也要觀察系統 I/O 等待時間高不高,
當發現平均負載升高時,可以使用 mpstat 命令查看 CPU 的性能,
# -P ALL 表示監控所有CPU,后面數字1表示間隔1秒后輸出一組資料
$ mpstat -P ALL 1
Linux 2.6.32-431.el6.x86_64 (lzc) 11/05/2019 _x86_64_ (2 CPU)
07:51:45 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
07:51:50 PM all 42.90 0.00 49.39 0.41 0.00 4.56 0.00 0.00 2.74
07:51:50 PM 0 44.38 0.00 48.67 0.41 0.00 2.86 0.00 0.00 3.68
07:51:50 PM 1 41.57 0.00 49.80 0.40 0.00 6.43 0.00 0.00 1.81
從上面發現
- CPU 的用戶層(%usr)使用率高達45%左右;
- CPU 的系統層(%sys)使用率高達50%左右;
- CPU 的 I/0 - 等待(%iowait)占用率為0.41%;
- CPU 的空閑率(%idle)只有2~3%,
可以推斷出是由于 CPU 使用率導致平均負載升高的情況,
假設只有 CPU 的I/0 等待(%iowait)占用率高,CPU 用戶層和系統層使用率很輕松,那么導致平均負載升高的原因就是 iowait 的升高,
判斷了是因為 CPU 使用率升高還是 iowait 升高導致平均負載升高后,我們還需要定位是哪個行程導致的,可以用 pidstat 來查詢:
# 間隔1秒后輸出一組資料,-u表示CPU指標
$ pidstat -u 1
08:07:55 PM PID %usr %system %guest %CPU CPU Command
08:07:56 PM 4 0.00 1.00 0.00 1.00 0 ksoftirqd/0
08:07:56 PM 9 0.00 1.00 0.00 1.00 1 ksoftirqd/1
08:07:56 PM 11 0.00 16.00 0.00 16.00 0 events/0
08:07:56 PM 12 0.00 20.00 0.00 20.00 1 events/1
08:07:56 PM 616 7.00 6.00 0.00 13.00 1 pppoe
08:07:56 PM 2745 6.00 6.00 0.00 12.00 1 pppoe
可以發現是 events/0 和 events/1 內核行程 CPU 使用率非常高,所以可能這兩個行程導致平均負載升高,
06 小結
平均負載提供了一個快速查看系統整體性能的手段,反映了整體的負載情況,但只看平均負載本身,我們并不能直接發現,到底是哪里出現了瓶頸,所以,在理解平均負載時,也要注意:
- 平均負載高有可能是 CPU 密集型行程導致的;
- 平均負載高并不一定代表 CPU 使用率高,還有可能是 I/O 更繁忙了;
- 當發現負載高的時候,你可以使用
mpstat、pidstat等工具,輔助分析負載的來源,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/157887.html
標籤:Linux
下一篇:Centos7開放及查看埠

