当前位置: 首页 > 科技观察

使用NodeExporter监控Linux主机2

时间:2023-03-15 21:14:55 科技观察

在上一篇文章中,我们介绍了如何使用NodeExporter监控Linux主机的CPU使用率。接下来,我们将介绍如何监控Linux磁盘空间、磁盘IO、网络IO等。内存监控除了CPU监控,我们可能最关心的是节点内存的监控。通常我们使用free命令查看节点的内存使用情况:free命令free命令的输出会显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲内存等,所以要监控内存我们需要先了解这些概念,我们先来了解一下free命令的输出:Mem行(第二行)是内存Swap行(第三行)是交换空间的使用情况。总计列显示系统的总可用物理内存和交换空间大小。使用的列显示已使用的物理内存和交换空间。空闲列显示剩余多少物理内存和交换空间。Swapspaceisavailable使用shared列显示共享物理内存大小buff/cache列显示buffer和cache使用的物理内存大小available列显示应用程序也可以使用的物理内存大小其中,我们需要重点关注免费和可用两栏。free是尚未使用的物理内存量,available是从应用程序的角度来看可用的内存。Linux内核为了提高磁盘操作的性能,会消耗一部分内存来缓存磁盘数据,也就是buffer和cache,所以对于内核来说,buffer和cache都属于已经使用过的内存,但是当应用程序需要内存时,如果没有足够的空闲内存可用,内核会从缓冲区和高速缓存中回收内存以满足应用程序的请求。所以从应用的角度来说,available=free+buffer+cache,但是需要注意的是这只是一种理想的计算方式,实际数据存在较大误差。如果想查询Prometheus中的内存使用情况,可以使用node_memory_*相关指标。同样,要计算使用量,我们可以计算可用内存,使用promql查询语句node_memory_Buffers_bytes+node_memory_Cached_bytes+node_memory_MemFree_bytes。AvailableMem然后计算可用内存的使用率,除以总内存,再减1。语句为(1-(node_memory_Buffers_bytes+node_memory_Cached_bytes+node_memory_MemFree_bytes)/node_memory_MemTotal_bytes)*100,所以计算出的节点是内存用法。内存使用情况当然,如果要查看每一项的内存使用情况,可以直接使用相应的监控指标。例如,如果要查看节点的总内存,可以直接使用node_memory_MemTotal_bytes指标。Totalmemorydiskmonitoring其次是比较中的磁盘监控。对于磁盘监控,我们不仅仅关注磁盘的使用情况,一般来说,监控磁盘IO是非常有必要的。磁盘容量监控要监控磁盘容量,需要用到node_filesystem_*相关指标。比如查询某个节点的磁盘空间使用情况,也可以使用total来计算可用空间。可用磁盘空间使用node_filesystem_avail_bytes这个指标,但是因为会有一些我们不关心的磁盘信息,所以我们可以使用fstype标签来过滤我们关心的磁盘信息,比如ext4或者xfs格式的disk:availablediskspace查询磁盘空间使用情况,使用查询语句(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指标。diskreadIO,使用sumby(instance)(rate(node_disk_reads_completed_total[5m]))查询语句:diskreadIO,当然如果要按device聚合,我们这里都是聚合。对于diskwriteIO,使用sumby(instance)(rate(node_disk_writes_completed_total[5m]))查询语句:diskwriteIO,networkIO,networkIO需要监控上行带宽的指标是node_network_receive_bytes,因为我们比较关心关于网络带宽的瞬时变化,所以一般我们使用irate函数来计算网络IO,比如计算上行带宽,使用查询语句sumby(instance)(irate(node_network_receive_bytes_total{device!~"bond.*?|lo"}[5m]))to:uplinkBandwidth下行带宽使用的索引是node_network_transmit_bytes,同理查询语句是sumby(instance)(irate(node_network_transmit_bytes{device!~"bond.*?|lo"}[5m])):下行带宽,当然我们也可以根据网卡设备进行聚合计算,最后根据自己的需要将结果换算成单位。