From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758586AbcAUGwx (ORCPT ); Thu, 21 Jan 2016 01:52:53 -0500 Received: from szxga02-in.huawei.com ([119.145.14.65]:41513 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751357AbcAUGww (ORCPT ); Thu, 21 Jan 2016 01:52:52 -0500 Message-ID: <56A07FF3.2090009@huawei.com> Date: Thu, 21 Jan 2016 14:51:31 +0800 From: "Wangnan (F)" User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 MIME-Version: 1.0 To: Alexei Starovoitov CC: , , , He Kuang , Arnaldo Carvalho de Melo , Brendan Gregg , Jiri Olsa , Masami Hiramatsu , Namhyung Kim , Zefan Li , Subject: Re: [PATCH 0/6] perf core: Read from overwrite ring buffer References: <20160118120230.GP6357@twins.programming.kicks-ass.net> <1453202210-134429-1-git-send-email-wangnan0@huawei.com> <20160119174239.GA83683@ast-mbp.thefacebook.com> <569EE4E6.7040804@huawei.com> <20160120022020.GA89318@ast-mbp.thefacebook.com> In-Reply-To: <20160120022020.GA89318@ast-mbp.thefacebook.com> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.111.66.109] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020206.56A08004.00EA,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2013-06-18 04:22:30, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 324774101835bf71471d4d410d90151a Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2016/1/20 10:20, Alexei Starovoitov wrote: > On Wed, Jan 20, 2016 at 09:37:42AM +0800, Wangnan (F) wrote: >> >> On 2016/1/20 1:42, Alexei Starovoitov wrote: >>> On Tue, Jan 19, 2016 at 11:16:44AM +0000, Wang Nan wrote: >>>> This patchset introduces two methods to support reading from overwrite. >>>> >>>> 1) Tailsize: write the size of an event at the end of it >>>> 2) Backward writing: write the ring buffer from the end of it to the >>>> beginning. >>> what happend with your other idea of moving the whole header to the end? >>> That felt better than either of these options. >> I'll try it today. However, putting all of the three together is >> not as easy as this patchset. > I'm missing something. Why all three in one set? Can't implement all three in one, but implement two of them make benchmarking simpler :) Here comes some numbers. I attach a target program at the end of this mail. It calls close(-1) for 3000000 times, and use gettimeofday to check how many us it takes. Following cases are tested: BASE : ./a.out RAWPERF : ./perf record -o /dev/null -e raw_syscalls:* ./a.out WRTBKWRD: ./perf record -o /dev/null -e raw_syscalls:* ./a.out TAILSIZE: ./perf record --no-has-write-backward -o /dev/null -e raw_syscalls:*/overwrite/ ./a.out RAWOVWRT: ./perf record --no-has-write-backward --no-has-tailsize -o /dev/null -e raw_syscalls:*/overwrite/ ./a.out With this script: func() { for x in `seq 1 100` ; do $1; done | tee data_$2 } func ./a.out base func "./perf record -o /dev/null -e raw_syscalls:* ./a.out" rawperf func "./perf record -o /dev/null -e raw_syscalls:*/overwrite/ ./a.out" wrtbkwrd func "./perf record -o /dev/null --no-has-write-backward -e raw_syscalls:*/overwrite/ ./a.out" tailsize func "./perf record -o /dev/null --no-has-write-backward --no-has-tailsize -o /dev/null -e raw_syscalls:*/overwrite/ ./a.out" rawovwrt Result: MEAN STDVAR BASE : 879870.81 11913.13 RAWPERF : 2603854.7 706658.4 WRTBKWRD: 2313301.220 6727.957 TAILSIZE: 2383051.860 5248.061 RAWOVWRT: 2315273.180 5221.025 So it seems backward writing methods is good enough. We don't need to consider tailsize method. Code for this benchmark can be found from: https://git.kernel.org/cgit/linux/kernel/git/pi3orama/linux.git/ perf/overwrite-benchmark Thank you. -------- Test program ---------- #include #include #include #include int main() { int i; struct timeval tv1, tv2; long long us1, us2; gettimeofday(&tv1, NULL); for (i = 0; i < 1000 * 1000 * 3; i++) { close(-1); } gettimeofday(&tv2, NULL); us1 = tv1.tv_sec * 1000000 + tv1.tv_usec; us2 = tv2.tv_sec * 1000000 + tv2.tv_usec; printf("%ld\n", us2 - us1); return 0; }