[Linux C/C++]系统CPU、内存、网络资源占用率监控 | 您所在的位置:网站首页 › linux性能监视器 › [Linux C/C++]系统CPU、内存、网络资源占用率监控 |
Linux系统资源使用情况监控
任务目标CPU占用率/proc文件系统/proc/statCPU利用率的计算
内存、运行时长系统运行时间内存利用率
网络接口属性ifreq、ifconf结构体/proc/net/dev
网速计算程序流程结果展示完整的项目地址githubgitee
任务目标
在基于Linux系统的主机上,对主机运行状态进行监控,衡量终端负载情况。相当于简单的系统资源管理器功能。该设计目标是实现对: (1)CPU占用率 (2)系统运行时长 (3)内存占用率 (4)网络接口属性 (5)网卡速率信息 的监控。 CPU占用率我们通过读取/proc/stat文件获取当前系统的CPU占用率。 /proc文件系统proc是一个只存在内存当中的伪文件系统。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到动态的从系统内核读出的系统的信息,并可以改变内核的某些参数。 /proc/stat/proc/stat 包含了系统启动以来的许多关于kernel和系统的统计信息, 其中包括CPU运行情况、中断统计、启动时间、上下文切换次数、运行中的进程等等信息。其实,/proc/stat反映的就是CPU总的占用时间,如下图所示。 [CPU指标]:user,nice, system, idle, iowait, irq, softirq 第一行内容表示总的CPU信息,如果主机有多核,会有多个CPU0~n; CPU利用率的计算CPU利用率分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间 / CPU总的执行时间。 1.定义CPU信息结构体,用于存储各模式下的CPU使用时间。 typedef struct _CPU_PACKED { char name[16]; unsigned int user; //用户模式 unsigned int nice; //低优先级的用户模式 unsigned int system; //内核模式 unsigned int idle; //空闲处理器时间 } CPU_OCCUPY;2.打开/proc/stat文件,利用sscanf函数读取需要的数据。 fd = fopen("/proc/stat", "r"); if (fd == NULL) { perror("open /proc/stat failed\n"); exit(0); } fgets(buff, sizeof(buff), fd); sscanf(buff, "%s %u %u %u %u", cpu->name, &cpu->user, &cpu->nice, &cpu->system, &cpu->idle); fclose(fd);计算方法: t1: 第一次采集(用户+优先级+系统+空闲)的时间过一段时间,ex:sleep(1);t2:第二次(用户+优先级+系统+空闲)的时间user :用户模式第一次和第二次的时间之差system:系统第一次和第二次的时间之差 内存、运行时长Linux中,sysinfo是用来获取系统相关信息的结构体。 具体定义如下: 通过sysinfo函数获取上述结构体信息。 int ret = 0; ret = sysinfo(&info); if (ret != 0) { perror("get sys_info failed\n"); exit(0); }定义主机状态信息结构体(如下),以保存主机的时长、使用率信息。 /*主机的状态信息结构体*/ typedef struct _HOST_STATE{ int hour; int minute; double cpu_used; double mem_used ; }HOST_STATE; 系统运行时间通过uptime参数获取 内存利用率通过totalram、freeram参数获取 网络接口属性 ifreq、ifconf结构体ifreq结构定义在/usr/include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的。其中包含了一个接口的名字和具体内容——(是个共用体,有可能是IP地址,广播地址,子网掩码,MAC号,MTU或其他内容)。 ifreq包含在ifconf结构中。而ifconf结构通常是用来保存所有接口的信息的。 网卡接口名称、MAC地址、IP地址就保存于以下字段中。通过ifconf结构体我们可以获取到本机当前所有活动网卡的相关属性。 /proc/net/dev/proc/net/dev文件就是提供给用户读取或更改网络适配器及统计信息的途径 interface:接口的名字Receive:表示收包Transmit:表示收包bytes:表示收发的字节数为了存储网卡相关信息,定义如下结构体。 同时采用链表结构动态存储网卡统计信息,以实现获取本机上的所有网卡设备。 /*网卡设备信息结构体*/ typedef struct _NET_INTERFACE { char name[16]; /*网络接口名称*/ char ip[16]; /*网口IP*/ double d_speed; /*下行速度*/ double u_speed; /*上行速度*/ char mac[13]; /*网口MAC地址*/ /*上下行速度级别 bit 7~0 *bit[0]=d_speed *bit[1]=u_speed *1:MB/s 0:KB/s */ unsigned char speed_level; /**/ struct _NET_INTERFACE *next; /*链表指针*/ } NET_INTERFACE; 网速计算定义RTX_BYTES结构体用于存储网卡特定时刻的收发包情况。 /*收发数据包结构体*/ typedef struct _RTX_BYTES { long int tx_bytes; long int rx_bytes; struct timeval rtx_time; } RTX_BYTES;通过打开/proc/net/dev文件,按行读取可获得各网卡当前时刻总的收发包信息。程序示例如下。 open_netconf(&net_dev_file); //获取时间 gettimeofday(&rtx->rtx_time, NULL); //从第三行开始读取网络接口数据 while ((read = getline(&line, &bytes_read, net_dev_file)) != -1) { if ((++i) |
CopyRight 2018-2019 实验室设备网 版权所有 |