我想知道是否有一种有效的解决方案来监控
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可以全局跟踪系统调用,这似乎比重新捕获和分析您自己的网络流量更直接.