在实际应用中,会有很多系统参数的运行监控手段,我也曾经遇到过监控操作系统cpu,内存和网卡的发送接收速率等场景(使用snmp协议采集,也可以使用prometheus监控器去采集)。


    另外,京东的RPC框架中有种动态负载均衡策略,就是根据节点健康度进行请求分配的算法,底层也是采集系统参数,根据加权算法得到机器节点到健康度。


      今天那就一起总结一下常用的Linux系统参数获取方式,比如cpu核数,用户名,内存参数等等。


1、获取当前cpu核数

       在Netty中默认工作线程数量就是CPU核数的2倍,cpu核数可以通过sysconf函数可以查询相关参数,我们先通过man sysconf查看看函数用法。

组件设计系列:获取系统的监控参数_java

      其中的参数int name,我们接着看看有哪些参数。

组件设计系列:获取系统的监控参数_java_02

        最后实现查询cpu核数的接口如下:

组件设计系列:获取系统的监控参数_java_03

2、获取主机的hostname

     获取主机名称很容易,在头文件<unistd.h>中有gethostname函数可以直接获取。

组件设计系列:获取系统的监控参数_java_04

3、获取系统内存使用情况

    我们知道,通过cat /proc/meminfo 可以打开这个文件,里面可以查看到内存相关的信息。

组件设计系列:获取系统的监控参数_java_05

    那我们只需要通过文件到open接口读取内容,然后解析即可。

    其中,__parse_mem_info_attr_from_content方法,就是从这个字符串中找到对应的参数,然后进行解析。这个参数将作为工具方法,整个类中将使用到。

4、获取系统启动/运行时间

    通过 cat /proc/stat 通用可以查看到系统运行的一些信息,如下所示:

    那么系统启动时间就是上面的btime,系统运行的时间就是当前时间减去btime结果。

组件设计系列:获取系统的监控参数_java_06

    那么最终封装实现后的接口函数如下:

组件设计系列:获取系统的监控参数_java_07

5、获取全部网卡信息

       获取本机全部网卡信息,可以通过socket方式获取,如下所示:

组件设计系列:获取系统的监控参数_java_08

6、网卡收发包/速率参数获取

    同样,使用cat /proc/net/dev可以查看到有两个网卡的信息,其中我们需要获取的是ens33网卡的信息,所以在下面调用接口需要传入网卡名称(网卡名称有上面的api获取到了)。

组件设计系列:获取系统的监控参数_java_09

    我们通过一个内部类netdev来实现该功能:

组件设计系列:获取系统的监控参数_java_10

    这个地方,有个技巧,就是我们只需要得到其中的Receive和Transmit中的Bytes,所以上面的函数中,我们使用了dummy变量,跳过了中间变量得到了in_bytes和out_bytes结果。