* [PATCH v4 0/2] perf stat: Add interval-count and time support @ 2018-01-29 9:25 ufo19890607 2018-01-29 9:25 ` [PATCH v4 1/2] perf stat: Add support to print counts for fixed times ufo19890607 ` (2 more replies) 0 siblings, 3 replies; 9+ messages in thread From: ufo19890607 @ 2018-01-29 9:25 UTC (permalink / raw) To: peterz, mingo, alexander.shishkin, jolsa, dsahern, namhyung, milian.wolff, arnaldo.melo, yuzhoujian, adrian.hunter, wangnan0, Kan.liang Cc: linux-perf-users, linux-kernel, acme From: yuzhoujian <yuzhoujian@didichuxing.com> Introduce two new options for perf stat and update perf-stat documentation accordingly. The interval-count option can be used to print counts for fixed number of times, and it should be used specifically with "-I" option. Show below is the output of the interval-count option for perf stat. $ perf stat -I 1000 --interval-count 2 -e cycles -a # time counts unit events 1.002827089 93,884,870 cycles 2.004231506 56,573,446 cycles The time option can be used to print counts after a period of time, and it should not be used with "-I" option. Show below is the output of the time 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 yuzhoujian (2): perf stat: Add support to print counts for fixed times perf stat: Add support to print counts after a period of time Changes since v3: - merge interval_count check and times check to one line. - fix the wrong indent in stat.h - use stat_config.times instead of 'times' in cmd_stat function. 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: - change the name of the new option "times-print" to "interval-count". - keep the interval-count option interval specifically. tools/perf/Documentation/perf-stat.txt | 10 +++++++ tools/perf/builtin-stat.c | 53 ++++++++++++++++++++++++++++++++-- tools/perf/util/stat.h | 2 ++ 3 files changed, 62 insertions(+), 3 deletions(-) -- 2.14.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v4 1/2] perf stat: Add support to print counts for fixed times 2018-01-29 9:25 [PATCH v4 0/2] perf stat: Add interval-count and time support ufo19890607 @ 2018-01-29 9:25 ` ufo19890607 2018-02-17 11:23 ` [tip:perf/core] " tip-bot for yuzhoujian 2018-01-29 9:25 ` [PATCH v4 2/2] perf stat: Add support to print counts after a period of time ufo19890607 2018-01-29 10:25 ` [PATCH v4 0/2] perf stat: Add interval-count and time support Jiri Olsa 2 siblings, 1 reply; 9+ messages in thread From: ufo19890607 @ 2018-01-29 9:25 UTC (permalink / raw) To: peterz, mingo, alexander.shishkin, jolsa, dsahern, namhyung, milian.wolff, arnaldo.melo, yuzhoujian, adrian.hunter, wangnan0, Kan.liang Cc: linux-perf-users, linux-kernel, acme From: yuzhoujian <yuzhoujian@didichuxing.com> Introduce a new option to print counts for fixed number of times and update perf-stat documentation accordingly. Show below is the output of the new option for perf stat. $ perf stat -I 1000 --interval-count 2 -e cycles -a # time counts unit events 1.002827089 93,884,870 cycles 2.004231506 56,573,446 cycles We can just print the counts for several times with this newly introduced option. The usage of it is a little like vmstat, and it should be used together with "-I" option. $ vmstat -n 1 2 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 78270544 547484 51732076 0 0 0 20 1 1 1 0 99 0 0 0 0 0 78270512 547484 51732080 0 0 0 16 477 1555 0 0 100 0 0 Changes since v3: - merge interval_count check and times check to one line. - fix the wrong indent in stat.h - use stat_config.times instead of 'times' in cmd_stat function. Changes since v2: - none. Changes since v1: - change the name of the new option "times-print" to "interval-count". - keep the new option interval specifically. Signed-off-by: yuzhoujian <yuzhoujian@didichuxing.com> --- tools/perf/Documentation/perf-stat.txt | 5 +++++ tools/perf/builtin-stat.c | 20 +++++++++++++++++++- tools/perf/util/stat.h | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/tools/perf/Documentation/perf-stat.txt b/tools/perf/Documentation/perf-stat.txt index 823fce7674bb..47a21645f60c 100644 --- a/tools/perf/Documentation/perf-stat.txt +++ b/tools/perf/Documentation/perf-stat.txt @@ -146,6 +146,11 @@ Print count deltas every N milliseconds (minimum: 10ms) The overhead percentage could be high in some cases, for instance with small, sub 100ms intervals. Use with caution. example: 'perf stat -I 1000 -e cycles -a sleep 5' +--interval-count times:: +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' + --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 98bf9d32f222..7d1d7613bf56 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -168,6 +168,7 @@ static struct timespec ref_time; static struct cpu_map *aggr_map; static aggr_get_id_t aggr_get_id; static bool append_file; +static bool interval_count; static const char *output_name; static int output_fd; static int print_free_counters_hint; @@ -571,6 +572,7 @@ static struct perf_evsel *perf_evsel__reset_weak_group(struct perf_evsel *evsel) static int __run_perf_stat(int argc, const char **argv) { int interval = stat_config.interval; + int times = stat_config.times; char msg[BUFSIZ]; unsigned long long t0, t1; struct perf_evsel *counter; @@ -700,6 +702,8 @@ static int __run_perf_stat(int argc, const char **argv) while (!waitpid(child_pid, &status, WNOHANG)) { nanosleep(&ts, NULL); process_interval(); + if (interval_count && !(--times)) + break; } } waitpid(child_pid, &status, 0); @@ -716,8 +720,11 @@ static int __run_perf_stat(int argc, const char **argv) enable_counters(); while (!done) { nanosleep(&ts, NULL); - if (interval) + if (interval) { process_interval(); + if (interval_count && !(--times)) + break; + } } } @@ -1891,6 +1898,8 @@ static const struct option stat_options[] = { "command to run after to the measured command"), OPT_UINTEGER('I', "interval-print", &stat_config.interval, "print counts at regular interval in ms (>= 10)"), + OPT_INTEGER(0, "interval-count", &stat_config.times, + "print counts for fixed number of times"), 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, @@ -2870,6 +2879,15 @@ 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) { + pr_err("interval-count option should be used together with " + "interval-print.\n"); + parse_options_usage(stat_usage, stat_options, "interval-count", 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 dbc6f7134f61..540fbb350e53 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; + int times; struct runtime_stat *stats; int stats_num; }; -- 2.14.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [tip:perf/core] perf stat: Add support to print counts for fixed times 2018-01-29 9:25 ` [PATCH v4 1/2] perf stat: Add support to print counts for fixed times ufo19890607 @ 2018-02-17 11:23 ` tip-bot for yuzhoujian 0 siblings, 0 replies; 9+ messages in thread From: tip-bot for yuzhoujian @ 2018-02-17 11:23 UTC (permalink / raw) To: linux-tip-commits Cc: yuzhoujian, linux-kernel, kan.liang, wangnan0, dsahern, mingo, alexander.shishkin, peterz, acme, hpa, milian.wolff, adrian.hunter, tglx, jolsa, namhyung Commit-ID: db06a269ecbb1d71d534fc5713624eeeee0b8f92 Gitweb: https://git.kernel.org/tip/db06a269ecbb1d71d534fc5713624eeeee0b8f92 Author: yuzhoujian <yuzhoujian@didichuxing.com> AuthorDate: Mon, 29 Jan 2018 10:25:22 +0100 Committer: Arnaldo Carvalho de Melo <acme@redhat.com> CommitDate: Fri, 16 Feb 2018 10:09:24 -0300 perf stat: Add support to print counts for fixed times Introduce a new option to print counts for fixed number of times and update 'perf stat' documentation accordingly. Show below is the output of the new option for perf stat. $ perf stat -I 1000 --interval-count 2 -e cycles -a # time counts unit events 1.002827089 93,884,870 cycles 2.004231506 56,573,446 cycles We can just print the counts for several times with this newly introduced option. The usage of it is a little like 'vmstat', and it should be used together with "-I" option. $ vmstat -n 1 2 procs ---------memory-------------- --swap- ----io-- -system-- ------cpu--- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 78270544 547484 51732076 0 0 0 20 1 1 1 0 99 0 0 0 0 0 78270512 547484 51732080 0 0 0 16 477 1555 0 0 100 0 0 Changes since v3: - merge interval_count check and times check to one line. - fix the wrong indent in stat.h - use stat_config.times instead of 'times' in cmd_stat function. Changes since v2: - none. Changes since v1: - change the name of the new option "times-print" to "interval-count". - keep the new option interval specifically. Signed-off-by: yuzhoujian <yuzhoujian@didichuxing.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Kan Liang <kan.liang@intel.com> Cc: Milian Wolff <milian.wolff@kdab.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/r/1517217923-8302-2-git-send-email-ufo19890607@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/Documentation/perf-stat.txt | 5 +++++ tools/perf/builtin-stat.c | 20 +++++++++++++++++++- tools/perf/util/stat.h | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/tools/perf/Documentation/perf-stat.txt b/tools/perf/Documentation/perf-stat.txt index 823fce7..47a2164 100644 --- a/tools/perf/Documentation/perf-stat.txt +++ b/tools/perf/Documentation/perf-stat.txt @@ -146,6 +146,11 @@ Print count deltas every N milliseconds (minimum: 10ms) The overhead percentage could be high in some cases, for instance with small, sub 100ms intervals. Use with caution. example: 'perf stat -I 1000 -e cycles -a sleep 5' +--interval-count times:: +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' + --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 98bf9d3..7d1d761 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -168,6 +168,7 @@ static struct timespec ref_time; static struct cpu_map *aggr_map; static aggr_get_id_t aggr_get_id; static bool append_file; +static bool interval_count; static const char *output_name; static int output_fd; static int print_free_counters_hint; @@ -571,6 +572,7 @@ static struct perf_evsel *perf_evsel__reset_weak_group(struct perf_evsel *evsel) static int __run_perf_stat(int argc, const char **argv) { int interval = stat_config.interval; + int times = stat_config.times; char msg[BUFSIZ]; unsigned long long t0, t1; struct perf_evsel *counter; @@ -700,6 +702,8 @@ try_again: while (!waitpid(child_pid, &status, WNOHANG)) { nanosleep(&ts, NULL); process_interval(); + if (interval_count && !(--times)) + break; } } waitpid(child_pid, &status, 0); @@ -716,8 +720,11 @@ try_again: enable_counters(); while (!done) { nanosleep(&ts, NULL); - if (interval) + if (interval) { process_interval(); + if (interval_count && !(--times)) + break; + } } } @@ -1891,6 +1898,8 @@ static const struct option stat_options[] = { "command to run after to the measured command"), OPT_UINTEGER('I', "interval-print", &stat_config.interval, "print counts at regular interval in ms (>= 10)"), + OPT_INTEGER(0, "interval-count", &stat_config.times, + "print counts for fixed number of times"), 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, @@ -2870,6 +2879,15 @@ 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) { + pr_err("interval-count option should be used together with " + "interval-print.\n"); + parse_options_usage(stat_usage, stat_options, "interval-count", 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 dbc6f71..540fbb3 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; + int times; struct runtime_stat *stats; int stats_num; }; ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v4 2/2] perf stat: Add support to print counts after a period of time 2018-01-29 9:25 [PATCH v4 0/2] perf stat: Add interval-count and time support ufo19890607 2018-01-29 9:25 ` [PATCH v4 1/2] perf stat: Add support to print counts for fixed times ufo19890607 @ 2018-01-29 9:25 ` ufo19890607 2018-02-15 13:39 ` Arnaldo Carvalho de Melo 2018-02-17 11:23 ` [tip:perf/core] " tip-bot for yuzhoujian 2018-01-29 10:25 ` [PATCH v4 0/2] perf stat: Add interval-count and time support Jiri Olsa 2 siblings, 2 replies; 9+ messages in thread From: ufo19890607 @ 2018-01-29 9:25 UTC (permalink / raw) To: peterz, mingo, alexander.shishkin, jolsa, dsahern, namhyung, milian.wolff, arnaldo.melo, yuzhoujian, adrian.hunter, wangnan0, Kan.liang Cc: linux-perf-users, linux-kernel, acme From: yuzhoujian <yuzhoujian@didichuxing.com> 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 <yuzhoujian@didichuxing.com> --- 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 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v4 2/2] perf stat: Add support to print counts after a period of time 2018-01-29 9:25 ` [PATCH v4 2/2] perf stat: Add support to print counts after a period of time ufo19890607 @ 2018-02-15 13:39 ` Arnaldo Carvalho de Melo 2018-02-16 13:18 ` Arnaldo Carvalho de Melo 2018-02-17 11:23 ` [tip:perf/core] " tip-bot for yuzhoujian 1 sibling, 1 reply; 9+ messages in thread From: Arnaldo Carvalho de Melo @ 2018-02-15 13:39 UTC (permalink / raw) To: ufo19890607 Cc: peterz, mingo, alexander.shishkin, jolsa, dsahern, namhyung, milian.wolff, arnaldo.melo, yuzhoujian, adrian.hunter, wangnan0, Kan.liang, linux-perf-users, linux-kernel, acme Em Mon, Jan 29, 2018 at 10:25:23AM +0100, ufo19890607 escreveu: > From: yuzhoujian <yuzhoujian@didichuxing.com> > > Introduce a new option to print counts after N milliseconds This doesn't just print counts after N ms, it _stops_ the workload after that time _and_ prints the counts, right? Can you please send a followup patch fixing the description and documentation? I've applied this already, but clarifying what this option does is in demand. - Arnaldo > 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 <yuzhoujian@didichuxing.com> > --- > 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 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4 2/2] perf stat: Add support to print counts after a period of time 2018-02-15 13:39 ` Arnaldo Carvalho de Melo @ 2018-02-16 13:18 ` Arnaldo Carvalho de Melo 0 siblings, 0 replies; 9+ messages in thread From: Arnaldo Carvalho de Melo @ 2018-02-16 13:18 UTC (permalink / raw) To: ufo19890607 Cc: peterz, mingo, alexander.shishkin, jolsa, dsahern, namhyung, milian.wolff, arnaldo.melo, yuzhoujian, adrian.hunter, wangnan0, Kan.liang, linux-perf-users, linux-kernel, acme Em Thu, Feb 15, 2018 at 10:39:21AM -0300, Arnaldo Carvalho de Melo escreveu: > Em Mon, Jan 29, 2018 at 10:25:23AM +0100, ufo19890607 escreveu: > > From: yuzhoujian <yuzhoujian@didichuxing.com> > > > > Introduce a new option to print counts after N milliseconds > > This doesn't just print counts after N ms, it _stops_ the workload after > that time _and_ prints the counts, right? > > Can you please send a followup patch fixing the description and > documentation? > > I've applied this already, but clarifying what this option does is in > demand. So, this fails to build on centos:5 and centos:6 and similar systems where the use of 'time' for a variable name breaks the build: CC /tmp/build/perf/builtin-stat.o cc1: warnings being treated as errors builtin-stat.c: In function '__run_perf_stat': builtin-stat.c:576: warning: declaration of 'time' shadows a global declaration /usr/include/time.h:187: warning: shadowed declaration is here builtin-stat.c: In function 'cmd_stat': builtin-stat.c:2710: warning: declaration of 'time' shadows a global declaration /usr/include/time.h:187: warning: shadowed declaration is here mv: cannot stat `/tmp/build/perf/.builtin-stat.o.tmp': No such file or directory make[3]: *** [/tmp/build/perf/builtin-stat.o] Error 1 make[3]: *** Waiting for unfinished jobs.... MKDIR /tmp/build/perf/util/ CC /tmp/build/perf/util/evsel_fprintf.o make[2]: *** [/tmp/build/perf/perf-in.o] Error 2 make[2]: *** Waiting for unfinished jobs.... So since I had to rename that I replaced it with 'timeout', so that it gets clear that when you specify this option you are setting a timeout period that if hit will stop the 'perf stat' session and then print the specified counters. Please let us know if you have any strong objection to this, - Arnaldo ^ permalink raw reply [flat|nested] 9+ messages in thread
* [tip:perf/core] perf stat: Add support to print counts after a period of time 2018-01-29 9:25 ` [PATCH v4 2/2] perf stat: Add support to print counts after a period of time ufo19890607 2018-02-15 13:39 ` Arnaldo Carvalho de Melo @ 2018-02-17 11:23 ` tip-bot for yuzhoujian 1 sibling, 0 replies; 9+ messages in thread From: tip-bot for yuzhoujian @ 2018-02-17 11:23 UTC (permalink / raw) To: linux-tip-commits Cc: peterz, tglx, jolsa, yuzhoujian, adrian.hunter, dsahern, wangnan0, namhyung, kan.liang, acme, linux-kernel, mingo, hpa, alexander.shishkin, milian.wolff Commit-ID: f1f8ad52f8bf1239282737a2a5c3bd450300cc78 Gitweb: https://git.kernel.org/tip/f1f8ad52f8bf1239282737a2a5c3bd450300cc78 Author: yuzhoujian <yuzhoujian@didichuxing.com> AuthorDate: Mon, 29 Jan 2018 10:25:23 +0100 Committer: Arnaldo Carvalho de Melo <acme@redhat.com> CommitDate: Fri, 16 Feb 2018 10:18:06 -0300 perf stat: Add support to print counts after a period of time 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. Committer notes: This actually stops the workload after the specified time, then prints the counts. So I renamed the option to --timeout and updated the documentation to state that it will not just print the counts after the specified time, but will really stop the 'perf stat' session and print the counts. The rename from 'time' to 'timeout' also fixes the build in systems where 'time' is used by glibc and can't be used as a name of a variable, such as centos:5 and centos:6. 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 <yuzhoujian@didichuxing.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Kan Liang <kan.liang@intel.com> Cc: Milian Wolff <milian.wolff@kdab.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/r/1517217923-8302-3-git-send-email-ufo19890607@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- 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 47a2164..2bbe79a 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' +--timeout msecs:: +Stop the 'perf stat' session and print count deltas after N milliseconds (minimum: 10 ms). +This option is not supported with the "-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 7d1d761..2d49ecc 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 timeout = stat_config.timeout; 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 (timeout) { + ts.tv_sec = timeout / USEC_PER_MSEC; + ts.tv_nsec = (timeout % USEC_PER_MSEC) * NSEC_PER_MSEC; } else { ts.tv_sec = 1; ts.tv_nsec = 0; @@ -698,9 +702,11 @@ try_again: perf_evlist__start_workload(evsel_list); enable_counters(); - if (interval) { + if (interval || timeout) { while (!waitpid(child_pid, &status, WNOHANG)) { nanosleep(&ts, NULL); + if (timeout) + break; process_interval(); if (interval_count && !(--times)) break; @@ -720,6 +726,8 @@ try_again: enable_counters(); while (!done) { nanosleep(&ts, NULL); + if (timeout) + 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, "timeout", &stat_config.timeout, + "stop workload and print counts after a timeout period in ms (>= 10ms)"), 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, timeout; 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; + timeout = stat_config.timeout; /* * 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 (timeout && timeout < 100) { + if (timeout < 10) { + pr_err("timeout must be >= 10ms.\n"); + parse_options_usage(stat_usage, stat_options, "timeout", 0); + goto out; + } else + pr_warning("timeout < 100ms. " + "The overhead percentage could be high in some cases. " + "Please proceed with caution.\n"); + } + if (timeout && interval) { + pr_err("timeout option is not supported with interval-print.\n"); + parse_options_usage(stat_usage, stat_options, "timeout", 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 540fbb3..2f44e38 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 timeout; int times; struct runtime_stat *stats; int stats_num; ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v4 0/2] perf stat: Add interval-count and time support 2018-01-29 9:25 [PATCH v4 0/2] perf stat: Add interval-count and time support ufo19890607 2018-01-29 9:25 ` [PATCH v4 1/2] perf stat: Add support to print counts for fixed times ufo19890607 2018-01-29 9:25 ` [PATCH v4 2/2] perf stat: Add support to print counts after a period of time ufo19890607 @ 2018-01-29 10:25 ` Jiri Olsa [not found] ` <CAHCio2iVBoEXEv3mXzq34FsDZXJT9Oig+SfDwv3vneYfZQ089g@mail.gmail.com> 2 siblings, 1 reply; 9+ messages in thread From: Jiri Olsa @ 2018-01-29 10:25 UTC (permalink / raw) To: ufo19890607 Cc: peterz, mingo, alexander.shishkin, jolsa, dsahern, namhyung, milian.wolff, arnaldo.melo, yuzhoujian, adrian.hunter, wangnan0, Kan.liang, linux-perf-users, linux-kernel, acme On Mon, Jan 29, 2018 at 10:25:21AM +0100, ufo19890607 wrote: > From: yuzhoujian <yuzhoujian@didichuxing.com> > > Introduce two new options for perf stat and update perf-stat documentation > accordingly. > > The interval-count option can be used to print counts for fixed number of > times, and it should be used specifically with "-I" option. > > Show below is the output of the interval-count option for perf stat. > > $ perf stat -I 1000 --interval-count 2 -e cycles -a > # time counts unit events > 1.002827089 93,884,870 cycles > 2.004231506 56,573,446 cycles > > The time option can be used to print counts after a period of time, and it > should not be used with "-I" option. > > Show below is the output of the time 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 > > yuzhoujian (2): > perf stat: Add support to print counts for fixed times > perf stat: Add support to print counts after a period of time > > Changes since v3: > - merge interval_count check and times check to one line. > - fix the wrong indent in stat.h > - use stat_config.times instead of 'times' in cmd_stat function. Acked-by: Jiri Olsa <jolsa@kernel.org> thanks, jirka > > 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: > - change the name of the new option "times-print" to "interval-count". > - keep the interval-count option interval specifically. > > > tools/perf/Documentation/perf-stat.txt | 10 +++++++ > tools/perf/builtin-stat.c | 53 ++++++++++++++++++++++++++++++++-- > tools/perf/util/stat.h | 2 ++ > 3 files changed, 62 insertions(+), 3 deletions(-) > > -- > 2.14.1 > ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <CAHCio2iVBoEXEv3mXzq34FsDZXJT9Oig+SfDwv3vneYfZQ089g@mail.gmail.com>]
* Re: [PATCH v4 0/2] perf stat: Add interval-count and time support [not found] ` <CAHCio2iVBoEXEv3mXzq34FsDZXJT9Oig+SfDwv3vneYfZQ089g@mail.gmail.com> @ 2018-02-15 10:44 ` Jiri Olsa 0 siblings, 0 replies; 9+ messages in thread From: Jiri Olsa @ 2018-02-15 10:44 UTC (permalink / raw) To: 禹舟键 Cc: Peter Zijlstra, mingo, Alexander Shishkin, Jiri Olsa, David Ahern, Namhyung Kim, Milian Wolff, Arnaldo Carvalho de Melo, Wind Yu, Adrian Hunter, Wang Nan, Kan.liang, linux-perf-users, linux-kernel, acme On Thu, Feb 15, 2018 at 05:33:07PM +0800, 禹舟键 wrote: > PING > > 2018-01-29 18:25 GMT+08:00 Jiri Olsa <jolsa@redhat.com>: Arnaldo, could you pelase check on this? thanks, jirka > > > On Mon, Jan 29, 2018 at 10:25:21AM +0100, ufo19890607 wrote: > > > From: yuzhoujian <yuzhoujian@didichuxing.com> > > > > > > Introduce two new options for perf stat and update perf-stat > > documentation > > > accordingly. > > > > > > The interval-count option can be used to print counts for fixed number of > > > times, and it should be used specifically with "-I" option. > > > > > > Show below is the output of the interval-count option for perf stat. > > > > > > $ perf stat -I 1000 --interval-count 2 -e cycles -a > > > # time counts unit events > > > 1.002827089 93,884,870 cycles > > > 2.004231506 56,573,446 cycles > > > > > > The time option can be used to print counts after a period of time, and > > it > > > should not be used with "-I" option. > > > > > > Show below is the output of the time 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 > > > > > > yuzhoujian (2): > > > perf stat: Add support to print counts for fixed times > > > perf stat: Add support to print counts after a period of time > > > > > > Changes since v3: > > > - merge interval_count check and times check to one line. > > > - fix the wrong indent in stat.h > > > - use stat_config.times instead of 'times' in cmd_stat function. > > > > Acked-by: Jiri Olsa <jolsa@kernel.org> > > > > thanks, > > jirka > > > > > > > > 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: > > > - change the name of the new option "times-print" to "interval-count". > > > - keep the interval-count option interval specifically. > > > > > > > > > tools/perf/Documentation/perf-stat.txt | 10 +++++++ > > > tools/perf/builtin-stat.c | 53 > > ++++++++++++++++++++++++++++++++-- > > > tools/perf/util/stat.h | 2 ++ > > > 3 files changed, 62 insertions(+), 3 deletions(-) > > > > > > -- > > > 2.14.1 > > > > > ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2018-02-17 11:35 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2018-01-29 9:25 [PATCH v4 0/2] perf stat: Add interval-count and time support ufo19890607 2018-01-29 9:25 ` [PATCH v4 1/2] perf stat: Add support to print counts for fixed times ufo19890607 2018-02-17 11:23 ` [tip:perf/core] " tip-bot for yuzhoujian 2018-01-29 9:25 ` [PATCH v4 2/2] perf stat: Add support to print counts after a period of time ufo19890607 2018-02-15 13:39 ` Arnaldo Carvalho de Melo 2018-02-16 13:18 ` Arnaldo Carvalho de Melo 2018-02-17 11:23 ` [tip:perf/core] " tip-bot for yuzhoujian 2018-01-29 10:25 ` [PATCH v4 0/2] perf stat: Add interval-count and time support Jiri Olsa [not found] ` <CAHCio2iVBoEXEv3mXzq34FsDZXJT9Oig+SfDwv3vneYfZQ089g@mail.gmail.com> 2018-02-15 10:44 ` Jiri Olsa
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.