linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Carl Love <cel@us.ibm.com>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>,
	Brendan Gregg <brendan.d.gregg@gmail.com>,
	Carl Love <cel@us.ibm.com>, Pekka Enberg <penberg@kernel.org>,
	"linux-perf-use." <linux-perf-users@vger.kernel.org>
Subject: Re: Perf support for interpreted and Just-In-Time translated olanguages
Date: Wed, 10 Dec 2014 09:41:35 -0800	[thread overview]
Message-ID: <1418233295.4953.33.camel@oc0276584878.ibm.com> (raw)
In-Reply-To: <87h9x449vd.fsf@tassilo.jf.intel.com>

On Tue, 2014-12-09 at 16:38 -0800, Andi Kleen wrote:
> Arnaldo Carvalho de Melo <acme@kernel.org> writes:
> 
> > When we use mmap(addr, len, PROT_EXEC) the kernel has a meta event
> > called PERF_RECORD_MMAP that will record addr range, symtab DSO path,
> > and we ask it to be timestamped, how to do that for the equivalent part
> > in the JVM?
> 
> http://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.html
> 
> You just need a way to push it from the agent to perf.
> 

This may be more complex then needed.  We really just need to track the
symbol.  From talking with the Java experts, they say the reused memory
is almost always from methods that are loaded/used early when
initializing the program.  Then the memory gets reused by a method that
runs for the bulk of the time.  So by getting a timestamp for when the
symbol was loaded you can then determine the length of time each symbol
was in the anonymous memory.  Then just associate the sample with the
symbol that was present in the anonymous memory the longest.  You can
also tag the symbol names to say that they reside in the same memory,
ie, the memory was reused. To warn the user that there maybe some
ambiguity in the sample to symbol association.  


> >
> > My initial thought was to find that using perf probe and insert there a
> > probe point, but I think that there may be already an existing
> > tracepoint in the jvm for that, one that, from what I've read so far,
> > is _not_ being used by this java perf agent, right?
> 
> The agent interface works by linking an agent with a special library
> I believe. So the agent can do whatever it wants.

> > From what I understood, how would it insert that event into the
> > perf.data event stream? Only if it necessarily involved a new mmap, via
> > the kernel, etc.
> 
> You basically need a way to trigger a perf event from user space.
> One simple way would be to just write a perf.data too into /tmp,
> and let perf collect that.
> 
> But it's more than that. You also need to transfer the executable
> code somewhere, and the line numbers.
> 

The source file and line number information is optionally available from
the jvm via the jvmti complied method load callback.  With this
information on the symbol, line number and source file, perf could then
persist the data in an ELF formatted file. 


> >  
> >> It just needs a better interface from the agent to perf, to pass all
> >> needed information, including symbols, line numbers, executable code
> >> (for PT decoding and for showing diassembler), and ordering it by time
> >> so that no hacks are needed.
> >> 
> >> BTW other JITs (LLVM, Mono, V8, ...) have similar interfaces.
> >> 
> >> Longer term as the kernel gets more JITed (eBPF etc.) it likely needs 
> >> some kind of JIT interface too.
> >
> > Right, this is something we need to have, no questions about it, its
> > just a matter of cooking up some prototype implementation...
> >
> > If, for instance, the java agent would put on some file those events,
> > timestamped, then when in perf report we would just insert them into the
> > event stream as synthesized PERF_RECORD_MMAPs, probably that would be
> > enough.
> 
> Really to be useful you need at least line numbers, better code.
> 
> In theory the agent could write ELF files with dwarf, but that may get
> really ugly.  Probably better to have something more light weight.

Perf would need to do this so the data collection and ELF file
conversion will be done only when pref is doing the profiling of the
JITed code. Specifically, if perf is passed the pid of a running JVM the
agent library would not know when profiling starts and stops.

         Carl Love

  reply	other threads:[~2014-12-10 17:41 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-05 20:18 Perf support for interpreted and Just-In-Time translated languages Carl Love
2014-12-05 21:27 ` Brendan Gregg
2014-12-09 20:34   ` Arnaldo Carvalho de Melo
2014-12-09 22:01     ` Andi Kleen
2014-12-09 22:22       ` Perf support for interpreted and Just-In-Time translated olanguages Arnaldo Carvalho de Melo
2014-12-10  0:38         ` Andi Kleen
2014-12-10 17:41           ` Carl Love [this message]
2014-12-10 18:09             ` Andi Kleen
2014-12-10 19:21             ` Arnaldo Carvalho de Melo
2014-12-10 19:19           ` Arnaldo Carvalho de Melo
2014-12-10 17:32         ` Andi Kleen
2014-12-10 17:39           ` David Ahern
2014-12-10 18:05             ` Andi Kleen
2014-12-10 18:27               ` David Ahern
2014-12-10 19:43                 ` Arnaldo Carvalho de Melo
2015-01-09 20:19                   ` Carl Love
2015-01-10  4:15                     ` William Cohen
2015-01-10 15:14                       ` David Ahern
2015-01-12 17:22                         ` Carl Love
2015-01-12 17:58                           ` David Ahern
2015-01-12 18:43                             ` Carl Love
2015-01-20 18:19                             ` Carl Love
2015-01-20 19:29                               ` Arnaldo Carvalho de Melo
2015-01-20 20:34                                 ` Carl Love
2015-01-20 20:52                                   ` Arnaldo Carvalho de Melo
2015-01-23  8:25                               ` Sujoy Saraswati
2014-12-10  7:55     ` Perf support for interpreted and Just-In-Time translated languages Pekka Enberg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1418233295.4953.33.camel@oc0276584878.ibm.com \
    --to=cel@us.ibm.com \
    --cc=acme@kernel.org \
    --cc=andi@firstfloor.org \
    --cc=brendan.d.gregg@gmail.com \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=penberg@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).