監控數據的獲取

proc文件系統,想必大家都有所耳聞了,是個博大精深的東東,對於監控來說,幾乎所有的監控數據,來源都是這個文件系統,對系統來講,最重要的監控數據CPU、MEMORY、TRAFFIC等數據,在proc下都可以找到原版內容:

CPU部分
/proc/stat

# cat /proc/stat 

cpu 338758358 17608 62785863 1552185970 42674246 335813 0
cpu0 154122800 7685 41026079 282062239 21481645 335553 0
cpu1 49070293 3954 7468733 434153362 8339637 84 0
cpu2 57780017 3708 7206014 427779389 6573674 90 0
cpu3 77785246 2260 7085034 408190979 6279289 85 0
intr 6211038753 710161351 9 0 2 2 0 0 0 ……
ctxt 7959101395
btime 1257942445
processes 72552965
procs_running 1
procs_blocked 1
這個文件,相比大家比較熟悉了,這裏反映的,就是整個cpu的運作狀況,第一行,是cpu總的運行狀況,第二行到第五行不固定,如果你有8個cpu,那就是8行了,我們有4個cpu,那就是4行,反映的是每個cpu的運行狀況。
後面跟的數字,分別代表不同的意義,單位是時間片,就是內核分配給進程的最小的cpu時間,進程持有時間片,而進入cpu來進行運算。這裏數字的意義,就是累加到現在,cpu總共執行了多少個時間片,具體從左往右的順序如下:
user:進程用戶空間執行的時間片的個數
nice:被nice調整過的進程在用戶控件執行的時間片的個數
system:進程在內核空間執行的時間片的個數
idle:空閒的時間片個數
iowait:進程等待外設io的時間片個數
irq:中斷佔用的時間片
softirq:軟終端佔用的時間片
這就是著名的cpu七大項,其實對我們比較重要的,也就四項:user,system,iowait,idle,其餘的三項基本上是0,在2.6.11以後又加了一個steal,2.6.24以後加了guest,具體我也沒看,以後補充
intr:中斷次數,第一個值,是到現在爲止,中斷的累加值,以後的每個值分別爲不同種類中斷的次數。中斷的類型,在/proc/interrupts中。中斷的原因有很多,可能是外部的io,例如鍵盤、網卡、硬盤等,也可能是進程自己產生的,也可能是內核產生的。
ctxt:上下文切換次數,就是在cpu中運行的線程和運行隊列裏的線程切換的次數。也是累加值。當切換過多的時候,會引起很多不必要的性能損耗。
btime:系統啓動到現在的時間,單位爲秒
processes:系統啓動後,產生的進程數,包括fork()產生的,和clone()產生的。
procs_running:在cpu中運行的進程數
procs_blocked:被阻塞的,等待i/o完成的進程數

cpu是否被充分利用,並不是只簡簡單單看幾個cpu使用時間就夠了,其實這個遠遠不夠,什麼情況下,cpu纔算是被充分利用了呢?對於一個運算量比較大的系統來講,應該有以下幾個條件:
1、cpu的idle要接近0,idle就是空閒的意思,空閒很多的cpu,不能算是充分利用,所以,cpu被充分利用的機器,idle的百分比佔用應該大概是5%上下
2、cpu的user/system要接近7/3,cpu的絕大部分時間用來進行用戶空間的計算,一部分時間用來進行內核空間的調度,內核的調度是必須的,但是真正對我們意義大的,應該還是用戶空間的計算。
3、每個核的負載不能超過3,如果有4個核,那你的負載最好不要大於10,有一定的負載是必須的,因爲每個線程都會有等待外設的時候,比如等待網絡,等待硬盤io等,這段時間內,別的線程可以進入cpu進行運算,但是如果這個數太大的話,那不光要等外設,恐怕也需要等cpu了。
4、上下文切換不能過多,每個進程要在cpu裏進行運算一段時間,滿足它的運算需求,如果上下文切換過多,說明運行隊列裏的線程不斷相互切換,這時候,會發現cpu的system部分特別多,只切換過程,就佔用了大量的cpu運算時間,這是一種比較大的損耗。所以,如果中斷很多,上下文切換很少,那說明進程基本上駐留在cpu裏,對硬件設備發起請求;如果中斷很少,上下文切換很多,那估計中斷都是用來進行上下文切換的,進程到cpu裏屁股還沒坐熱呢,啥都沒幹,就又被趕出去了。

當然,這只是一種理想的狀況,前提就是進程是偏向於計算的,對io的要求不是很高。當內存出了問題,發生oom的時候,那會發生很多swap和memory之間的交互,到時候,大量的cpu時間,恐怕就是在等待swap和內存的交換了,iowait會非常高,這種情況,雖然idle也是0,但是顯然沒能做什麼運算。

內存部分

/proc/buddyinfo

# cat /proc/buddyinfo 

