Linux中每个进程的编程资源监视

我想知道是否有一个有效的解决scheme来监视Linux中的进程资源消耗(CPU,内存,networking带宽)。 我想用C ++编写一个守护进程来监视某些给定的PID。 据我所知,经典的解决scheme是周期性地从/ proc读取信息,但这似乎并不是最有效的方式(涉及很多系统调用)。 例如,为了监视50个进程每秒的内存使用情况,我必须每秒从/ proc打开,读取和closures50个文件(这意味着150个系统调用)。 更不用说在读这些文件时涉及的parsing。

另一个问题是networking带宽消耗:对于我想要监视的每个进程,这是不容易计算的。 NetHogs采用的解决scheme涉及到相当高的开销,我认为它使用libpcap捕获和分析每个数据包,然后为每个数据包确定本地端口并在/ proc中search以find相应的进程。

你知道是否有更有效的替代方法提出这些方法或任何图书馆处理这个问题?

Solutions Collecting From Web of "Linux中每个进程的编程资源监视"

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

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

Taskstats是为了以下好处而设计的:

  • 有效地提供任务生命周期和退出时的统计数据
  • 统一的多个会计子系统界面
  • 未来会计补丁使用的可扩展性

此接口可让您按所选进程监控CPU,内存和I / O使用情况。 您只需要在一个套接字上设置和接收消息。

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

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

看看linux跟踪工具包(LTTng)。 它将跟踪点插入到内核中,并进行一些后处理,以获得您所要求的某种统计信息。 如果捕获所有内容,跟踪文件会变得很大,但是如果限制您所设置的事件的类型,则可以保持事情的可管理性。

http://lttng.org获取更多信息…

关于网络带宽: 这个超级用户应答描述了处理/ proc / net / tcp收集网络带宽的使用情况。

我知道iptables可以用来进行网络会计(例如,参见LWN's , Linux.com或Shorewall的文章),但是我没有看到以每个进程为基础进行会计的实际方法。

读取/ proc最终是通过单个进程监视CPU和内存使用情况的唯一方式,而无需将代码注入内核。 如果你看看top(1),你会发现在/ proc中读取很多文件正是它每秒所做的。 所有用户模式的工具和库都需要从/ proc中获取这些信息。

与网络带宽使用情况一样,有几种方法,这些方法或多或少归结为捕获所有网络内外的网络流量。 你也可以考虑编写一个专门的netfilter(iptables)模块来完成你所需要的计数类型,而不需要流量捕获的开销。

我刚刚遇到这个,因为我正在寻找同样的事情的答案。 只是一个注释 – 使用/ proc文件系统时,您不必在每次读取后关闭文件。 你可以保持文件打开,每次你读一读,你会得到新的统计数据…所以,你不应该打开和关闭每次你想获得统计的开销…我有这个工作在JavaScript上的node.js,如果你想要一个例子…