通过PROC文件收集进程信息

在内核中,提供了CGroup(控制组)机制,该cgroup可以对进程进行划分,将某些进程可以划分到同一组中,并对其进行相关统一的条件限制。

为了将使用资源几乎一致的进程划分到同一个cgroup组中进行条件限制,所以需要对进程的资源使用情况以及运行情况进行收集与分析。内核中,进程的相关信息主要保存在 /proc/pid 目录中,而其中的文件较多,如何确定哪个文件具体有用呢?

内核中,查看进程情况的常用命令为top命令,因此可以跟踪该 top 命令的执行过程(strace top),查看top命令访问过的文件,其中主要包含了以下两个文件,分别是 :stat和 statm。如图:

这里写图片描述
其中,stat 文件包含的信息较为全面,而 statm 主要包含存储的使用情况,因此决定使用 stat 文件来查看进程的资源使用情况以及运行情况。在该文件中,可以选定一些指标来作为判定进程使用资源情况的参数,其中,主要选定的指标有:占用处理器的时间,占用内存的大小,不换页的次数,换页的次数,当前的优先级。所以自定义了proc_info结构体来抽象上述的这些参数指标。如图:

这里写图片描述
随后,可以对stat文件进行读取,将所需的数据存入proc_info结构体当中,实现如下:
这里写图片描述
CPU的利用率被定义为(进程运行时间 / 系统运行时间),而系统运行时间需要通过文件 /proc/stat 获取。因此,在proc_info结构体当中引入cpu_info结构体来存储系统运行时间。系统运行事件的获取实现如下:
这里写图片描述
当获取到上述的参数指标之后,进行计算并将结果存入proc_info结构体中。这里,创建的cpu_info结构体对象为指针数组,这是因为采集的过程是对某一个进程在一段时间内的连续的定时采集,因此需要一个数组对象来存储不同的进程对象,而在每一个进程对象中又需要链表结构来存取不同时间点上某一进程的资源使用情况。

在不同的tty终端上运行了相同的程序,并采集它们各自的资源使用情况:

./top-1 /proc/pid1/stat proc/pid2/stat
(shell) 27.76 1188 361 0 20
(shell) 18.73 1188 360 0 20
(shell) 28.00 1188 361 0 20
(shell) 17.67 1188 360 0 20
(shell) 30.00 1188 361 0 20
(shell) 17.33 1188 360 0 20
(shell) 30.33 1188 361 0 20
(shell) 17.33 1188 360 0 20
(shell) 29.67 1188 361 0 20
(shell) 17.00 1188 360 0 20
(shell) 29.43 1188 361 0 20
(shell) 17.39 1188 360 0 20
(shell) 28.33 1188 361 0 20
(shell) 18.67 1188 360 0 20
(shell) 28.00 1188 361 0 20
(shell) 17.67 1188 360 0 20
(shell) 29.67 1188 361 0 20
(shell) 18.00 1188 360 0 20
(shell) 29.67 1188 361 0 20
(shell) 18.00 1188 360 0 20

可以看出,会同时展示两个进程在不同时间点上的资源使用情况。用 matlab 对采集到的数据进行处理,可以得到如下结果:
这里写图片描述

从图中可以看出两个进程的CPU使用情况的差异性还是较大的。接下来,可以采集多个进程的资源使用情况,并利用聚类算法,来将资源使用情况近乎相同的进程归为一类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值