测量峰值内存使用情况:相当于 /usr/bin/time -v,包括子进程/分叉进程

测量峰值内存使用情况:相当于 /usr/bin/time -v,包括子进程/分叉进程

我一直在使用 /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

procpathpysparklines命令是先决条件。可以像这样安装:

$ pipx install procpath
$ pipx install pysparklines

答案2

GNU time(/usr/bin/time)使用 wait4 来获取父进程和子进程的使用情况,只要父进程等待子进程完成:

https://stackoverflow.com/questions/55955309/does-gnu-time-memory-output-account-for-child-processes-too

答案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

相关内容