All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/2] perf stat: Add interval-count and time support
@ 2018-01-26  9:06 ufo19890607
  2018-01-26  9:06 ` [PATCH v3 1/2] perf stat: Add support to print counts for fixed times ufo19890607
  2018-01-26  9:06 ` [PATCH v3 2/2] perf stat: Add support to print counts after a period of time ufo19890607
  0 siblings, 2 replies; 5+ messages in thread
From: ufo19890607 @ 2018-01-26  9:06 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 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              | 59 ++++++++++++++++++++++++++++++++--
 tools/perf/util/stat.h                 |  2 ++
 3 files changed, 68 insertions(+), 3 deletions(-)

-- 
2.14.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v3 1/2] perf stat: Add support to print counts for fixed times
  2018-01-26  9:06 [PATCH v3 0/2] perf stat: Add interval-count and time support ufo19890607
@ 2018-01-26  9:06 ` ufo19890607
  2018-01-29  7:29   ` Jiri Olsa
  2018-01-29  7:29   ` Jiri Olsa
  2018-01-26  9:06 ` [PATCH v3 2/2] perf stat: Add support to print counts after a period of time ufo19890607
  1 sibling, 2 replies; 5+ messages in thread
From: ufo19890607 @ 2018-01-26  9:06 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 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              | 26 +++++++++++++++++++++++++-
 tools/perf/util/stat.h                 |  1 +
 3 files changed, 31 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..406f546ad74c 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,10 @@ static int __run_perf_stat(int argc, const char **argv)
 			while (!waitpid(child_pid, &status, WNOHANG)) {
 				nanosleep(&ts, NULL);
 				process_interval();
+				if (interval_count == true) {
+					if (--times == 0)
+						break;
+				}
 			}
 		}
 		waitpid(child_pid, &status, 0);
@@ -716,8 +722,13 @@ 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 == true) {
+					if (--times == 0)
+						break;
+				}
+			}
 		}
 	}
 
@@ -1891,6 +1902,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,
@@ -2689,6 +2702,7 @@ int cmd_stat(int argc, const char **argv)
 	const char *mode;
 	FILE *output = stderr;
 	unsigned int interval;
+	int times;
 	const char * const stat_subcommands[] = { "record", "report" };
 
 	setlocale(LC_ALL, "");
@@ -2719,6 +2733,7 @@ int cmd_stat(int argc, const char **argv)
 		return __cmd_report(argc, argv);
 
 	interval = stat_config.interval;
+	times = stat_config.times;
 
 	/*
 	 * For record command the -o is already taken care of.
@@ -2870,6 +2885,15 @@ 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) {
+		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..b2f8a347d358 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] 5+ messages in thread

* [PATCH v3 2/2] perf stat: Add support to print counts after a period of time
  2018-01-26  9:06 [PATCH v3 0/2] perf stat: Add interval-count and time support ufo19890607
  2018-01-26  9:06 ` [PATCH v3 1/2] perf stat: Add support to print counts for fixed times ufo19890607
@ 2018-01-26  9:06 ` ufo19890607
  1 sibling, 0 replies; 5+ messages in thread
From: ufo19890607 @ 2018-01-26  9:06 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 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 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

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 1/2] perf stat: Add support to print counts for fixed times
  2018-01-26  9:06 ` [PATCH v3 1/2] perf stat: Add support to print counts for fixed times ufo19890607
@ 2018-01-29  7:29   ` Jiri Olsa
  2018-01-29  7:29   ` Jiri Olsa
  1 sibling, 0 replies; 5+ messages in thread
From: Jiri Olsa @ 2018-01-29  7:29 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 Fri, Jan 26, 2018 at 10:06:56AM +0100, ufo19890607 wrote:

SNIP

> --- 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,10 @@ static int __run_perf_stat(int argc, const char **argv)
>  			while (!waitpid(child_pid, &status, WNOHANG)) {
>  				nanosleep(&ts, NULL);
>  				process_interval();
> +				if (interval_count == true) {
> +					if (--times == 0)
> +						break;

why not single line in here?

if (interval_count && !(--times))

> +				}
>  			}
>  		}
>  		waitpid(child_pid, &status, 0);
> @@ -716,8 +722,13 @@ 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 == true) {
> +					if (--times == 0)
> +						break;

same here

SNIP

>  	}
> +	if (times && interval)
> +		interval_count = true;
> +	else if (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..b2f8a347d358 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;

wrong indent

thanks,
jirka

>  	struct runtime_stat *stats;
>  	int		stats_num;
>  };
> -- 
> 2.14.1
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 1/2] perf stat: Add support to print counts for fixed times
  2018-01-26  9:06 ` [PATCH v3 1/2] perf stat: Add support to print counts for fixed times ufo19890607
  2018-01-29  7:29   ` Jiri Olsa
@ 2018-01-29  7:29   ` Jiri Olsa
  1 sibling, 0 replies; 5+ messages in thread
From: Jiri Olsa @ 2018-01-29  7:29 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 Fri, Jan 26, 2018 at 10:06:56AM +0100, ufo19890607 wrote:

SNIP

> @@ -1891,6 +1902,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,
> @@ -2689,6 +2702,7 @@ int cmd_stat(int argc, const char **argv)
>  	const char *mode;
>  	FILE *output = stderr;
>  	unsigned int interval;
> +	int times;
>  	const char * const stat_subcommands[] = { "record", "report" };
>  
>  	setlocale(LC_ALL, "");
> @@ -2719,6 +2733,7 @@ int cmd_stat(int argc, const char **argv)
>  		return __cmd_report(argc, argv);
>  
>  	interval = stat_config.interval;
> +	times = stat_config.times;
>  
>  	/*
>  	 * For record command the -o is already taken care of.
> @@ -2870,6 +2885,15 @@ 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) {

you can use stat_config.times in here, no need for 'times' copy

jirka

> +		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..b2f8a347d358 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	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-01-29  7:29 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-26  9:06 [PATCH v3 0/2] perf stat: Add interval-count and time support ufo19890607
2018-01-26  9:06 ` [PATCH v3 1/2] perf stat: Add support to print counts for fixed times ufo19890607
2018-01-29  7:29   ` Jiri Olsa
2018-01-29  7:29   ` Jiri Olsa
2018-01-26  9:06 ` [PATCH v3 2/2] perf stat: Add support to print counts after a period of time ufo19890607

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.