我一直在使用 /usr/bin/time -v 构造来确定我创建的程序的峰值 RAM 使用情况。
最近我一直在编写一些 python 程序,multiprocessing
这些程序基本上会利用父进程的分叉。这些分叉进程的 RAM 使用情况似乎无法通过 /usr/bin/time 捕获。
是否有类似的工具来测量峰值 RAM 使用情况,但结合父进程的所有分叉进程/子进程?
答案1
我写这个实验脚本围绕这个用例,基于进程树感知版本的 GNU 时间进程路径-- 我维护的用于分析 Linux 进程树的工具。虽然有些粗糙,但足以说明这个想法 -- 记录 procfs 提供的目标进程树指标,然后针对sqlite3
记录的数据库运行查询。
$ ./time-pp.sh stress -t 45 -c 2 -m 1
2023-05-29 23:12:03 INFO procpath №1: stress: info: [451026] dispatching hogs: 2 cpu, 0 io, 1 vm, 0 hdd
2023-05-29 23:12:48 INFO procpath №1: stress: info: [451026] successful run completed in 45s
tracked 44.84s
user 94.94s
sys 39.54s
CPU timeline ▇███████████████████████████████████████
CPU min-max 298.71% - 331.70%
RSS timeline ███████▇▇███▇█▇▇█▂▇▇▇██▇█▇████▇██▇█▄▇█▇█
RSS min-max 1.50MiB - 257.25MiB
procpath
和pysparklines
命令是先决条件。可以像这样安装:
$ pipx install procpath
$ pipx install pysparklines
答案2
GNU time(/usr/bin/time)使用 wait4 来获取父进程和子进程的使用情况,只要父进程等待子进程完成:
答案3
Valgrind 可以测量 Python 程序的内存使用情况,我还没有在多线程中使用过它。但这个链接似乎https://stackoverflow.com/questions/26131803/why-does-an-object-allocation-local-to-a-python-subprocess-increase-heap-size-foCallgrind 似乎就是为此而设计的功能https://valgrind.org/docs/manual/cl-manual.html