Proposal: Add Mix.Tasks.Profile.eprof and Mix.Tasks.Profile.cprof

99 views
Skip to first unread message

Sasha Fonseca

unread,
Feb 25, 2017, 8:18:09 AM2/25/17
to elixir-lang-core
Hello, 

I've recently started reading and further exploring Erlang and Elixir's profiling tools and techniques. Of the three Erlang base profiling tools (fprof, eprof and cprof), only fprof has been implemented as a Mix Task so far (fprof GitHub PR and elixir-lang-core thread).

Rationale: 

I believe eprof and cprof should also be added as a Mix Task (each) for the following reasons:

  1. Convenience: more convenient to run as a Mix Task than inside an IEx session or by other methods
  2. Standardisation: like said in the fprof elixir-lang-core thread it allows for easier inspection and pair debugging by issuing a standard command to retrieve results
  3. Developer Awareness: boosts awareness of Erlang/Elixir's profiling capabilities
  4. Purpose: 
    1. Eprof - offers a different set of results and a different behaviour (as per the docs):
      1. Medium result set vs. Large result set of fprof: simpler to evaluate and comprehend when no deep profiling is necessary. Fprof adds other criteria like callers and garbage collection
      2. Small slowdown of the system being profiled vs. Significant slowdown of fprof: this helps achieve a result set closer to the actual running system and offers less downtime while profiling)
    2. Cprof - offers a call count behaviour where execution time is disregarded:
      1. Small and simple result
      2. Small slowdown
  5. Why not: I don't see why we should have one tool but not the others :)
I've searched here, in the GitHub repo and in the Elixir Forum and I didn't find any proposals or intentions of adding this feature.

Implementation:

I believe profile.eprof.ex and profile.cprof.ex implementations should be as close as possible to profile.fprof.ex (implementation) for greater readability and maintainability. However, a large part of profile.fprof.ex is dedicated to formatting and printing the results, which won't be necessary in profile.eprof.ex since it automatically pretty prints the results. This will be necessary in profile.cprof.ex as its results aren't pretty printed.

One possible pitfall I see is when running async code. Eprof's and cprof's APIs need to be used like so:

:eprof.start
:eprof.start_profiling(<list of processes>) # or :eprof.profile(...)
<code to be profiled here>
:eprof.stop_profiling
:eprof.analyze

and

:cprof.start(...)
<code to be profiled here>
:cprof.pause
:cprof.analyze
:cprof.stop


I believe not everything may be profiled if a certain async task/process is being ran and is not finished before telling the profiler to stop or pause. This should happen in both eprof and cprof, meaning certain time consuming tasks won't be counted in eprof and certain calls won't be counted in cprof. 

This is also corroborated in eprof docs with the following statement:

The programmer must ensure that the function given as argument is truly synchronous and that no work continues after the function has returned a value.

For most use cases I believe a script/Mix Task can be achieved, profiling functions/mfa's with sequential or synchronous code, specially regarding cprofFrom what I've seen profile.fprof.ex also does not offer fprof's full API, but instead offers the options and behaviour which make sense in a Mix Task.

If this is accepted I'd like to give it a go at implementing one or both Mix Tasks during the next month or so. I'll probably start with cprof since it's the simplest tool.

Thanks!

José Valim

unread,
Feb 25, 2017, 8:59:18 AM2/25/17
to elixir-l...@googlegroups.com
That sounds like a good plan and it will be worth it especially if we can re-use a good part of the logic that is today in fprof. +1 for moving forward with this.



José Valim
Skype: jv.ptec
Founder and Director of R&D

--
You received this message because you are subscribed to the Google Groups "elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elixir-lang-core+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/d4917eac-2869-4dbf-ba78-19d3f095f7a5%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Sasha Fonseca

unread,
Feb 26, 2017, 10:16:00 AM2/26/17
to elixir-lang-core, jose....@plataformatec.com.br
Thank you José, I'll work on it then.
To unsubscribe from this group and stop receiving emails from it, send an email to elixir-lang-co...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages