Linux下C获取CPU使用率和内存和网络丢包率

在Linux中如果要监视一个进程的运行情况,如查看它的CPU使用效率和内存使用情况,就需要从系统的 /proc目录的读取一些系统信息。然后分析得到结果,proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序 可以通过proc得到系统的信息,并可以改变内核的某些参数。

1、从/proc文件系统获取相关的性能参数
cpu使用率:    /proc/stat
内存使用情况:      /proc/meminfo
网络负载信息:    /proc/net/dev

相应的计算方法:(摘自:什么是proc文件系统,见参考资料)
(1)   处理器使用率   
(2)   内存使用率   
(3)   流入流出数据包   
(4)   整体网络负载   

这些数据分别要从/proc/stat、/proc/net/dev、/proc/meminfo三个文件中提取。如里有问题或对要提取的数据不太清楚, 可以使用man   proc来查看proc文件系统的联机手册。  

(1)   处理器使用率   
这里要从/proc/stat中提取四个数据:用户模式(user)、低优先级的用户模式(nice)、内核模式(system)以及空闲的处理器时间 (idle)。它们均位于/proc/stat文件的第一行。CPU的使用率使用如下公式来计算。

在Linux系统中,CPU利用率的计算来源在/proc/stat文件,这个文件的头几行记录了每个CPU的用户态,系统态,空闲态等状态下的不同的 Jiffies,常用的监控软件就是利用/proc/stat里面的这些数据来计算CPU的利用率的。/proc/stat/

输出解释
CPU 每行的每个参数意思(cpu是所有cpu数据和例如cpu0,cpu1,cpu2等等)为:
参数 解释
user (2662) 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒
nice (0) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)
system (4387) 从系统启动开始累计到当前时刻,核心时间(单位:jiffies)
idle (204441) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)
iowait (3670) 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,
irq (101) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)
softirq (27) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)

  
CPU使用率 =  100   *(user   +   nice   +   system)/(user   +   nice   +   system   +   idle)

要计算用户和系统的相对使用率要对/proc/stat数据进行两次采集,再进行计算

total1 = user1 + nice1 + system1 + idle1 ,total2同理(total1采集时间比total2晚,所以total1> total2)

用户使用率 = 100 * (user1 – user2)/ (total1 – total2)

系统使用率 = 100 * (system1 – system2)/ (total1 – total2)

(2)   内存使用率   

这里需要从/proc/meminfo文件中提取两个数据,当前内存的未使用量(MemFree)以及内存总量(MemTotal)。   
内存使用百分比   =   100   *   ((MemTotal – MemFree)   /  MemTotal)  
 

(3)网络利用率   

为了得到网络利用率的相关数据,需要从/proc/net/dev文件中获得两个数据:从本机输出的数据包数,流入本机的数据包数。它们都位于这个文件的 第四行。性能收集程序开始记录下这两个数据的初始值,以后每次获得这个值后均减去这个初始值即为从集群启动开始从本节点通过的数据包。利用上述数据计算出网络的丢包率,方法如下:   
丢包率   =   (第二次采集总丢包数 – 第一次采集总丢包数)   /   采集时间

下面是我写的代码,其中用到了定时器30S进行一次信息采集,最开始获取cpu对于total使用率,而不是用户和系统相对的使用率

来源:谁动了红薯

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2012年11月10日
下一篇 2012年11月10日

相关推荐