Received: by 10.223.176.46 with SMTP id f43csp439291wra; Fri, 26 Jan 2018 01:08:49 -0800 (PST) X-Google-Smtp-Source: AH8x227NuO+YrcNm3TpxgFmiUHGBWg3hjNtfuX5/dQ+038YgZlw4GBBB6DGMtLgFW1NWOJquay3V X-Received: by 10.99.171.78 with SMTP id k14mr15151906pgp.287.1516957729753; Fri, 26 Jan 2018 01:08:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516957729; cv=none; d=google.com; s=arc-20160816; b=JQdmEqS4LHyhW+yQO6K6UTa3HyO9QP7bAzJwoa3E7QS1zZo0rsk/2lcC84UuNo6iH9 s2W4JLyNegaeUJPZMxkYGANhA9c1pnAAQZ+dmEyanazEOd/itJcePRS5Vhvkl6Ge31r9 YIj2NPQzMLgQ5uaL0TKoZB62T6OAnkN1J/XGda6ElfKZkoZ9ScvJbMYxH34VV/6OQzpw +x1SiIuN6PqyVeetMxz+cMkNBUn+xxIdJdXRDgfV87FpuBX8tDZf69esD56tXiWtW9kr 63HtjJScZeyAYVQrfEp6VSu/p2a5lJhedE9+8sRqeX1qNQKMruj6/n4OexBDPep26l80 78ew== 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=xadpMHtHTv9HAzOVi8mOtKvWGp2dpM8KyLGzVOhCp5I=; b=fSf5iTtUTm1cWDND3i96VBwlRH3FoNp8w5Tu+Mjr7l7SMAwXVgnJvXTknheHsU0hu4 dW8ozWkJFGJZpzEJgkz0bVmdUGqQ2qONd8l7vwL/dt9lhHVlF1KHT0/OX7b9N4+3o3eC ExFyI80g5QWY+yI/37DjPnLzsRr783tXNa7+QDhCuRUEvQX1n5SfSjePiZ7Sso9/4ZNU B/Z8L2Kl6Ms6e1WNzsbu/tTDCyfgpbd5/IKpOYTkEdN6zpr1jkAiX1QAfJ+LDG7Bp+RK 2RqrXGfyAbClV0YJExn+EdP3Kgy4XbYtnBHaog9KvjiXNtVkDdnXAUMRrF0P6sl6hsN8 UXdw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=phkLtTp9; 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 f64si6047443pfa.364.2018.01.26.01.08.35; Fri, 26 Jan 2018 01:08:49 -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=phkLtTp9; 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 S1752728AbeAZJHx (ORCPT + 99 others); Fri, 26 Jan 2018 04:07:53 -0500 Received: from mail-pg0-f65.google.com ([74.125.83.65]:34232 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752726AbeAZJHW (ORCPT ); Fri, 26 Jan 2018 04:07:22 -0500 Received: by mail-pg0-f65.google.com with SMTP id r19so6905838pgn.1; Fri, 26 Jan 2018 01:07:22 -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=xadpMHtHTv9HAzOVi8mOtKvWGp2dpM8KyLGzVOhCp5I=; b=phkLtTp9hA8EzBI0zz5JT+EwzwaupXGzDkuFokb7vsqgSe7pkEujAfDXp/7M+GFawL pBtefbp5biOKoiWBEYghLWA2EMAf1K1owjV6XXGStONMNi1ZfKLE9UiXRywMEmZCEL7X YBUe8fdlHKBs8B64j2TX2qOVSl4FPkQfWmJsT7aVbDHfHnDlb35oKYVJumIFHthd3cZq cip8vbL7qhPqvR5GauwuDCcAJGldrm02QoA6LduagxBxfKhFEI6AfG/KtEpUiGNv3CCl p1WifwBm/nGlLqofTnFor/ncJvKP6yvlUjEs2e0qJQ/EDVITu9wepaK/CwY7XvMyTW9o NHAQ== 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=xadpMHtHTv9HAzOVi8mOtKvWGp2dpM8KyLGzVOhCp5I=; b=olQx8N9EBn0grG9lKsW6SYojQRrGDlgbW1zQR/1icqtXbah146EFiqEpkd/ctEimvh mdjCvDIb30TF1UTT3MaQ+HyVNU6lglrbDHL+Tji3yl7dz5VDHtWqKVZ45qUrycFooTb3 XgTPvi2LHYqgavhTK1ThP9z1tO8lM2ZFXUD10Cg+TenRNPdyAstHqzJCYle/MoLeLQzc uC22Z2WKhXShiUTlmlhb4mvtsckBMUvTYVTLasO0EHrQTm3O7G9LDCxGDV6TbwvS+/CO ObrnJMZz6dnuTwGWdZAT2hU4qpXYMjedXQwK+jukRCYBBj25yDHa409t7bF5MtvpFo4Z DinQ== X-Gm-Message-State: AKwxytc7QuEm4yJX5/lpQ/HHNDNvBHABVFZR6tM2kZlhE2MT+6WxMFuM NTJpXdzRphyXW26XO/4AUzQ= X-Received: by 2002:a17:902:9893:: with SMTP id s19-v6mr13622973plp.101.1516957641748; Fri, 26 Jan 2018 01:07:21 -0800 (PST) Received: from node3.didichuxing.com ([203.100.54.194]) by smtp.gmail.com with ESMTPSA id f10sm7151902pgr.33.2018.01.26.01.07.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 26 Jan 2018 01:07:20 -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 v3 2/2] perf stat: Add support to print counts after a period of time Date: Fri, 26 Jan 2018 10:06:57 +0100 Message-Id: <1516957617-23985-3-git-send-email-ufo19890607@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516957617-23985-1-git-send-email-ufo19890607@gmail.com> References: <1516957617-23985-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 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 406f546ad74c..73c011acf92a 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 == true) { if (--times == 0) @@ -722,6 +728,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 == true) { @@ -1904,6 +1912,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, @@ -2701,7 +2711,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; int times; const char * const stat_subcommands[] = { "record", "report" }; @@ -2734,6 +2744,7 @@ int cmd_stat(int argc, const char **argv) interval = stat_config.interval; times = stat_config.times; + time = stat_config.time; /* * For record command the -o is already taken care of. @@ -2885,6 +2896,7 @@ int cmd_stat(int argc, const char **argv) "The overhead percentage could be high in some cases. " "Please proceed with caution.\n"); } + if (times && interval) interval_count = true; else if (times && !interval) { @@ -2895,6 +2907,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 b2f8a347d358..6c621951fda8 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