2009-11-02 89 views
8

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

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

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

回答

5

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

Taskstats是按任务和 每个进程的统计数据发送从内核到用户空间的基于网络链路的接口。

Taskstats是专为以下好处:

  • 任务的一生中,并在其退出
  • 统一的接口,用于多个会计子系统
  • 可扩展性以供未来会计补丁
  • 高效地提供统计数据

此界面,可以监控CPU,内存和I/O使用您选择的过程。您只需在单个套接字上设置和接收消息。

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

我想不出任何重量轻的解决方案,如果这些仍然失败,但linux-audit可在全球跟踪系统调用,这似乎是一个公平的位比重新捕捉更直接和分析你自己的网络流量。

+0

taskstats只包含磁盘I/O,不包括网络和磁盘 – tuxx 2009-11-03 20:27:05

+0

纠正:taskstats只监视读/写系统调用,而不是recv/send和朋友(但是这个可以在内核中轻松修改)。不管怎么说,还是要谢谢你。这似乎是迄今为止最好的解决方案。 – tuxx 2009-11-04 17:40:22

2

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

http://lttng.org的详细信息...

2

关于网络带宽:This Superuser answer描述处理的/ proc /净/ TCP收集网络带宽的使用。

我知道iptables可以用来做网络记帐。,LWN's,Linux.com'sShorewall's文章),但我没有看到任何实际的方法来做每个进程的会计。

0

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

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

0

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