一篇文章告訴你,平均負載的來龍去脈
阿新 • • 發佈:2019-09-02
# 平均負載?沒有那麼難
## 前言
作為一名開發,我們繞不過去的一道坎是在伺服器上對系統進行監控,並且當系統出現異常情況,需要快速排查,我們今天瞭解的平均負載就是監控中重要的一環。
在學習**平均負載**之前,我們需要了解相關指標,根據指標看清楚相關問題。正因為如此,我們從淺入深瞭解如下知識。
1. 常用的相關命令
2. 平均負載
3. 相關工具瞭解
4. 案例解析
## 常用的相關命令
常用的top命令,uptime命令,htop命令命令。
### top
常用的效能分析工具,可以實時動態的檢視系統整體情況和各個程序的資源佔用情況,top命令提供動態互動式介面,還提供了熱鍵式操作。
關於top命令詳解可以參考 https://man.linuxde.net/top.
有top命令的詳細解析。該網站提供很多命令查詢,如果命令忘記了可以上去查詢。
> 注意:該網站是一個可以被收藏的工具網站
![2019-08-29-23-24-24](https://img2018.cnblogs.com/blog/1778247/201909/1778247-20190902001356194-1188084346.png)
### uptime
顯示系統執行時間與系統的平均負載,顯示時間依次為:現在時間,系統已經運行了多長時間,幾個線上使用者,平均負載。 可以結合**watch**使用。
```linux
ruiqi@ruiqi:~/content$ uptime
15:24:41 up 3 min, 2 users, load average: 0.34, 0.48, 0.22
```
### htop
htop是比top更詳細的監控軟體,操作上更加方便。有如下優勢:
1. 操作上比top相對來說簡單
2. 預設支援圖形介面的滑鼠操作
3. 橫向或者縱向的瀏覽程序列表,檢視所有程序,當然也包括完整的命令列。
還有更多的操作技巧,htop在各家的linux系統中並沒有預設安裝,需要在各家系統上進行安裝。
展示方式也跟top有類似的參照。
![2019-08-29-23-35-32](https://img2018.cnblogs.com/blog/1778247/201909/1778247-20190902001356758-1048227129.png)
## 平均負載
### 什麼是平均負載
在上面每個命令,都可以看到**load average**引數,這是平均負載的英文標識。三個順序分別為1min,5min,15min。
可能會有朋友說,平均負載不就是CPU使用率嘛?這句話說對也對,說不對也不對。
那怎麼說呢?
一般分析負載情況可以分為以下三種:
1. CPU密集型程序,需要大量消耗CPU資源,這時候大量的CPU消耗會導致平均負載的升高。
2. IO密集型程序,需要等待IO,這時候也會導致負載的增高,但這種情況CPU的使用並不高。
3. 還有一種就是等待CPU的情況,此時CPU消耗很高,cpu的等待也很高,平均負載也是很高的。
**說了平局負載升高的情況,那平均負載究竟是什麼呢?**
在瞭解平均負載之前,先了解下Linux中程序的幾種狀態:
- TASK_RUNNINT: 簡稱**R**,可執行狀態
- TASK_INTERRUPTIBLE:簡稱**S**,可中斷的睡眠狀態,能夠響應訊號。
- TASK_UNINTERRUPTIBLE:簡稱**D**,不可中斷的睡眠狀態。該狀態主要是顯示核心在處理一些流程時,是不可中斷的,不可中斷狀態可以認為是一種保護機制,來保證系統對程序和裝置之間的一致性。
- TASK_STOPPED || TASK_TRACED:簡稱**T**,暫停狀態或跟蹤狀態,
- TASK_DEAD - EXIT_ZOMBIE :簡稱**Z**,退出狀態,程序為殭屍程序,該程序不可被kill,不響應任務訊號。
- TASK_DEAD-EXIT_DEAD: 簡稱**X**,退出狀態,程序即將被銷燬。
平均負載呢,可以簡單地理解為在一定時間內,系統處於**可執行狀態**和**不可中斷狀態**的平均程序數。
1. 可執行狀態就是我們上面所說的TASK_RUNNING,可執行狀態,該狀態包含正在使用CPU或者等待CPU的程序。
2. 不可中斷狀態的程序:是我們上面所說的TASK_UNINTERRUPTIBLE,簡稱D的程序。
所以我們可以看到平均負載並不只是可執行狀態的程序,還包含著不可中斷的程序。
### 平均負載的評判標準
利用所說的top,uptime,htop命令,很方便的檢視系統現在負載的狀況。
但平均負載究竟是多少才算是不合理的資料呢?由於每個伺服器或者客戶機所擁有的的硬體配置不同,我們並不能簡簡單單的定義一個具體數值來說明平均負載的好與壞。
但我們瞭解**平均負載最理想的情況就是等於CPU的個數**,根據這一條,我們首先確定機器的CPU個數,方式有多種。
#### CPU的個數
- 從檔案中讀取
```linux
$ grep 'model name' /proc/cpuinfo
model name : Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz
model name : Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz
或者再用wc -l 統計一下
$ grep 'model name' /proc/cpuinfo | wc -l
2
```
- top/htop
使用top 再按快捷鍵1就可以看出有多少個CPU
![2019-08-31-12-38-45](https://img2018.cnblogs.com/blog/1778247/201909/1778247-20190902001356970-666420820.png)
使用htop,看數字可以看出有多少CPU
![2019-08-31-12-39-28](https://img2018.cnblogs.com/blog/1778247/201909/1778247-20190902001357100-880167808.png)
#### 評斷標準
瞭解CPU個數之後,視角轉回到**load average**上,發現該引數有三個數值,分別為1m,5m,15m,那我們該用哪個時間代表負載的標準呢?
其實也很簡單,他們分表代表的是1m,5m,15m內的負載均值情況,代表這段時間內負載執行的趨勢。根據不同時間內的值大小,可以評判出系統負載變化的趨勢,方便得出平均負載的變化。一般情況下,超過系統可容納負載70%的時候,監控人員就需要引起注意,並檢視系統是否出現異常情況。
當然該70%只是理論值,需要根據不同的機器做不同的判斷,比如伺服器屬於老舊伺服器,對於其負載指標可以降低負載均值。負載過高時,及時作出應急措施。
## 相關工具瞭解
由於我們並沒有實際的環境實現,則需要我們進行環境的模擬,那麼在實現案例之前需要先學習相關工具,幫助我們輔助實驗環境的搭建
### Stress
stress 是壓力測試工具,是Posix系統下生成CPU/Menory/IO/Disk負載的工具
#### Stress 安裝
- ubuntu上安裝
```ubuntu
sudo apt-get install stress
```
- centos 安裝
```centos
Centos 7
## 啟用第三方源
rpm -ivh http://apt.sw.be/redhat/el7/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
## 安裝stress
yum install stress
Centos 6
## 啟用三方源
yum install epel-release
## 安裝Stress
yum install stress
```
#### Stress 引數說明
```linux
-? 顯示幫助資訊
-v 顯示版本號
-q 不顯示執行資訊
-n,--dry-run 顯示已經完成的指令執行情況
-t --timeout N 指定執行N秒後停止
--backoff N 等待N微妙後開始執行
-c --cpu 產生n個程序 每個程序都反覆不停的計算隨機數的平方根
-i --io 產生n個程序 每個程序反覆呼叫sync(),sync()用於將記憶體上的內容寫到硬碟上
-m --vm n 產生n個程序,每個程序不斷呼叫記憶體分配malloc和記憶體釋放free函式
--vm-bytes B 指定malloc時記憶體的位元組數 (預設256MB)
--vm-hang N 指示每個消耗記憶體的程序在分配到記憶體後轉入休眠狀態,與正常的無限分配和釋放記憶體的處理相反,這有利於模擬只有少量記憶體的機器
-d --hadd n 產生n個執行write和unlink函式的程序
--hadd-bytes B 指定寫的位元組數,預設是1GB
--hadd-noclean 不要將寫入隨機ASCII資料的檔案Unlink
時間單位可以為秒s,分m,小時h,天d,年y,檔案大小單位可以為K,M,G
```
#### Stress 使用教程
- 多CPU
```linux
stress -c 13
```
![2019-08-31-00-57-02](https://img2018.cnblogs.com/blog/1778247/201909/1778247-20190902001357231-1808307360.png)
- 多io操作
```linux
stress --io 5
stress -i 5
```
- 產生多個CPU與多個io程序並且定時1分鐘停止
```Linux
stress -c 4 -i 4 --timeout 1m
stress: info: [19613] dispatching hogs: 4 cpu, 4 io, 0 vm, 0 hdd
stress: info: [19613] successful run completed in 60s
```
- 輸出檔案到本地
```Linux
stress -d 1 --hdd-bytes 1G
```
當然stress並不止這些內容,但有一點注意**stress無法模擬更復雜的場景**,並且stress的壓力CPU是在使用者態,核心態並沒有產生壓力。如果需要更復雜的壓力測試我們還可以使用stress-ng。
### sysstat
sysstat是常用的效能監控工具包,裡面包含了多個性能工具。比如我們下面要用的mpstat,pidstat,iostat,sar等指令。
#### 安裝
1. ubuntu
```linux
sudo apt-get install sysstat
```
2.centos
```centos
yum install sysstat
```
#### mpstat
mpstat會輸出所有CPU的平均統計資訊
命令使用:
```linux
~$ mpstat -A 該命令等同於我們 mpstat -u -l ALL -p ALL
Linux 4.15.0-55-generic (ruiqi) 08/31/2019 _x86_64_ (2 CPU)
07:15:31 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
07:15:31 AM all 0.77 0.01 1.83 17.85 0.00 0.21 0.00 0.00 0.00 79.32
07:15:31 AM 0 0.74 0.01 1.42 16.58 0.00 0.42 0.00 0.00 0.00 80.83
07:15:31 AM 1 0.81 0.02 2.25 19.11 0.00 0.01 0.00 0.00 0.00 77.81
07:15:31 AM NODE %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
07:15:31 AM all 0.77 0.01 1.83 17.85 0.00 0.21 0.00 0.00 0.00 79.32
07:15:31 AM 0 0.76 0.01 1.80 17.49 0.00 0.21 0.00 0.00 0.00 77.70
07:15:31 AM CPU intr/s
07:15:31 AM all 177.24
07:15:31 AM 0 118.28
07:15:31 AM 1 119.02
07:15:31 AM CPU 0/s 1/s 6/s 8/s 9/s 12/s 14/s 15/s 16/s 17/s 18/s 19/s 24/s 25/s 26/s 27/s 28/s 29/s 30/s 31/s 32/s 33/s 34/s 35/s 36/s 37/s 38/s 39/s 40/s 41/s 42/s 43/s 44/s 45/s 46/s 47/s 48/s 49/s 50/s 51/s 52/s 53/s 54/s 55/s 56/s 57/s 58/s NMI/s LOC/s SPU/s PMI/s IWI/s RTR/s RES/s CAL/s TLB/s TRM/s THR/s DFR/s MCE/s MCP/s HYP/s ERR/s MIS/s PIN/s NPI/s PIW/s
07:15:31 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 42.52 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.59 0.13 0.00 0.00 41.94 0.00 0.00 0.00 0.00 16.35 0.18 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
07:15:31 AM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 2.89 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.27 0.00 0.00 0.00 55.25 0.00 0.00 0.00 0.00 17.08 0.04 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
07:15:31 AM CPU HI/s TIMER/s NET_TX/s NET_RX/s BLOCK/s IRQ_POLL/s TASKLET/s SCHED/s HRTIMER/s RCU/s
07:15:31 AM 0 0.00 28.96 0.19 0.00 42.85 0.00 0.13 25.51 0.00 20.65
07:15:31 AM 1 0.00 45.75 0.00 2.89 0.25 0.00 0.08 41.03 0.00 29.01
```
命令說明:
- P: 攜帶ALL, 將每個CPU的統計資訊進行輸出。
```linux
ruiqi@ruiqi:~$ mpstat -P ALL
Linux 4.15.0-55-generic (ruiqi) 08/31/2019 _x86_64_ (2 CPU)
07:17:31 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
07:17:31 AM all 0.77 0.01 1.83 17.83 0.00 0.21 0.00 0.00 0.00 79.34
07:17:31 AM 0 0.74 0.01 1.42 16.57 0.00 0.42 0.00 0.00 0.00 80.85
07:17:31 AM 1 0.80 0.02 2.25 19.09 0.00 0.01 0.00 0.00 0.00 77.83
```
- N: 代表每隔幾秒輸出CPU的資訊
- I: 代表輸出每個處理器的中斷統計資訊
- u: 代表輸出所有CPU的統計資訊
### pidstat
pidstat 用來監控程序和當前受核心管理的執行緒,並且還可以檢查子程序和執行緒的狀態
```linux
pidstat -t -p 程序號 2 3 #每隔兩秒對指定程序的cpu資訊統計輸出3次
pidstat -p ALL # 展示所有程序資訊
pidstat -u 5 1 # 展示CPU資訊,每五秒展示一組
pidstat -d 2 # 輸出io統計訊息, 2秒為統計資訊
```
## 案例
從上面例子可以看到負載升高的幾種情景,為了幫助我們理解這方面的內容,則我們建立一個例子來演示下。
### 機器環境如下
搭建虛擬機器環境:
- 雙核
- 記憶體是2g
- 作業系統是ubuntu18.04
- 安裝stress,top,htop
### CPU密集型程序
CPU密集型程序,需要大量消耗CPU資源,這時候大量的CPU消耗會導致平均負載的升高。
藉助stress 模擬CPU密集程序。
```Linux
stress -c 10 --timeout 600
```
使用top命令檢視平均負載。
![2019-08-31-14-53-58](https://img2018.cnblogs.com/blog/1778247/201909/1778247-20190902001357351-73041736.png)
從圖上可看到load average 正在逐步的升高。系統已經進入高負載。
mpstat -p ALL 顯示所有資訊,檢查是什麼導致負載升高
![2019-08-31-20-37-36](https://img2018.cnblogs.com/blog/1778247/201909/1778247-20190902001357490-713155813.png)
由圖上可知,CPU的使用率基本上都為100%而iowait等待則為0,代表平均負載的升高是由CPU使用率高導致的。
那究竟怎麼看是哪一個程序導致CPU使用率這麼高的,在這裡就可以使用pidstat命令檢視。
```linux
pidstat -p ALL # 展示所有程序資訊
pidstat -u 5 1 # 展示CPU資訊,每五秒展示一組
pidstat -d 2 # 輸出io統計訊息, 2秒為統計資訊
pidstat -t -p 程序號 2 3 #每隔兩秒對指定程序的cpu資訊統計輸出3次
```
### other
IO密集型程序,需要等待IO,這時候也會導致負載的增高,但這種情況CPU的使用並不高,多程序的方式造成的負載升高。
這兩種情況都是使用mpstat來觀察負載,找到cpu超標還是io等待或者是程序多導致cpu等待造成的負載升高,最後使用pidstat找到對應的程序,檢查其情況。
## 總結
本文主要描述平均負載來源,順帶的說了下壓力測試工具stress,stress-ng,mpstat,pidstat指令。
用這些工具輔助我們來進行系統監控與問題查詢。
·END·
路雖遠,行則必至
本文原發於 同名微信公眾號「胖琪的升級之路」,回覆「1024」你懂得,給個讚唄。
微信ID:YoungRUIQ
![公眾號](https://img2018.cnblogs.com/blog/1778247/201909/1778247-20190902001358148-748666685.png)
·END·
路雖遠,行則必至
本文原發於 同名微信公眾號「胖琪的升級之路」,回覆「1024」你懂得,給個讚唄。
微信ID:YoungRUIQ
![公眾號](https://img2018.cnblogs.com/blog/1778247/201909/1778247-20190902001358148-748666