Node 0, zone DMA 4 4 3 3 3 3 2 0 1 1 2
Node 0, zone Normal 140 90 34 5201 2816 556 29 0 0 0 0
Node 0, zone HighMem 0 2542 1859 253 961 3568 560 19 1 0 0

內存管理的信息,主要用來分析內存碎片的

內存分爲三個區域,DMA,Normal,HighMem,如果分頁大小爲4K,那我們可以分區域來看:

DMA:

有4塊1頁大小的空間、4塊2頁大小的空間,3塊4頁大小的空間,3塊8頁大小的空間。。。。。。

Normal:

有140塊1頁大小的空間、90塊2頁大小的空間。。。。。。

以此類推,越是往後的空間,就越是連續,數目越多,就代表這個大小的連續空間越多,當大的連續空間很少的時候,也就說明,內存碎片已經非常多了。

/proc/meminfo

# cat /proc/meminfo

MemTotal: 4147776 kB
MemFree: 1186840 kB
Buffers: 308812 kB
Cached: 2074696 kB
SwapCached: 103392 kB
Active: 1266316 kB
Inactive: 1597560 kB
HighTotal: 3275100 kB
HighFree: 745984 kB
LowTotal: 872676 kB
LowFree: 440856 kB
SwapTotal: 2096472 kB
SwapFree: 1902584 kB
Dirty: 82136 kB
Writeback: 0 kB
Mapped: 397812 kB
Slab: 77040 kB
CommitLimit: 4170360 kB
Committed_AS: 2965004 kB
PageTables: 4196 kB
VmallocTotal: 106488 kB
VmallocUsed: 3008 kB
VmallocChunk: 103064 kB
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 2048 kB
存放的是內存使用的信息,基本上linux對內存的分配,就全在這裏了。
MemTotal:所有可用內存,不等於物理內存大小,因爲有一部分kernel使用的,直接被劃去了
MemFree:當前空閒的內存,提到這裏,就不得不提到linux的兩個進程,kswapd,和pdflush,隨後我會詳細講
Buffers:讀寫的緩存,就是內核在調用read()或者write()時候的緩存,也就是文件句柄的緩存,如果讀寫的文件在cache中,那buffer也會對被cache的文件做緩存的
Cached:對文件的緩存
SwapCached:被swap的內存頁,又被交換回內存中的那部分,但是實際上,在swap分區上的這部分信息還未被刪除
Active:被頻繁使用的內存,除非特殊需求,不會被回收
Inactive:相對於Active而存在的,如果內存緊張,就會被回收
HighTotal/HighFree/LowTotal/LowFree:High和Low主要是針對內核來講的,內核一般會使用Low Memory,High Memory主要是給用戶用的,當Low Memory沒有的時候,就掛了
SwapTotal/SwapFree:不多說了
Dirty:針對Cache來講的,在內存裏修改了,未被寫回磁盤的
Writeback:已經寫回磁盤的
Mapped:主要是針對被映射到內存裏的庫文件講的
Slab:內核的數據函數緩存
CommitLimit:這個和內核參數vm.overcommit_ratio有關
Committed_AS:這個是進程總共申請的內存大小,如果一個進程申請了400M內存,那這裏就會有它的400M,雖然它只用了100M,而留着300M空閒
VmallocTotal/VmallocUsed/VmallocChunk:屬於vmalloc的空間選項
kswapd和pdfulsh,是linux下運行的兩個進程,都是用來回收內存的,linux的內存回收有兩種算法,PFRA和LMR:

PFRA的進程就是kswapd,內核有兩個值:pages_high和pages_low,當可用內存的值低於pages_low的時候,kswapd就開始回收內存,清理cache,把能放到swap裏的丟到swap,直到空閒內存大於pages_high爲止。

LMR的進程是pdflush,內核有個參數,vm.dirty_background_ratio,當內存中髒頁,也就是dirty佔到這個百分比的時候,pdflush會啓動,將髒頁寫回到磁盤。

頻繁讀寫的機器,buffer肯定會比較高,而且bi和bo也會比較高(vmstat中的bi和bo,代表buffer的out和in)。而對於數據庫這種純粹跑io的機器,那cache可能會比較重要。當linux內存緊缺的時候,它會先壓縮cache,然後壓縮buffer,Inactive的部分也會被寫到swap中。其實,用到swap並不代表就說明這個機器到了瓶頸,因爲有些用不到的內存頁,放到swap裏是正常的,只有在swap和內存頻繁交互的時候,也就是si和so非常高的時候(vmstat中的si何so,代表swap和內存的交互),才說明內存出了問題。

網絡部分

/proc/net/dev

# cat /proc/net/dev

Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo:941316791 7326363 0 0 0 0 0 0 941316791 7326363 0 0 0 0 0 0
eth0:336037134 2034238824 0 647 0 0 0 5 3782240752 2181116563 0 0 0 0 0 0
eth1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sit0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
這個文件我想大家都很熟悉了
比較重要的網絡參數都在這裏了,包括流量,包數目,錯誤,丟棄,fifo,fram,壓縮,廣播等

發佈了27 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章