[erlang-questions] Is there something like fprof but for memory profiling?

Michael Radford mrad-direct-erlang@REDACTED
Mon Feb 9 23:03:59 CET 2009


Sergey S writes:
> I'm looking for a tool which can help me to find out how much memory a
> function has consumed during its execution.

For a single invocation, you can get a rough answer by spawning a fresh
process:

Measure =
  fun (F) ->
    Parent = self (),
    Pid = spawn (fun () ->
		   { memory, M0 } = erlang:process_info (self (), memory),
		   F (),
		   { memory, M1 } = erlang:process_info (self (), memory),
		   Parent ! { self (), M1 - M0 }
		 end),
    receive
      { Pid, Bytes } when is_integer (Bytes) -> Bytes
    end
  end.

2> Measure (fun () -> ok end). 
2440
3> Measure (fun () -> lists:seq(1,100000) end).
1267296

But you are probably interested in measuring an average over a long run
of your server...

For that, I have no good answer, except maybe look at running the
emulator in instrumented mode (-instr) and see if the output of
instrument:descr(instrument:memory_data()) is helpful.  It will give
you blocks allocated by process id, which can often narrow things down
to a single module, but not a single function.  Unfortunately, the
instrumented emulator adds a lot of overhead, so your program will run
slow and require a lot more memory.

It would be fantastic to have a Erlang tool like valgrind's massif,
which tagged each allocation with a stacktrace and showed you statistics
on heap usage over time.

Mike



More information about the erlang-questions mailing list