使用 Node Exporter 監控 Linux 主機之二
前文我們介紹了如何使用 Node Exporter 監控 Linux 主機的 CPU 使用率,接下來我們來介紹如何監控 Linux 的磁盤空間、磁盤 IO、網絡 IO 等方面。
內存監控
除了 CPU 監控之外,我們可能最關心的就是節點內存的監控了,平時我們查看節點的內存使用情況基本上都是使用 free 命令來查看:
free命令
free 命令的輸出會顯示系統內存的使用情況,包括物理內存、交換內存(swap)和內核緩沖區內存等,所以要對內存進行監控我們需要先了解這些概念,我們先了解下 free 命令的輸出內容:
- Mem 行(第二行)是內存的使用情況
- Swap 行(第三行)是交換空間的使用情況
- total 列顯示系統總的可用物理內存和交換空間大小
- used 列顯示已經被使用的物理內存和交換空間
- free 列顯示還有多少物理內存和交換空間可用使用
- shared 列顯示被共享使用的物理內存大小
- buff/cache 列顯示被 buffer 和 cache 使用的物理內存大小
- available 列顯示還可以被應用程序使用的物理內存大小
其中我們需要重點關注的 free 和 available 兩列。free 是真正尚未被使用的物理內存數量,而 available 是從應用程序的角度看到的可用內存,Linux 內核為了提升磁盤操作的性能,會消耗一部分內存去緩存磁盤數據,就是 buffer 和 cache,所以對于內核來說,buffer 和 cache 都屬于已經被使用的內存,只是應用程序需要內存時,如果沒有足夠的 free 內存可以用,內核就會從 buffer 和 cache 中回收內存來滿足應用程序的請求。所以從應用程序的角度來說 available = free + buffer + cache,不過需要注意這只是一個理想的計算方式,實際中的數據有較大的誤差。
如果要在 Prometheus 中來查詢內存使用,則可以用 node_memory_* 相關指標,同樣的要計算使用的,我們可以計算可使用的內存,使用 promql 查詢語句 node_memory_Buffers_bytes + node_memory_Cached_bytes + node_memory_MemFree_bytes。
available Mem
然后計算可用內存的使用率,和總的內存相除,然后同樣用 1 減去即可,語句為 (1- (node_memory_Buffers_bytes + node_memory_Cached_bytes + node_memory_MemFree_bytes) / node_memory_MemTotal_bytes) * 100,這樣計算出來的就是節點內存使用率。
內存使用率
當然如果想要查看各項內存使用直接使用對應的監控指標即可,比如要查看節點總內存,直接使用 node_memory_MemTotal_bytes 指標即可獲取。
總內存
磁盤監控
接下來是比較中的磁盤監控,對于磁盤監控我們不僅對磁盤使用情況感興趣,一般來說對于磁盤 IO 的監控也是非常有必要的。
磁盤容量監控
要監控磁盤容量,需要用到 node_filesystem_* 相關的指標,比如要查詢節點磁盤空間使用率,則可以同樣用總的減去可用的來進行計算,磁盤可用空間使用 node_filesystem_avail_bytes 指標,但是由于會有一些我們不關心的磁盤信息,所以我們可以使用 fstype 標簽過濾關心的磁盤信息,比如 ext4 或者 xfs 格式的磁盤:
可用磁盤空間
要查詢磁盤空間使用率,則使用查詢語句 (1 - node_filesystem_avail_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext4|xfs"}) * 100 即可:
磁盤空間使用率
這樣就可以得到我們關心的磁盤空間使用率了。
磁盤 IO 監控
要監控磁盤 IO,就要區分是讀的 IO,還是寫的 IO,讀 IO 使用 node_disk_reads_completed 指標,寫 IO 使用 node_disk_writes_completed_total 指標。
磁盤讀 IO 使用 sum by (instance) (rate(node_disk_reads_completed_total[5m])) 查詢語句即可:
磁盤讀IO
當然如果你想根據 device 進行聚合也是可以的,我們這里是全部聚合在一起了。
磁盤寫 IO 使用 sum by (instance) (rate(node_disk_writes_completed_total[5m])) 查詢語句即可:
磁盤寫IO
網絡 IO 監控
上行帶寬需要用到的指標是 node_network_receive_bytes,由于我們對網絡帶寬的瞬時變化比較關注,所以一般我們會使用 irate 函數來計算網絡 IO,比如計算上行帶寬用查詢語句 sum by(instance) (irate(node_network_receive_bytes_total{device!~"bond.*?|lo"}[5m])) 即可:
上行帶寬
下行帶寬用到的指標為 node_network_transmit_bytes,同樣的方式查詢語句為 sum by(instance) (irate(node_network_transmit_bytes{device!~"bond.*?|lo"}[5m])):
下行帶寬
當然我們還可以根據網卡設備進行分別聚合計算,最后還可以根據自己的需求將結果進行單位換算。