测量多个并行进程的累积峰值内存使用量

测量多个并行进程的累积峰值内存使用量

想象一下,我使用 xargs 并行运行一堆进程,并想要测量它们的累积峰值内存使用情况。我怎样才能在 Linux 中做到这一点? GNU time 仅测量我运行的单个进程的峰值 RSS。换句话说,如果每个进程消耗 M GB 内存并且我运行其中的 N 个,我希望看到结果为 N*M GB,而不是 GNU 时间给出的 M。

答案1

您是否对每个进程的峰值内存使用量总和感兴趣,或者对进程的内存使用量总和峰值感兴趣?

例如,要获取系统中前 5 个最大消费者的峰值常驻内存使用情况,您可以执行以下操作:

$ printf "PID\tPeak RSS usage (kB)\n"; grep VmHWM: /proc/*/status | sort -rnk2 | head -n 5 | perl -npe 's#^/proc/(\d+)/\S+\s+(\d+) kB$#$1\t$2#'
PID Peak RSS usage (kB)
19799   8515140
28243   930620
1357    911612
19833   766020
17926   734952

这将列出在其进程历史记录中 RAM 使用量最大的 5 个进程。然而,这些进程不会在同一时刻达到峰值是很常见的,因此这些进程的峰值总和可能远低于所有进程的峰值总和。

计算多个进程的进程内存使用总和峰值的唯一可靠方法是在单独的内存中运行该进程集合cgroup。理论上,您只需运行程序systemd-run --pipe --user --pty ...,然后监视该内存的峰值内存使用情况cgroup。但是,根据我的经验,systemd-run无法正确实现瞬态用户模式组,因此您必须创建单独的系统级别cgroup来包含您想要测量的组,然后在该组中启动进程树。如果您运行比我尝试过的更新的足够新的发行版 systemd-run,它可能会在没有任何黑客攻击的情况下工作。看https://stackoverflow.com/a/61916151/334451了解详情。您可以通过内存cgroup安装来检查结果,内存安装通常安装在下面的某个位置/sys/fs/cgroup。可能的位置包括子目录memoryunified.尝试mount | grep cgroup了解详情。您的结果可能是,memory.max_usage_in_bytes但我认为这是承诺的使用情况,而不是实际的驻留 RAM 使用情况 - 您没有指定您要查找哪一个。请参阅memory.stat内存内部cgroup以获取更多统计信息。

如果您使用瞬态内存 cgroup,您可能希望运行例如 longsleep命令作为最后一个进程,以确保在进程树完成后删除 cgroup 之前有足够的时间读取峰值内存使用情况。

相关内容