9

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

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

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

4

5 回答 5

5

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

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

Taskstats 旨在实现以下优势:

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

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

这并没有区分(例如)磁盘 I/O 和网络 I/O。如果这对您很重要,您可能会使用一个LD_PRELOAD跟踪套接字操作的拦截库。当然,假设您可以控制您希望观察的程序的启动,并且它们不会在您背后耍花招。

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

于 2009-11-02T22:29:55.147 回答
2

关于网络带宽: 此超级用户答案描述了处理 /proc/net/tcp 以收集网络带宽使用情况。

我知道 iptables 可用于进行网络记帐(例如,参见LWN 的Linux.com 的Shorewall 的文章),但我看不到任何实用的方法可以在每个进程的基础上进行记帐。

于 2009-11-05T16:27:09.737 回答
2

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

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

于 2009-11-05T16:08:45.210 回答
0

我只是在寻找同一件事的答案时遇到了这个问题。只是一个说明 - 使用 /proc 文件系统时,您不必在每次读取后关闭文件。您可以使文件保持打开状态,每次阅读时都会获得新的统计信息...因此,每次要获取统计信息时,您都不应该有打开和关闭的开销...我有这个工作如果您想要一个示例,请使用 node.js 上的 javascript...

于 2010-05-30T21:28:03.873 回答
-1

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

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

于 2009-11-06T00:13:16.043 回答