【发布时间】:2016-01-13 10:18:11
【问题描述】:
我需要在其生命周期内获取进程的一些统计信息(io、网络)。无论如何,在进程退出之前从 /proc 获取这些信息吗? Linux 内核 API ?
【问题讨论】:
-
也许你可以使用 GNU 的时间函数 (
/usr/bin/time),它可以输出大量的统计数据。您可以查看其源代码以了解其工作原理。
我需要在其生命周期内获取进程的一些统计信息(io、网络)。无论如何,在进程退出之前从 /proc 获取这些信息吗? Linux 内核 API ?
【问题讨论】:
/usr/bin/time),它可以输出大量的统计数据。您可以查看其源代码以了解其工作原理。
wait4() 和 struct rusage
子进程终止后收集一些统计信息的简单方法是wait4(2) syscall,它可以填充rusage struct。
ptrace()如果还不够,您可以使用ptrace(2) 在进程终止前停止进程:
PTRACE_O_TRACEEXIT(自 Linux 2.5.60 起)
在退出时停止跟踪。追踪者的
waitpid(2)将返回一个状态值,使得status>>8 == (SIGTRAP | (PTRACE_EVENT_EXIT<<8))tracee的退出状态可以通过
PTRACE_GETEVENTMSG.tracee 在进程退出期间提前停止,当 寄存器仍然可用,允许示踪剂 查看退出发生的位置,而正常退出 处理完成后通知完成 退出。即使上下文可用,跟踪器 此时无法阻止退出发生。
当waitpid(2) 将报告进程将要终止并停止时,您可以从/proc 收集统计信息,但我没有尝试过。
KProbes我知道的最通用的解决方案是KProbes 及其衍生产品。您或许可以使用 DTrace 或 SystemTap 来捕获 sys_exit() 并收集统计信息。
【讨论】:
do_exit 上放置一个 Probe