linux - Linux 中每个进程的编程资源监控

标签 linux process resources monitor bandwidth

我想知道是否有一个有效的解决方案来监控 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/

相关文章:

c - dup2 一个文件的套接字

linux - 获取从您的 ip 地址发出的所有 url 调用的列表

c# - 以用户身份运行我的程序

asp.net-mvc - 资源 (RESX) 文件搞砸了

java - 如何从 NetBeans 中的 'Resources' 文件夹中正确获取图像

linux - 2G 是 Linux 上 coredump 文件的限制大小吗?

process - 获取正在运行的应用程序的自定义状态

c - 上面显示的程序使用 Pthreads API。 LINE C 和 LINE P 处的程序的输出是什么?

servlets - 在基于 servlet 的应用程序中放置以及如何读取配置资源文件?

android - 使用 Python-For-Android 将 Python 脚本导出到 Android 可执行文件 (.apk)