想象一下,我使用 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
。可能的位置包括子目录memory
或unified
.尝试mount | grep cgroup
了解详情。您的结果可能是,memory.max_usage_in_bytes
但我认为这是承诺的使用情况,而不是实际的驻留 RAM 使用情况 - 您没有指定您要查找哪一个。请参阅memory.stat
内存内部cgroup
以获取更多统计信息。
如果您使用瞬态内存 cgroup,您可能希望运行例如 longsleep
命令作为最后一个进程,以确保在进程树完成后删除 cgroup 之前有足够的时间读取峰值内存使用情况。