Linux中每个进程的程序化资源监视

tux*_*uxx 8 linux resources bandwidth process monitor

我想知道是否有一种有效的解决方案来监控Linux中的进程资源消耗(cpu,内存,网络带宽).我想用C++编写一个守护进程来监视某些给定的PID.据我所知,经典的解决方案是定期从/ proc读取信息,但这似乎不是最有效的方式(它涉及许多系统调用).例如,要监视50个进程每秒的内存使用情况,我必须每秒从/ proc打开,读取和关闭50个文件(这意味着150个系统调用).更不用说阅读这些文件时涉及的解析.

另一个问题是网络带宽消耗:对于我想监视的每个进程,这都不容易计算.在我看来,NetHogs采用的解决方案涉及相当高的开销:它使用libpcap捕获并分析每个数据包,然后对于每个数据包,在/ proc中确定和搜索本地端口以找到相应的进程.

您是否知道这些方法是否有更有效的替代方案或任何处理此问题的库?

eph*_*ent 5

/usr/src/linux/Documentation/accounting/taskstats.txt

Taskstats是一个基于netlink的接口,用于从内核向用户空间发送每个任务和每个进程的统计信息.

Taskstats旨在实现以下好处:

  • 在任务的生命周期和退出时有效地提供统计信息
  • 多个会计子系统的统一接口
  • 未来会计补丁使用的可扩展性

此界面允许您根据您选择的进程监控CPU,内存和I/O使用情况.您只需在单个套接字上设置和接收消息.

这不区分(例如)磁盘I/O与网络I/O. 如果这对您很重要,您可能会使用LD_PRELOAD跟踪套接字操作的拦截库.当然,假设你可以控制你想要观察的程序的启动,并且它们不会在背后诡计.

如果那些仍然失败,我想不出任何轻量级解决方案,但是linux-audit可以全局跟踪系统调用,这似乎比重新捕获和分析自己的网络流量更直接.