当前位置: 首页 > 科技观察

Linux下如何获取cpu使用率

时间:2023-03-19 23:21:58 科技观察

》proc文件系统是一个伪文件系统,只存在于内存中,不占用外部存储空间,它以如下形式提供访问系统内核数据操作的接口一个文件系统,用户和应用程序可以通过proc获取系统信息,可以改变内核的一些参数。这里我们将介绍如何从/proc文件系统中获取防火墙相关的一些性能参数,以及如何通过/proc文件系统相关配置修改内核。1.从/proc文件系统获取相关性能参数cpu使用情况:/proc/stat内存使用情况:/proc/meminfo网络负载信息:/proc/net/dev对应的计算方法:(来自:什么是proc文件系统,见参考资料)(1)处理器使用情况(2)内存使用情况(3)传入和传出数据包(4)整体网络负载proc/meminfo三个文件。如果有问题或者提取的数据不清楚,可以使用manproc查看proc文件系统的在线手册。(1)处理器使用情况这里从/proc/stat中提取了四种数据:用户态(user)、低??优先级用户态(nice)、内核态(system)和空闲处理器时间(idle)。它们位于/proc/stat文件的第一行。使用以下公式计算CPU利用率。CPUutilization=100*(user+nice+system)/(user+nice+system+idle)(2)这里的内存使用率需要从/proc/meminfo文件中提取两个数据,当前内存使用率(cmem)和内存总量(amem)。内存使用百分比=100*(cmem/umem)(3)网络利用率为了得到网络利用率的相关数据,需要从/proc/net/dev文件中获取两个数据:机器,流入这台机器的数据包的数量。它们都位于该文件的第四行。性能采集程序开始记录这两个数据的初值,每次得到这个值后减去这个初值,就是集群启动以来经过这个节点的数据包数。利用以上数据计算网络的平均负载,方法如下:平均网络负载=(出站数据包+入站数据包)/22.通过/proc文件系统调整相关内核配置,允许ip转发/proc/sys/net/ipv4/ip_forward禁止ping/proc/sys/net/ipv4/icmp_echo_ignore_all可以直接在命令行下对以上两个“文件”写入“1”来实现相关配置,如果写入“0”取消相关配置。但是在系统重启后,这些配置会恢复默认设置,所以如果想让这些修改生效,可以直接将以下配置写入/etc/profile文件,或者其他随系统执行的程序文件启动。echo1>/proc/sys/net/ipv4/ip_forwardecho1>/proc/sys/net/ipv4/icmp_echo_ignore_all这里计算cpu使用率有问题,正确的计算方法需要使用该值来计算以前的状态。等待最后一次:1.记录某一时刻cpu的使用情况2.等待最后一个时间段3.然后记录此时cpu的使用情况4.计算总时间片,对所有cpu的使用情况求和第一次得到j1,第二次求和所有cpu使用率,得到j2j2-j1得到这个时间段的所有时间片,即total=j2-j1=所有列的总和第二次-***时间的所有列5.计算空闲时间idle对应第五列的数据,用第二次减去***时间的数据。Idle=第二次的第五列-***次的第五列6.计算cpu使用率=(total-idle)/total在Linux/Unix下,CPU使用率分为用户态,系统态和空闲态,分别表示用户态下CPU的执行时间,系统内核的执行时间,空闲态下系统进程的执行时间。通常所说的CPU利用率是指:CPU执行非系统空闲进程的时间/CPU的总执行时间。2009-05-1723:102009-05-1723:10我想获取目标机器运行时linux系统的硬件使用情况。我写了这些小程序,以后直接用。方法是读取proc下的文件获取。cpu使用情况:/proc/stat,内存使用情况:/proc/meminfo查看程序:/*************************************************************************@file:statusinfo.c**@brief:从linux系统获取CPU和内存使用情况**@version1.0*******************************************************************/typedefstructPACKED//定义一个cpuoccupy结构体{charname[20];//定义一个char类型name的数组名有20个元素unsignedintuser;//定义一个unsignedint类型userunsignedintnice;//定义一个unsignedint类型niceunsignedintsystem;//定义一个unsignedint类型systemunsignedintidle;//定义一个unsignedint类型inttypeidle}CPU_OCCUPY;typedefstructPACKED//定义一个内存占用结构{charname[20];//定义一个20个元素的char类型数组名nameunsignedlongtotal;charname2[20];unsignedlongfree;}MEM_OCCUPY;get_memoccupy(MEM_OCCUPY*mem)//untypedget函数包含指向形式参数结构类的指针O{FILE*fd;intn;charbuff[256];MEM_OCCUPY*m;m=mem;fd=fopen("/proc/meminfo","r");fgets(buff,sizeof(buff),fd);fgets(buff,sizeof(buff),fd);fgets(buff,sizeof(buff),fd);fgets(buff,sizeof(buff),fd);sscanf(buff,"%s%u%s",m->name,&m->total,m->name2);fgets(buff,sizeof(buff),fd);//从fd文件中读取长度为buff的字符串,存入起始地址为buff的空间sscanf(buff,"%s%u",m->name2,&m->free,m->name2);fclose(fd);//关闭文件fd}intcal_cpuoccupy(CPU_OCCUPY*o,CPU_OCCUPY*n){unsignedlongod,nd;unsignedlongid,sd;intcpu_use=0;od=(unsignedlong)(o->user+o->nice+o->system+o->idle);//第一个(user+priority+system+idle)时间分配给odnd=(unsignedlong)(n->user+n->nice+n->system+n->idle);//第二次(user+priority+system+idle)时间分配给odid=(unsignedlong)(n->user-o->user);//用户第一次和第二次的时间差赋值给idsd=(unsignedlong)(n->system-o->system);//系统第一次和第二次的时间差赋值给sdif((nd-od)!=0)cpu_use=(int)((sd+id)*10000)/(nd-od);//((user+system)好100)除(第一次和第二次的时间差第二次)并将其分配给g_cpu_usedelsecpu_use=0;//printf("cpu:%u/n",cpu_use);returncpu_use;}get_cpuoccupy(CPU_OCCUPY*cpust)//untypedget函数包含一个指向形参结构类的指针O{FILE*fd;intn;charbuff[256];CPU_OCCUPY*cpu_occupy;cpu_occupy=cpust;fd=fopen("/proc/stat","r");fgets(buff,sizeof(buff),fd);sscanf(buff,"%s%u%u%u%u",cpu_occupy->name,&cpu_occupy->user,&cpu_occupy->nice,&cpu_occupy->system,&cpu_occupy->idle);fclose(fd);}intmain(){CPU_OCCUPYcpu_stat1;CPU_OCCUPYcpu_stat2;MEM_OCCUPYmem_stat;intcpu;//获取内存get_memoccupy((MEM_OCCUPY*)&mem_stat);//第一次获取cpu占用率get_cpuoccupy((CPU_OCCUPY*)&cpu_stat1);sleep(10);//第二次获取cpu占用率get_cpuoccupy((CPU_OCCUPY*)&cpu_stat2);//计算cpu使用率cpu=cal_cpuoccupy((CPU_OCCUPY*)&cpu_stat1,(CPU_OCCUPY*)&cpu_stat2);return0;}