系統服務監控指標--load、CPU利用率、磁碟剩餘空間、磁碟I/O、記憶體使用情況等

誰主沉浮oo7發表於2020-09-15

介紹

大型網際網路企業的背後,依靠的是成千上萬臺伺服器日夜不停的運轉,以支撐其業務的運轉。當機對於網際網路企業來說,代價是沉重的,輕則影響使用者體驗,重則直接影響交易,導致交易下跌,並且給企業聲譽造成不可挽回的損失。對於這些機器對應的開發和運維人員來說,即便是每臺機器登陸一次,登陸那麼多臺機器也夠嗆,何況還需要進行系統指標的檢查。因此,依靠人力是不可能完成24小時不間斷監控伺服器的任務的。

如今,網際網路已經深入到人們生活的每個角落,可以想象一下,假如哪一天Google或者Baidu不能搜尋,抑或是amazon或者taobao不能進行購物,這個世界將會如何?因此,成熟穩健的系統往往需要對叢集執行時的各個指標進行收集,如系統的load、CPU利用率、I/O繁忙程度、網路traffic、記憶體利用率、應用心跳等,對這些資訊進行實時監控,如發現異常情況,能夠第一時間通知到相應的開發和運維人員進行處理,在使用者還沒有察覺之前處理完故障和異常,將損失降低到最低。

下面來看一下,常見的系統監控指標。

load:反映系統忙閒程度

在Linux系統中,可以通過top和uptime命令來檢視系統的load值,那麼什麼是load呢?系統的load被定義為特定時間間隔內執行佇列中的平均執行緒數,如果一個執行緒滿足以下條件,該執行緒就會處於執行佇列中:

沒有處於I/O等待狀態
沒有主動進入等待狀態,也就是沒有呼叫wait操作
沒有被終止當然load計算的演算法較為複雜,因此,這種情況也不是絕對的。

load值越大,也就意味著系統的CPU越繁忙,這樣執行緒執行完以後等待作業系統分配下一個時間片段的時間也就越長。假設:

CPU1分鐘內最多處理100個執行緒任務,load值為0.2,意味著這1分鐘內CPU處理了20個任務
CPU1分鐘內最多處理100個執行緒任務,load值為1,意味著這1分鐘內CPU剛好將這100個任務處理完
CPU1分鐘內最多處理100個執行緒任務,load值為1.7,意味著這1分鐘內CPU除了處理了這100個任務外,還有70個任務等待處理
當然,load的計算演算法較為複雜,並不像上面說的這麼簡單,這麼打比方只是為了簡單說明問題。假設一般來說,只要load值不大於3,我們認為它的負載是正常的(考慮到多核CPU的系統),如果load值大於5,則表示當前系統的負載已經非常高了,需要採取相應的措施來降低系統的負載。

w、top、uptime這三個命令都可以用來檢視系統的load值,下面演示一下使用uptime命令檢視系統的load:

load average後面跟的三個值分別表示在過去1分鐘、5分鐘、15分鐘內系統的load值。

CPU利用率:反映CPU的使用和消耗情況

在Linux系統中,CPU的時間消耗主要在這幾個方面:使用者程式、核心程式、中斷處理、I/O等待、Nice時間、丟失時間、空閒等幾個部分,而CPU的利用率則為這些時間所佔用的總時間的百分比。通過CPU的利用率,能夠反映出CPU的使用和消耗情況。

可以通過top命令來檢視Linux系統的CPU消耗情況:

上面一部分,也就是"%Cpu(s)"開頭的內容是我們需要關注的,後面跟的列便是各種狀態下CPU所消耗的時間比,看下每一列的意思:

  • 使用者時間(User Time)即us所對應的列,表示CPU執行使用者程式所佔用的時間,通常情況下希望us的佔比越高越好
  • 系統時間(System Time)即sy所對應該的列,表示CPU自核心態所花費的時間,sy佔比比較高通常意味著系統在某些方面設計得不合理,比如頻繁的系統呼叫導致的使用者態和核心態的頻繁切換
  • Nice時間(Nice Time)即ni所對應的列,表示系統在調整程式優先順序的時候所花費的時間
  • 空閒時間(Idle Time)即id所對應的列,表示系統處於空閒期,等待程式執行,這個過程所佔用的時間。當然,我們希望id的佔比越低越好
  • 等待時間(Waiting Time)即wa所對應的列,表示CPU在等待I/O操作所花費的時間,系統不應該花費大量的時間來進行等待,否則便表示可能有某個地方設計不合理
  • 硬體中斷處理時間(Hard Irq Time)即hi對應的列,表示系統處理硬體中斷所佔用的時間
  • 軟體中斷處理時間(Soft Irq Time)即si對應的列,表示系統處理軟體中斷所佔用的時間
  • 丟失時間(Steal Time)即st對應的列,實在硬體虛擬化開始流行後作業系統新增的一列,表示被強制等待虛擬CPU的時間

