[Linux C/C++]系统CPU、内存、网络资源占用率监控 您所在的位置:网站首页 linux性能监视器 [Linux C/C++]系统CPU、内存、网络资源占用率监控

[Linux C/C++]系统CPU、内存、网络资源占用率监控

2023-11-03 05:29| 来源: 网络整理| 查看: 265

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; Alt

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 实验室设备网 版权所有