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

时间:2009-11-02 21:19:29

标签: linux process resources monitor bandwidth

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

另一个问题是网络带宽消耗:对于我想要监控的每个进程,都无法轻松计算出来。我认为NetHogs采用的解决方案涉及相当高的开销:它使用libpcap捕获并分析每个数据包,然后对于每个数据包,在/ proc中确定并搜索本地端口以找到相应的进程。

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

5 个答案:

答案 0 :(得分:5)

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

  

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

     

Taskstats的设计具有以下优势:

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

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

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

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

答案 1 :(得分:2)

看一下linux trace toolkit(LTTng)。它将跟踪点插入到内核中,并进行一些后期处理以获取您要询问的某些统计信息。如果您捕获所有内容,跟踪文件会变大,但如果您限制所设置的事件类型,则可以保持可管理性。

http://lttng.org了解更多信息...

答案 2 :(得分:2)

关于网络带宽:This Superuser answer描述了处理/ proc / net / tcp以收集网络带宽使用情况。

我知道iptables可用于进行网络会计(例如,参见LWN'sLinux.com'sShorewall's文章),但我认为没有任何实用的方法在每个过程的基础上进行会计核算。

答案 3 :(得分:0)

读取/ proc最终是在不将代码注入内核的情况下监视各个进程的CPU和内存使用情况的唯一方法。如果你看一下top(1),你会看到/ proc中的大量文件正是它每秒所做的。检索此类信息的所有用户模式工具和库都必须从/ proc。

获取

与网络带宽使用情况一样,有几种方法可以或多或少地归结为捕获开箱即用的所有网络流量。您还可以考虑编写一个特殊的netfilter(iptables)模块,该模块完全符合您所需的计数类型,而不会产生流量捕获的开销。

答案 4 :(得分:0)

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