對於多個或多核CPU的情況,常常需要檢視每個CPU的利用情況,此時可以按1,便可以檢視到每個核的CPU利用率:
若看到上面只出現了"%Cpu0"而不是"%Cpu(s)",因為只有一個CPU,所以只展示Cpu0的CPU利用率

磁碟剩餘空間

磁碟剩餘空間也是一個非常關鍵的指標,如果磁碟沒有足夠的剩餘空間,正常的日誌寫入以及系統I/O都將無法進行。

通過df命令可以檢視磁碟的剩餘空間:

-h表示按單位格式化輸出。該命令顯示/dev/mapper/centos-root一共有148GB的空間,使用了38GB,剩餘103GB可用。

如果要檢視具體目錄所佔用的記憶體空間,分析大檔案所處位置,可以使用du命令來進行檢視:
-d指定了遞迴深度為1層,表示只列出指定目錄的下一級目錄檔案大小,-h用來表示格式化輸出。

磁碟I/O

磁碟I/O的繁忙程度也是一個重要的系統指標,對於I/O密集型的應用來說,比如資料庫應用和分散式檔案系統,I/O的繁忙程度也一定程度上反映了系統的負載情況,容易成為應用程式效能的瓶頸。可以使用iostat來檢視系統的I/O狀況:

-d表示檢視磁碟使用狀況,-k表示以KB為單位顯示。各個列中,Device表示裝置名稱、tps表示每秒處理的I/O請求數、kB_read/s表示每秒從裝置讀取的資料量、kB_wrtn/s表示每秒向裝置寫入的資料量、kB_read表示讀取的資料總量、kB_wrtn表示寫入的資料總量。

記憶體使用情況

程式執行時的資料載入、執行緒併發、I/O緩衝等,都依賴於記憶體,可用記憶體的大小決定了程式是否能正常執行以及執行的效能。

通過free命令能夠檢視到系統的記憶體使用情況,加上-m參數列示以MB為單位:

Linux的記憶體包括實體記憶體Mem和虛擬記憶體Swap,下面介紹每一列的含義:

  • total----記憶體總共的大小
  • used----已使用的記憶體大小
  • free----可使用的記憶體大小
  • shared----多個程式共享的記憶體大小
  • buffers----緩衝區的大小
  • cached----快取的大小

Linux系統的記憶體管理機制與Windows系統有所不同,其中有一個思想便是記憶體利用率最大化,核心會將剩餘的記憶體申請為cached,而cached不屬於free範疇。因此,當系統執行時間較長時,會發現cached這塊區域比較大,對於有頻繁檔案讀/寫操作的系統,這種現象更為明顯。

但是,free的記憶體小,並不代表可用小,當程式需要申請更大的記憶體時,如果free記憶體不夠,系統會將剩餘部分cached會buffers記憶體回收,回收的記憶體再分配給應用程式。因此,Linux可用於分配的記憶體不僅僅只有free的記憶體。可看free命令顯示的第三行,也就是"-/+ buffers/cache"對應的行,這一行將記憶體進行了重新計算,used減去buffers和cached佔用的記憶體,而free則加上了buffers和cached對應的記憶體。

對於應用來說,更值得關注的應該是虛擬記憶體Swap的消耗,Swap記憶體使用過多,表示實體記憶體已經不夠用了,作業系統將本應該實體記憶體儲存的一部分記憶體頁排程到磁碟上,以騰出足夠的空間給當前的程式使用。當其他程式需要執行時,再從磁碟將記憶體的頁排程到實體記憶體當中,以恢復程式的執行。而這個排程的過程中,會產生Swap I/O,如果Swap I/O較為頻繁,將嚴重地影響系統的效能。

通過vmstat命令,可以檢視到Swap I/O的情況:

其中,swap列的si表示每秒從磁碟交換到記憶體的資料量,單位是KB/s,so表示每秒從記憶體交換到磁碟的資料量,單位也是KB/s。

參考

https://www.cnblogs.com/xrq730/p/5171463.html

結語

歡迎關注微信公眾號『碼仔zonE』,專注於分享Java、雲端計算相關內容,包括SpringBoot、SpringCloud、微服務、Docker、Kubernetes、Python等領域相關技術乾貨,期待與您相遇!

相關文章