在实际应用中,会有很多系统参数的运行监控手段,我也曾经遇到过监控操作系统cpu,内存和网卡的发送接收速率等场景(使用snmp协议采集,也可以使用prometheus监控器去采集)。
另外,京东的RPC框架中有种动态负载均衡策略,就是根据节点健康度进行请求分配的算法,底层也是采集系统参数,根据加权算法得到机器节点到健康度。
今天那就一起总结一下常用的Linux系统参数获取方式,比如cpu核数,用户名,内存参数等等。
1、获取当前cpu核数
在Netty中默认工作线程数量就是CPU核数的2倍,cpu核数可以通过sysconf函数可以查询相关参数,我们先通过man sysconf查看看函数用法。
其中的参数int name,我们接着看看有哪些参数。
最后实现查询cpu核数的接口如下:
2、获取主机的hostname
获取主机名称很容易,在头文件中有gethostname函数可以直接获取。
3、获取系统内存使用情况
我们知道,通过cat /proc/meminfo 可以打开这个文件,里面可以查看到内存相关的信息。
那我们只需要通过文件到open接口读取内容,然后解析即可。
其中,__parse_mem_info_attr_from_content方法,就是从这个字符串中找到对应的参数,然后进行解析。这个参数将作为工具方法,整个类中将使用到。
4、获取系统启动/运行时间
通过 cat /proc/stat 通用可以查看到系统运行的一些信息,如下所示:
那么系统启动时间就是上面的btime,系统运行的时间就是当前时间减去btime结果。
那么最终封装实现后的接口函数如下:
5、获取全部网卡信息
获取本机全部网卡信息,可以通过socket方式获取,如下所示:
6、网卡收发包/速率参数获取
同样,使用cat /proc/net/dev可以查看到有两个网卡的信息,其中我们需要获取的是ens33网卡的信息,所以在下面调用接口需要传入网卡名称(网卡名称有上面的api获取到了)。
我们通过一个内部类netdev来实现该功能:
这个地方,有个技巧,就是我们只需要得到其中的Receive和Transmit中的Bytes,所以上面的函数中,我们使用了dummy变量,跳过了中间变量得到了in_bytes和out_bytes结果。