我想知道是否有一个有效的解决方案来监控 Linux 中的进程资源消耗(cpu、内存、网络带宽)。我想用 C++ 编写一个守护程序来监视某些给定的 PID。据我所知,经典的解决方案是定期从/proc 中读取信息,但这似乎不是最有效的方法(它涉及许多系统调用)。例如,要每秒监控 50 个进程的内存使用情况,我必须每秒从/proc 打开、读取和关闭 50 个文件(这意味着 150 个系统调用)。更不用说读取这些文件时涉及的解析。
另一个问题是网络带宽消耗:对于我要监视的每个进程,这不能轻易计算。 NetHogs 采用的解决方案在我看来涉及相当高的开销:它使用 libpcap 捕获和分析每个数据包,然后为每个数据包确定本地端口并在/proc 中搜索以找到相应的进程。
您是否知道是否有比这些方法更有效的替代方法或任何库来处理这些问题?
最佳答案
/usr/src/linux/Documentation/accounting/taskstats.txt
Taskstats is a netlink-based interface for sending per-task and per-process statistics from the kernel to userspace.
Taskstats was designed for the following benefits:
- efficiently provide statistics during lifetime of a task and on its exit
- unified interface for multiple accounting subsystems
- extensibility for use by future accounting patches
此界面可让您监控所选进程的 CPU、内存和 I/O 使用情况。您只需在单个套接字上设置和接收消息。
这并没有区分(例如)磁盘 I/O 与网络 I/O。如果这对您很重要,您可以使用跟踪套接字操作的 LD_PRELOAD
拦截库。当然,假设您可以控制您希望观察的程序的启动,并且它们不会在您背后进行欺骗。
如果仍然失败,我想不出任何轻量级解决方案,但是 linux-audit可以全局跟踪系统调用,这似乎比重新捕获和分析您自己的网络流量更直接。
关于linux - Linux 中每个进程的编程资源监控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1663766/