導讀
在監控Linux作業系統過程中,我們會使用什麼樣的方式來擷取我們想要監控的名額呢?答案是豐富多樣的,有的是通過腳本指令行,有的是通過作業系統底層開放的API接口,有的是通過/proc/下的各式各樣的檔案,來對資料進行采集。本文主要介紹通過/proc,檔案系統下的各種檔案來解析我們是如何完成對Linux名額資料的采集的。
場景
熟悉Linux系統的運維同學們應該知道,我們常用的一些運維指令如df -h,free -m,ps -aux,top這些檢視系統狀态的指令,通過這些指令結果的輸出,我們可以基本了解該Linux伺服器的運作狀态。是以,我們可以通過代理程式或者遠端ssh管道,執行相關的采集指令,通過對指令行的輸出,進一步範式化,可以擷取到相關的伺服器狀态資訊。比如擷取系統記憶體總大小,我們可以執行free -m指令,得到如下輸出:
# free -m
total used free shared buff/cache available
Mem: 3774 669 2195 9 909 2758
Swap: 3967 0 3967
我們知道,3774為我們想要擷取到的記憶體總大小數值,那麼可以通過字元流處理工具sed,以及強大的awk文本處理工具,對結果進行提取。如:
# free -m|grep ^Mem|awk '{print $2}'
3774
這樣我們就擷取到了系統記憶體的名額了,同樣的方式處理,運用強大的文本處理工具,基本上隻要相應的指令的輸出有我們需要的名額資料,那麼就可以将資料進行采集。
問題
但,各位請想想,我們為了正确擷取這個記憶體的名額,需要依賴哪些内容?
- free這個指令
- awk工具
- 語言環境必須為en_US
等等其他一些依賴。
是以基于指令行采集的方式對環境有比較苛刻的要求,或許這個指令對這部分伺服器有效,但是對另外一部分确實無效,需要單獨為之編寫腳本指令,這樣會對我們的運維管理帶來很大的麻煩。
思路
為了保持較高的相容性以及高效地資源采集,這裡我們采用了讀取/proc檔案系統下面的各個檔案内容,來采集Linux系統的名額。
/proc檔案系統是一種核心和核心子產品用來向程序(process) 發送資訊的機制(是以叫做/proc)。這個僞檔案系統讓你可以和核心内部資料結構進行互動,擷取有關程序的有用資訊,在運作中(on the fly) 改變設定(通過改變核心參數)。
與其他檔案系統不同,/proc 存在于記憶體之中而不是硬碟上。proc檔案系統以檔案的形式向使用者空間提供了通路接口,這些接口可以用于在運作時擷取相關部件的資訊或者修改部件的行為,因而它是非常友善的一個接口。
其實,我們一開始使用指令行free -m來擷取系統總記憶體大小,其實就是一個“中間商”,他最終也是讀取的/proc下面的一個檔案,來輸出記憶體總大小的,我們可以通過strace指令進行一個追蹤。
# strace free -m
... //由于輸出比較多,這裡我們做了省略,就截取了關鍵部分,感興趣的同學們可以動手嘗試下。
open("/proc/filesystems", O_RDONLY) = 3
open("/proc/meminfo", O_RDONLY)
...
從strace的輸出我們大概了解到free這個指令的一些動作,他确實打開了/proc/meminfo下面的檔案進行了讀取,/proc/meminfo檔案中包含了對系統記憶體資訊的描述,我們可以通過cat指令打開該檔案内容。
#cat /proc/meminfo
MemTotal: 3865552 kB
總結
可以看到,檔案的第一行就是表示記憶體總大小,我們擯棄了free這個“中間商”,更快地就可以擷取到了系統總記憶體這個名額,并且/proc讀取的是記憶體,通過程式編碼去擷取,可以得到更高地效率,并且是适用于絕大多數的采用Linux核心的作業系統,如紅帽,Centos,甚至是Android。