目前互聯(lián)網(wǎng)公司的服務(wù)器一般采用Linux系統(tǒng),同時(shí),為了實(shí)時(shí)監(jiān)控服務(wù)器的健康狀況,我們通常編寫Shell腳本或Python腳本來(lái)監(jiān)控測(cè)試服務(wù)器的各項(xiàng)指標(biāo),包括CPU、內(nèi)存、IO等指標(biāo),本期將介紹Linux中常見的監(jiān)控指令。
CPU
說(shuō)到監(jiān)控CPU,目前主要是監(jiān)控CPU的使用率,以及每一個(gè)進(jìn)程占用CPU資源,Linux系統(tǒng)中主要使用 top、vmstat、pstree 三個(gè)命令。
1. top
直接輸入 top,返回下圖所示內(nèi)容,其中,load average: 0.00,0.01,0.05 分別表示最近1分鐘、5分鐘和15分鐘的負(fù)載,數(shù)值越高負(fù)載越大。一般要求最好不要超過(guò)cpu的核數(shù)。比如,單核就最好小于1。如果看到機(jī)器長(zhǎng)期出于高于核數(shù)的情況,說(shuō)明機(jī)器的cpu排隊(duì)嚴(yán)重。
%Cput(s)這一行表示的是cpu使用情況,例如cpu的利用率、空閑等信息。如果按下數(shù)字鍵“1”,還可以看到每一個(gè)核的情況。
我們還可以查看每一個(gè)進(jìn)程的情況,可以運(yùn)行的時(shí)候加上-p參數(shù):top -p pid即可。如果想按照某種方式排序,只需要按下大寫的字母“O”,即可選擇排序。
2. vmstat
直接輸入 vmstat n 表示n秒鐘顯示一次整個(gè)機(jī)器的CPU、內(nèi)存、I/O使用情況,如下圖所示,我們先來(lái)看下和CPU相關(guān)的參數(shù),其中,r表示運(yùn)行隊(duì)列,如果這個(gè)值很大,則說(shuō)明很多進(jìn)程在排隊(duì)等待執(zhí)行。更說(shuō)明現(xiàn)在cpu忙的很,壓力山大。
in和cs:這兩個(gè)值分別代表中斷次數(shù)和上下文切換次數(shù)。這兩個(gè)值越大,代表系統(tǒng)在進(jìn)行大量的進(jìn)程切換。這說(shuō)明我們的進(jìn)程數(shù)(或者線程數(shù))太大,導(dǎo)致系統(tǒng)不斷的在切換進(jìn)程,應(yīng)該盡量減少進(jìn)程或線程數(shù)量。
us、sy、id和wa:這四個(gè)值分別代表用戶進(jìn)程、系統(tǒng)進(jìn)程、空閑和等待的cpu時(shí)間占比。us越高說(shuō)明用戶進(jìn)程占用cpu越高、sy則代表系統(tǒng)進(jìn)程占用。如果id很高,恭喜你,你的機(jī)器很閑;如果wa很高,則說(shuō)明你的機(jī)器因?yàn)閕o很忙而造成cpu等待。
3. pstree
pstree命令以樹狀圖的方式展現(xiàn)進(jìn)程之間的派生關(guān)系,顯示效果比較直觀。
Mem
內(nèi)存主要可以從整個(gè)系統(tǒng)內(nèi)存情況、各個(gè)進(jìn)程對(duì)應(yīng)內(nèi)存使用情況和每個(gè)進(jìn)程內(nèi)存詳細(xì)情況三個(gè)緯度進(jìn)行監(jiān)控,其中整個(gè)系統(tǒng)內(nèi)存情況可以使用 vmstat 和 free 兩個(gè)指令,每個(gè)進(jìn)程對(duì)應(yīng)內(nèi)存情況可以使用 top 和 ps 兩個(gè)指令,而每個(gè)進(jìn)程內(nèi)存詳細(xì)情況可以使用 pmap 和 jmap 。
1. vmstat
2. free
其中,total = used + free + buffer/cache,單位是K。
3. top
如上圖所示,%MEM表示每個(gè)進(jìn)程使用內(nèi)存空間對(duì)應(yīng)整個(gè)內(nèi)存占比,除此之外,還有三個(gè)和內(nèi)存有關(guān)的參數(shù)分別是:VIRT(Virtual Memory Usage)、RES(Resident Memory Usage)、SHR(Shared Memory),它們分別表示進(jìn)程占用的虛擬內(nèi)存的大小、進(jìn)程使用的常駐內(nèi)存大?。ㄋ硎具M(jìn)程實(shí)際使用內(nèi)存的情況。一般情況下,我們看內(nèi)存用了多少,實(shí)際就是關(guān)注這個(gè)值)和共享內(nèi)存的大小(包括共享內(nèi)存、共享庫(kù)占用的大小等)。
4. pmap
使用 pmap + 進(jìn)程號(hào),我們可以看到指定進(jìn)程到底在哪個(gè)庫(kù)、哪些文件上使用了多少內(nèi)存,方便我們來(lái)定位內(nèi)存的使用。
5. jmap
jmap是java提供的內(nèi)存查看工具,能看java進(jìn)程的對(duì)象內(nèi)存分配的詳細(xì)情況。#instances表示對(duì)象實(shí)例數(shù)量 ,#bytes表示對(duì)象實(shí)例占用總內(nèi)存數(shù),單位是字節(jié) ,class name表示對(duì)象實(shí)例名稱 。最后一行表示總實(shí)例數(shù)量與總內(nèi)存占用數(shù)。
IO
磁盤監(jiān)控包含磁盤情況和磁盤性能分析,磁盤情況可以通過(guò) df 命令和fdisk 命令,來(lái)看看我們磁盤的大小以及其他的信息,而磁盤性能分析則可以通過(guò) vmstat 命令。
1. df 和 fdisk
可以看到/dev/下有一個(gè)42.9G的硬盤,它有83886080個(gè)扇區(qū),每個(gè)扇區(qū)512bytes大小,目前已使用5%。
2. vmstat
在vmstat的狀態(tài)統(tǒng)計(jì)信息里:b值代表因?yàn)閕o阻塞排隊(duì)的任務(wù)數(shù);bi值代表每秒寫入磁盤的塊數(shù);bo值代表每秒讀出磁盤的塊數(shù);wa值代表因?yàn)镮O等待消耗的cpu時(shí)間比例。這幾個(gè)值變大,都意味著IO的消耗增加。對(duì)于讀請(qǐng)求大的服務(wù)器,一般b、bi、wa都會(huì)比較大,而對(duì)于寫入量大的服務(wù)器,一般b、bo、wa都會(huì)比較大。