假设有两个脚本:(a)调用JAVA jar的 bash shell脚本(以下称my_shell_script
),以及(b)从其他Python包导入函数的Python脚本但是不会调用任何非Python包或软件(以下称my_Python_script
)。这两个脚本具有相同的目的:它们采用相同的输入(以下为testinput
)并生成大致相同的输出。
我想在执行时测量并比较两个脚本的内存使用情况作为时间的函数。
为此,我使用valgrind
通过massif
执行每个脚本(将time_unit设置为毫秒),然后通过ms_print
汇总massif输出。
INF=testinput
# Testing Shell script
valgrind --tool=massif --pages-as-heap=yes --time-unit=ms --massif-out-file=${INF}_shell.out bash my_shell_script -f $INF -j my_java_jar
ms_print --threshold=50.0 ${INF}_shell.out > ${INF}_shell.summary
# Testing Python script
valgrind --tool=massif --pages-as-heap=yes --time-unit=ms --massif-out-file=${INF}_Python.out python2 my_python_script $INF
ms_print --threshold=50.0 ${INF}_Python.out > ${INF}_Python.summary
虽然valgrind / massif记录my_python_script
的内存使用量与我通过htop
看到的大致一致,但my_shell_script
并非如此。 htop
上的统计信息表示执行my_shell_script
期间内存使用量为GB,但valgrind / massif仅记录了几十MB内存。
因此,我怀疑valgrind / massif记录了bash代码执行的内存使用情况,但没有记录bash代码正在调用的JAVA jar。
如何正确测量my_shell_script
作为时间函数的内存使用情况?
答案 0 :(得分:0)
选项--trace-children = yes | no表示跟踪(或不跟踪)子项。默认值为no,这意味着执行脚本的shell将会 在valgrind下,但不是启动的python或java进程。
因此,请指定--trace-children = yes。
请务必使用例如massif out文件参数中的%p,否则全部为 进程(例如shell及其子进程)将写入相同的文件,这将无法正常工作。