1. 程式人生 > >一篇文章告訴你,平均負載的來龍去脈

一篇文章告訴你,平均負載的來龍去脈

# 平均負載?沒有那麼難 ## 前言 作為一名開發,我們繞不過去的一道坎是在伺服器上對系統進行監控,並且當系統出現異常情況,需要快速排查,我們今天瞭解的平均負載就是監控中重要的一環。 在學習**平均負載**之前,我們需要了解相關指標,根據指標看清楚相關問題。正因為如此,我們從淺入深瞭解如下知識。 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