导读
在监控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。