• F
    perf tools: Fix trace events storms due to weight demux · 0983cc0d
    Frederic Weisbecker 提交于
    Trace events have a period (weight) of 1 by default. This can be
    overriden on events definition by using the __perf_count() macro.
    
    For example, the sched_stat_runtime() is weighted with the runtime of
    the task that fired the event.
    
    By default, perf handles such weighted event by dividing it into
    individual events carrying a weight of 1. For example if
    sched_stat_runtime is fired and the task has run 5000000 nsecs, perf
    divides it into 5000000 events in the buffer.
    
    This behaviour makes weighted events unusable because they quickly
    fullfill the buffers and we lose most events.
    
    The commit 5d81e5cf ("events: Don't
    divide events if it has field period") solves this problem by sending
    only one event when PERF_SAMPLE_PERIOD flag is set. The weight is
    carried in the sample itself such that we don't need to demultiplex it
    anymore.
    
    This patch provides the last missing piece to use this feature by
    setting PERF_SAMPLE_PERIOD from perf tools when we deal with trace
    events.
    
    Before:
    	$ ./perf record -e sched:* -a sleep 1
    	[ perf record: Woken up 3 times to write data ]
    	[ perf record: Captured and wrote 1.619 MB perf.data (~70749 samples) ]
    	Warning:
    	Processed 16909 events and lost 1 chunks!
    
    	Check IO/CPU overload!
    
    	$ ./perf script
    	perf  1894 [003]   824.898327: sched_migrate_task: comm=perf pid=1898 prio=120 orig_cpu=2 dest_cpu=0
    	perf  1894 [003]   824.898335: sched_stat_sleep: comm=perf pid=1898 delay=113179500 [ns]
    	perf  1894 [003]   824.898336: sched_stat_sleep: comm=perf pid=1898 delay=113179500 [ns]
    	perf  1894 [003]   824.898337: sched_stat_sleep: comm=perf pid=1898 delay=113179500 [ns]
    	perf  1894 [003]   824.898338: sched_stat_sleep: comm=perf pid=1898 delay=113179500 [ns]
    	perf  1894 [003]   824.898339: sched_stat_sleep: comm=perf pid=1898 delay=113179500 [ns]
    	perf  1894 [003]   824.898340: sched_stat_sleep: comm=perf pid=1898 delay=113179500 [ns]
    	perf  1894 [003]   824.898341: sched_stat_sleep: comm=perf pid=1898 delay=113179500 [ns]
    	[...]
    
    After:
    	$ ./perf record -e sched:* -a sleep 1
    	[ perf record: Woken up 1 times to write data ]
    	[ perf record: Captured and wrote 0.074 MB perf.data (~3228 samples) ]
    
    	$ ./perf script
    
    	perf  1461 [000]   554.286957: sched_migrate_task: comm=perf pid=1465 prio=120 orig_cpu=3 dest_cpu=1
    	perf  1461 [000]   554.286964: sched_stat_sleep: comm=perf pid=1465 delay=133047190 [ns]
    	perf  1461 [000]   554.286967: sched_wakeup: comm=perf pid=1465 prio=120 success=1 target_cpu=001
    	swapper     0 [001]   554.286976: sched_stat_wait: comm=perf pid=1465 delay=0 [ns]
    	swapper     0 [001]   554.286983: sched_switch: prev_comm=swapper/1 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=perf
    	[...]
    Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Namhyung Kim <namhyung@gmail.com>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/r/1342631456-7233-1-git-send-email-fweisbec@gmail.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
    0983cc0d
evlist.c 20.2 KB