From: David Ahern <dsahern@gmail.com>
To: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Joseph Schuchart <joseph.schuchart@tu-dresden.de>,
Ingo Molnar <mingo@kernel.org>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Paul Mackerras <paulus@samba.org>, Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@ghostprotocols.net>,
thomas.ilsche@tu-dresden.de, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Perf: Correct Assumptions about Sample Timestamps in Passes
Date: Wed, 08 Jan 2014 14:48:37 -0700 [thread overview]
Message-ID: <52CDC7B5.6060704@gmail.com> (raw)
In-Reply-To: <20140104150539.GA17617@localhost.localdomain>
On 1/4/14, 8:05 AM, Frederic Weisbecker wrote:
> On Fri, Jan 03, 2014 at 03:45:36PM -0700, David Ahern wrote:
>> On 1/3/14, 3:07 PM, Frederic Weisbecker wrote:
>>> I'm not sure I understand why we need that. Why doesn't it work by simply flushing
>>> events prior to the earliest timestamp among every CPUs last event?
>>
>> Here's one scenario. Consider N-mmaps:
>>
>> |----- t_flush
>> v
>> 0 -----|---x------------------------
>> 1 -----|----|------------------------
>> ... |
>> N -----|-------ssss-|-----------------
>>
>> t_start t_1 ... t_N
>>
>> You start a round at some time -- t_start. By starting a round it
>> means you go to mmap 0 and check for events, then mmap 1, ..., mmap
>> N. It takes a finite amount of time to move from one mmap to
>> another.
>>
>> Assume there are no events on mmap 0, 1, ... N-1 but samples are
>> generated in mmap N. In the time it takes to move forward from 0 to
>> N, a sample can be generated for mmap 0 and written to the buffer -
>> the 'x' above. It now contains a timestamp < than samples on any
>> other mmap and out pops the flush error.
>
> Lets reformulate as following. I'm copy-pasting the example in session.c
> but adapting it to your scenario.
>
> * ============ PASS n =================
> * CPU 0 | CPU 1
> * |
> * - | 2
> * - | 3
> * - | 4 <--- max recorded
> *
> * ============ PASS n + 1 ==============
> * CPU 0 | CPU 1
> * |
> * 1 | 5
> * - | 6
> * - | 7 <---- max recorded
> *
> * Flush every events below timestamp 4
> *
>
> So in the first round, CPU 0 has no event by the time we read it. Then while
> we read the events from CPU 1 (val 2,3,4), a new one comes in concurrently
> in CPU 0 (val 1, which matches 's' in your example ). We missed it due to the
> linear mmap read on all buffers so we'll get it on the second round.
>
> We find it out in the second round, CPU 1 has also new events. At this time we know that
> if CPU 0 had events up to timestamp 4, we should have seen all of them because
> we read CPU 0 buffer in PASS n + 1 after we read CPU 1 buffer on PASS n.
>
> Of course that's what happens in a perfect world with the assumption that ordering
> is all correct, that events write/commit doesn't take too much time to complete,
> that perf_clock() is globally monotonic (and it's not IIUC). But a little heuristical
> correction on the timestamp barrier should prevent from issues with that.
>
> So this is how the code behaves currently and it should handle a case like above.
The existing code does not work. Your unstable tsc patch did not work. I
have not tried Joseph's patch. Are you proposing that one or do you have
something else in mind?
> Now there is still the problem of:
>
> 1) local timestamps not moving forward (could it happen when events happen in storm,
> when they overflow multiple times in once for example, and clock is not granular
> enough?)
Even at 650k events/sec I am not seeing this problem.
> Anyway this should be solved with the patch that takes the earliest last event on all
> CPU buffer instead of the maximum of a round as a barrier.
>
> 2) local timestamps not monotonic due to interrupting events. This could be fixed
> in the kernel with moving perf_clock() snapshot in perf_output_sample().
>
For perf-kvm the events are all tracepoints, so there should not be a
problem of overlap due to interruption.
David
next prev parent reply other threads:[~2014-01-08 21:48 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-14 8:07 Joseph Schuchart
2013-11-14 8:39 ` Ingo Molnar
2013-11-14 8:59 ` Joseph Schuchart
2013-11-14 10:05 ` Ingo Molnar
2013-11-14 14:26 ` David Ahern
2013-11-14 14:44 ` Peter Zijlstra
2013-11-14 15:02 ` David Ahern
2013-11-14 15:25 ` Peter Zijlstra
2013-11-21 14:55 ` Joseph Schuchart
2013-11-27 13:51 ` Ingo Molnar
2013-12-20 12:27 ` Joseph Schuchart
2013-12-20 17:09 ` David Ahern
2013-12-23 13:10 ` Frederic Weisbecker
2013-12-23 14:44 ` David Ahern
2013-12-26 15:14 ` Frederic Weisbecker
2013-12-26 15:24 ` David Ahern
2013-12-26 15:30 ` Frederic Weisbecker
2014-01-01 18:37 ` David Ahern
2014-01-03 22:07 ` Frederic Weisbecker
2014-01-03 22:45 ` David Ahern
2014-01-04 15:05 ` Frederic Weisbecker
2014-01-08 21:48 ` David Ahern [this message]
2014-01-09 15:19 ` Frederic Weisbecker
2014-01-12 15:46 ` David Ahern
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=52CDC7B5.6060704@gmail.com \
--to=dsahern@gmail.com \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@ghostprotocols.net \
--cc=fweisbec@gmail.com \
--cc=joseph.schuchart@tu-dresden.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=mingo@redhat.com \
--cc=paulus@samba.org \
--cc=thomas.ilsche@tu-dresden.de \
/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
Powered by JetHome