集群監控
大型互聯網企業的背后,依靠的是成千上萬台服務器日夜不停的運轉,以支撐其業務的運轉。宕機對於互聯網企業來說,代價是沉重的,輕則影響用戶體驗,重則直接影響交易,導致交易下跌,並且給企業聲譽造成不可挽回的損失。對於這些機器對應的開發和運維人員來說,即便是每台機器登陸一次,登陸那么多台機器也夠嗆,何況還需要進行系統指標的檢查。因此,依靠人力是不可能完成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表示按單位格式化輸出。該命令顯示sda1一共有19GB的空間,使用了4.3GB,剩余14GB可用。
如果要查看具體目錄所占用的內存空間,分析大文件所處位置,可以使用du命令來進行查看:
-d指定了遞歸深度為1層,表示只列出指定目錄的下一級目錄文件大小,-h用來表示格式化輸出。
磁盤I/O
磁盤I/O的繁忙程度也是一個重要的系統指標,對於I/O密集型的應用來說,比如數據庫應用和分布式文件系統,I/O的繁忙程度也一定程度上反映了系統的負載情況,容易成為應用程序性能的瓶頸。可以使用iostat來查看系統的I/O狀況:
看到報錯,這也很正常。Linux環境下每個命令就和Windows環境下的軟件一樣,必須先安裝再使用,按照報錯的提示來看,iostat當前並沒有安裝。所以我們按照提示的來安裝一下sysstat就可以了:
安裝完畢后,再使用iostat:
-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。