I have a couple processes running a tool I've written that are joined by pipes, and I would like to measure their collected memory usage with valgrind
. So far, I have tried something like:
$ valgrind tool=massif trace-children=yes --peak-inaccuracy=0.5 --pages-as-heap=yes --massif-out-file=myProcesses".%p" myProcesses.script
Where myProcesses.script
runs the equivalent of my tool foo
twice, e.g.:
foo | foo > /dev/null
Valgrind doesn't seem to capture the collected memory usage of this the way I expect. If I use top
to track this, I get (for sake of argument) 10% memory usage on the first foo
, and then another 10% collects on the second foo
before the myProcesses.script
completes. This is the sort of thing I want to measure: the usage of both processes. Valgrind instead returns the following error:
Massif: ms_main.c:1891 (ms_new_mem_brk): Assertion 'VG_IS_PAGE_ALIGNED(len)' failed.
Is there a way to collect memory usage data for commands I'm using in a piped fashion (using valgrind
)? Or a similar tool that I can use to accurately automate these measurements?
The numbers that top
returns while polling seem hand-wavy, to me, and I am seeking accurate and repeatable measurements. If you have suggestions for alternative tools, I would welcome those, as well.
EDIT - Fixed typo with valgrind
option.
EDIT 2 - For some reason, it appears that the option --pages-as-heap
is giving us troubles with the binaries we're testing. Your examples run fine. A new page is created every time we enter a non-inlined function (stack overflows - heh). We wanted to count those, but they're relatively minor in the scale of memory usage we're testing. (Perhaps there aren't function calls in ls
or less
?) Removing --pages-as-heap
helped get testing working again. Thanks to MrGomez for the great help.