Received: by 10.223.176.5 with SMTP id f5csp2644628wra; Mon, 29 Jan 2018 01:27:09 -0800 (PST) X-Google-Smtp-Source: AH8x227rSn9A/bAKribI+WBYi/MM65HVQoUl3ndj6GcPQyDPHb4vhp7TfGeqUyzrv5M5swODH1Kg X-Received: by 2002:a17:902:4181:: with SMTP id f1-v6mr21464436pld.59.1517218029633; Mon, 29 Jan 2018 01:27:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517218029; cv=none; d=google.com; s=arc-20160816; b=u3L1okx6Ze5Kgjb+GJZYMiLQZu+qOan/GDMbW9GNeuVehfDYIvCNZJdSTCVda1YZjk DPAAbADG8cymrOmVt0nedLuMoSAl1Dk4wjZA0igoQdy6hQvobHOIK81DA5hGrk+AvYt/ /+uFrRwg/ga/55JcF+SsiOJAkrWKZ5M6MP7OUZ7qXHg9EwcLTzI6EQyMoPWl/AjIOedb tEaOn2MJ7vBsb0PKAkGLSdA9v9ADRMIkDHt6DgsmEozP75E0lhYFXFcUxCe91GA4abQW k5zR2XW0caSoOn3Zo8e9RmSv4NWKzfVVV+s0/ePqaIRH5SeZwnwh+XI9kggKB1DsN5wD 07Ag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=Btl9UO8GIvy+mF9ckf06ZJw/6apPE8pkiYasOF23K/g=; b=h3oAiDWK9QU1Ztr/j29ZCqt3h5Y3mrQealSeWXSm0yH/GD7yXlaZZZ5Eqm6A4ZSDfA 93BAShjwn/Y6MsqUGz+nh2WOzFbATYvTvEOBKwJ/Q5FPRgsgWprmxSDpln+vERWw82j1 H3txItmGALYzr7reU7Rhz00Z2DzkG5DkagC9MUIYQTXB4HxbX2XyHIo07ExRb4CPaGDb cgTOLwU+qaku69oRSGm/+8sQ8zrUGZ3gdKN0TZvwPFCpmUpC+pyWVs2HAsz5SdPnq5rV jqLzfkpELEXHLWiLql5ADnexBvGZCp/gofUtfaeFF4CXpdz5BCV/myOi4/sW0isyVSuy 11Eg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ATwPzyWE; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 186si11419738pfe.411.2018.01.29.01.26.32; Mon, 29 Jan 2018 01:27:09 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ATwPzyWE; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751741AbeA2JZ4 (ORCPT + 99 others); Mon, 29 Jan 2018 04:25:56 -0500 Received: from mail-io0-f195.google.com ([209.85.223.195]:33109 "EHLO mail-io0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751599AbeA2JZw (ORCPT ); Mon, 29 Jan 2018 04:25:52 -0500 Received: by mail-io0-f195.google.com with SMTP id n7so6914427iob.0; Mon, 29 Jan 2018 01:25:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Btl9UO8GIvy+mF9ckf06ZJw/6apPE8pkiYasOF23K/g=; b=ATwPzyWEqAOEghOZ3zXOm5iKKHt9Xu8F6PQuFyTMYrk0RlyW63kwqjUj4mAFWEiHSB fe9xIHSaUsUWH6zQyC7SRWB8I6q2DWrPgAAVsvYhcY3hJSdZz8knQ9TcLj0T4sVDJt+J 8Uyy0CIw2KKhHl+XDUQ9/3QdkoXL3kxspytKngFK1u+SXamVRK/htUBygULDFiJOh6zy o7CKN0SS9KA1tZB/kHWeb3ZmAwAiU/T6DqQTVjFIoiPnE+uNRCFNu7Zm9p52/9IBYDbo lj8dlA4sWqyzi+9gCK4GjVtjAqCs3/ALm8C6Lb1C+SqfMSJ+2i6vG5aTbt1FtcoVqd4I Vv2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Btl9UO8GIvy+mF9ckf06ZJw/6apPE8pkiYasOF23K/g=; b=IZ4BZuO6lHGZNFXrGuQ7ou/iySEnNP6NlLNPCNuRECZG//Ngmz/F2Ozt/ndBKsf7M7 j66l3QDtDGJrvZv1UEBM80rCStHW3o4HnNJAtswsWJHo4u4UJpbJmq9YI/i6Kvv1GqlM CgrlZFyTI0LCFRcw0iI/5NPmGX6DOeMIFb96BCrijmDoOZDYiJQq0qegW9xymRGK+N2H dsP+ZAz+wqqaqRDHO45fIh2YF4cb2lsFIIISA3isYEi5LwQ6qPhTgevh9dmPw8TvkzV8 cihSBmJWY31w/AGUZMwXYrSQktBxlbf6CD44x3DY/D2Rlu8yT8EeLMUoDkmDfKYOonD3 5DTQ== X-Gm-Message-State: AKwxytdF53Q5gSPrevTmjViZQ5VbSm7mrQtI7jMSW9VjQ1SXxLZgXbH1 GjoIPjBwaZO1I8ves7SJ/PU= X-Received: by 10.107.7.203 with SMTP id g72mr23666894ioi.149.1517217951809; Mon, 29 Jan 2018 01:25:51 -0800 (PST) Received: from node3.didichuxing.com ([40.83.124.139]) by smtp.gmail.com with ESMTPSA id j3sm3869448iob.14.2018.01.29.01.25.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 29 Jan 2018 01:25:50 -0800 (PST) From: ufo19890607 To: peterz@infradead.org, mingo@redhat.com, alexander.shishkin@linux.intel.com, jolsa@kernel.org, dsahern@gmail.com, namhyung@kernel.org, milian.wolff@kdab.com, arnaldo.melo@gmail.com, yuzhoujian@didichuxing.com, adrian.hunter@intel.com, wangnan0@huawei.com, Kan.liang@intel.com Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, acme@redhat.com Subject: [PATCH v4 2/2] perf stat: Add support to print counts after a period of time Date: Mon, 29 Jan 2018 10:25:23 +0100 Message-Id: <1517217923-8302-3-git-send-email-ufo19890607@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1517217923-8302-1-git-send-email-ufo19890607@gmail.com> References: <1517217923-8302-1-git-send-email-ufo19890607@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: yuzhoujian Introduce a new option to print counts after N milliseconds and update perf-stat documentation accordingly. Show below is the output of the new option for perf stat. $ perf stat --time 2000 -e cycles -a Performance counter stats for 'system wide': 157,260,423 cycles 2.003060766 seconds time elapsed We can print the count deltas after N milliseconds with this new introduced option. This option is not supported with "-I" option. In addition, according to Kangliang's patch(19afd10410957), the monitoring overhead for system-wide core event could be very high if the interval-print parameter was below 100ms, and the limitation value is 10ms. So the same warning will be displayed when the time is set between 10ms to 100ms, and the minimal time is limited to 10ms. Users can make a decision according to their spcific cases. Changes since v3: - none. Changes since v2: - modify the time check in __run_perf_stat func to keep some consistency with the workload case. - add the warning when the time is set between 10ms to 100ms. - add the pr_err when the time is set below 10ms. Changes since v1: - none. Signed-off-by: yuzhoujian --- tools/perf/Documentation/perf-stat.txt | 5 +++++ tools/perf/builtin-stat.c | 33 +++++++++++++++++++++++++++++++-- tools/perf/util/stat.h | 1 + 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/tools/perf/Documentation/perf-stat.txt b/tools/perf/Documentation/perf-stat.txt index 47a21645f60c..c822f374c99a 100644 --- a/tools/perf/Documentation/perf-stat.txt +++ b/tools/perf/Documentation/perf-stat.txt @@ -151,6 +151,11 @@ Print count deltas for fixed number of times. This option should be used together with "-I" option. example: 'perf stat -I 1000 --interval-count 2 -e cycles -a' +--time msecs:: +Print count deltas after N milliseconds (minimum: 10 ms). +This option is not supported with "-I" option. + example: 'perf stat --time 2000 -e cycles -a' + --metric-only:: Only print computed metrics. Print them in a single line. Don't show any raw values. Not supported with --per-thread. diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 7d1d7613bf56..582db3897374 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -573,6 +573,7 @@ static int __run_perf_stat(int argc, const char **argv) { int interval = stat_config.interval; int times = stat_config.times; + int time = stat_config.time; char msg[BUFSIZ]; unsigned long long t0, t1; struct perf_evsel *counter; @@ -586,6 +587,9 @@ static int __run_perf_stat(int argc, const char **argv) if (interval) { ts.tv_sec = interval / USEC_PER_MSEC; ts.tv_nsec = (interval % USEC_PER_MSEC) * NSEC_PER_MSEC; + } else if (time) { + ts.tv_sec = time / USEC_PER_MSEC; + ts.tv_nsec = (time % USEC_PER_MSEC) * NSEC_PER_MSEC; } else { ts.tv_sec = 1; ts.tv_nsec = 0; @@ -698,9 +702,11 @@ static int __run_perf_stat(int argc, const char **argv) perf_evlist__start_workload(evsel_list); enable_counters(); - if (interval) { + if (interval || time) { while (!waitpid(child_pid, &status, WNOHANG)) { nanosleep(&ts, NULL); + if (time) + break; process_interval(); if (interval_count && !(--times)) break; @@ -720,6 +726,8 @@ static int __run_perf_stat(int argc, const char **argv) enable_counters(); while (!done) { nanosleep(&ts, NULL); + if (time) + break; if (interval) { process_interval(); if (interval_count && !(--times)) @@ -1900,6 +1908,8 @@ static const struct option stat_options[] = { "print counts at regular interval in ms (>= 10)"), OPT_INTEGER(0, "interval-count", &stat_config.times, "print counts for fixed number of times"), + OPT_UINTEGER(0, "time", &stat_config.time, + "print counts after a period of time in ms (>= 10)"), OPT_SET_UINT(0, "per-socket", &stat_config.aggr_mode, "aggregate counts per processor socket", AGGR_SOCKET), OPT_SET_UINT(0, "per-core", &stat_config.aggr_mode, @@ -2697,7 +2707,7 @@ int cmd_stat(int argc, const char **argv) int status = -EINVAL, run_idx; const char *mode; FILE *output = stderr; - unsigned int interval; + unsigned int interval, time; const char * const stat_subcommands[] = { "record", "report" }; setlocale(LC_ALL, ""); @@ -2728,6 +2738,7 @@ int cmd_stat(int argc, const char **argv) return __cmd_report(argc, argv); interval = stat_config.interval; + time = stat_config.time; /* * For record command the -o is already taken care of. @@ -2879,6 +2890,7 @@ int cmd_stat(int argc, const char **argv) "The overhead percentage could be high in some cases. " "Please proceed with caution.\n"); } + if (stat_config.times && interval) interval_count = true; else if (stat_config.times && !interval) { @@ -2889,6 +2901,23 @@ int cmd_stat(int argc, const char **argv) goto out; } + if (time && time < 100) { + if (time < 10) { + pr_err("time must be >= 10ms.\n"); + parse_options_usage(stat_usage, stat_options, "time", 0); + goto out; + } else + pr_warning("time < 100ms. " + "The overhead percentage could be high in some cases. " + "Please proceed with caution.\n"); + } + if (time && interval) { + pr_err("time option is not supported with interval-print.\n"); + parse_options_usage(stat_usage, stat_options, "time", 0); + parse_options_usage(stat_usage, stat_options, "I", 1); + goto out; + } + if (perf_evlist__alloc_stats(evsel_list, interval)) goto out; diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h index 540fbb350e53..fc1ab635f7e0 100644 --- a/tools/perf/util/stat.h +++ b/tools/perf/util/stat.h @@ -90,6 +90,7 @@ struct perf_stat_config { bool scale; FILE *output; unsigned int interval; + unsigned int time; int times; struct runtime_stat *stats; int stats_num; -- 2.14.1