Skip to contentSkip to conversation

perf cgroup: simplify arguments if track multiple events for a cgroup

PATCH In review weiping zhang 5 participants 5 messages Jan 29, 2018 – Mar 6, 2018 perf events

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 perf cgroup: simplify arguments if track multiple events for a cgroup

if use -G with one cgroup and -e with multiple events, only the first event has correct cgroup setting, all events from the second will track system-wide events.

if user want track multiple events for a specific cgroup, user must give parameters like follow:

$ perf stat -e e1 -e e2 -e e3 -G test,test,test
this patch simplify this case, just type one cgroup, like following:
$ perf stat -e e1 -e e2 -e e3 -G test
$ mkdir -p /sys/fs/cgroup/perf_event/test
$ perf stat -e cycles -e cache-misses  -a -I 1000 -G test

before:
1.001007226 <not counted> cycles test
1.001007226 7,506 cache-misses

after:

     1.000834097      <not counted>      cycles                    test
     1.000834097      <not counted>      cache-misses              test
---
 tools/perf/Documentation/perf-record.txt |  3 ++-
 tools/perf/Documentation/perf-stat.txt   |  3 ++-
 tools/perf/util/cgroup.c                 | 17 ++++++++++++++++-
 3 files changed, 20 insertions(+), 3 deletions(-)
tools/perf/Documentation/perf-record.txt +2 -1
index 5a626ef..0fe9850 100644
@@ -308,7 +308,8 @@ can be provided. Each cgroup is applied to the corresponding event, i.e., first
 to first event, second cgroup to second event and so on. It is possible to provide
 an empty cgroup (monitor all the time) using, e.g., -G foo,,bar. Cgroups must have
 corresponding events, i.e., they always refer to events defined earlier on the command
-line.
+line. If user want track multiple events for a specific cgroup, user can use -e e1 -e e2
+-G foo,foo or just use -e e1 -e e2 -G foo.
 
 -b::
 --branch-any::
tools/perf/Documentation/perf-stat.txt +2 -1
index 823fce7..a234b3c 100644
@@ -118,7 +118,8 @@ can be provided. Each cgroup is applied to the corresponding event, i.e., first
 to first event, second cgroup to second event and so on. It is possible to provide
 an empty cgroup (monitor all the time) using, e.g., -G foo,,bar. Cgroups must have
 corresponding events, i.e., they always refer to events defined earlier on the command
-line.
+line. If user want track multiple events for a specific cgroup, user can use -e e1 -e e2
+-G foo,foo or just use -e e1 -e e2 -G foo.
 
 -o file::
 --output file::
tools/perf/util/cgroup.c +16 -1
index d9ffc1e..38aaeb2 100644
@@ -154,9 +154,11 @@ int parse_cgroups(const struct option *opt __maybe_unused, const char *str,
 		  int unset __maybe_unused)
 {
 	struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
+	struct perf_evsel *counter;
+	struct cgroup_sel *cgrp = NULL;
 	const char *p, *e, *eos = str + strlen(str);
 	char *s;
-	int ret;
+	int ret, i;
 
 	if (list_empty(&evlist->entries)) {
 		fprintf(stderr, "must define events before cgroups\n");
@@ -185,5 +187,18 @@ int parse_cgroups(const struct option *opt __maybe_unused, const char *str,
 			break;
 		str = p+1;
 	}
+	/* for the case one cgroup combine to multiple events */
+	i = 0;
+	if (nr_cgroups == 1) {
+		evlist__for_each_entry(evlist, counter) {
+			if (i == 0)
+				cgrp = counter->cgrp;
+			else {
+				counter->cgrp = cgrp;
+				refcount_inc(&cgrp->refcnt);
+			}
+			i++;
+		}
+	}
 	return 0;
 }
Signature · 1 line
2.9.4
Acked-by on v2 1/1
#1 lore raw
Quoted 17 lines · weiping zhang

if use -G with one cgroup and -e with multiple events, only the first event has correct cgroup setting, all events from the second will track system-wide events.

if user want track multiple events for a specific cgroup, user must give parameters like follow:

$ perf stat -e e1 -e e2 -e e3 -G test,test,test
this patch simplify this case, just type one cgroup, like following:
$ perf stat -e e1 -e e2 -e e3 -G test
$ mkdir -p /sys/fs/cgroup/perf_event/test
$ perf stat -e cycles -e cache-misses  -a -I 1000 -G test

before:
1.001007226 <not counted> cycles test
1.001007226 7,506 cache-misses

Quoted 5 lines

after:

     1.000834097      <not counted>      cycles                    test
     1.000834097      <not counted>      cache-misses              test

thanks,
jirka

#2 lore raw

2018-01-31 17:22 GMT+08:00 Jiri Olsa <[email protected]>:

Quoted 18 lines · weiping zhang
Quoted 17 lines

if use -G with one cgroup and -e with multiple events, only the first event has correct cgroup setting, all events from the second will track system-wide events.

if user want track multiple events for a specific cgroup, user must give parameters like follow:

$ perf stat -e e1 -e e2 -e e3 -G test,test,test
this patch simplify this case, just type one cgroup, like following:
$ perf stat -e e1 -e e2 -e e3 -G test
$ mkdir -p /sys/fs/cgroup/perf_event/test
$ perf stat -e cycles -e cache-misses  -a -I 1000 -G test

before:
1.001007226 <not counted> cycles test
1.001007226 7,506 cache-misses

Quoted 7 lines
Quoted 5 lines

after:

     1.000834097      <not counted>      cycles                    test
     1.000834097      <not counted>      cache-misses              test

Hi Arnaldo,

Ping...

#3 lore raw

Em Thu, Feb 22, 2018 at 06:34:08PM +0800, Weiping Zhang escreveu:

Quoted 23 lines

2018-01-31 17:22 GMT+08:00 Jiri Olsa <[email protected]>:

Quoted 22 lines · weiping zhang
Quoted 21 lines

if use -G with one cgroup and -e with multiple events, only the first event has correct cgroup setting, all events from the second will track system-wide events.

if user want track multiple events for a specific cgroup, user must give parameters like follow:

$ perf stat -e e1 -e e2 -e e3 -G test,test,test
this patch simplify this case, just type one cgroup, like following:
$ perf stat -e e1 -e e2 -e e3 -G test
$ mkdir -p /sys/fs/cgroup/perf_event/test
$ perf stat -e cycles -e cache-misses  -a -I 1000 -G test

before:
1.001007226 <not counted> cycles test
1.001007226 7,506 cache-misses

after:

     1.000834097      <not counted>      cycles                    test
     1.000834097      <not counted>      cache-misses              test
Quoted 5 lines
Quoted 3 lines
Quoted 1 line

Hi Arnaldo,

Ok, tested and applied an example for when wanting to monitor for an specific cgroup and also for system wide:

----
If wanting to monitor, say, 'cycles' for a cgroup and also for system wide, this command line can be used: 'perf stat -e cycles -G cgroup_name -a -e cycles'.
----

To further clarify what is in the man page already about -G affecting only the previously defined events in the command line.

Perhaps it would be interesting to automatically detect that the same event is being read system wide and for an specific cgroup and then, right after the count for specific cgroups show the percentage?

Thanks,

- Arnaldo

[root@jouet ~]# mkdir -p /sys/fs/cgroup/perf_event/empty_cgroup [root@jouet ~]# perf stat -e cycles -I 1000 -G empty_cgroup -a -e cycles
# time counts unit events

     1.000268091      <not counted>      cycles                    empty_cgroup                                   
     1.000268091         73,159,886      cycles                                                      
     2.000748319      <not counted>      cycles                    empty_cgroup                                   
     2.000748319         70,189,470      cycles                                                      
     3.001196694      <not counted>      cycles                    empty_cgroup                                   
     3.001196694         57,076,551      cycles                                                      
     4.001589957      <not counted>      cycles                    empty_cgroup                                   
     4.001589957        102,118,895      cycles                                                      
     5.002017548      <not counted>      cycles                    empty_cgroup                                   
     5.002017548         66,391,232      cycles                                                      
^C     5.598699824      <not counted>      cycles                    empty_cgroup                                   
     5.598699824        136,313,588      cycles                                                      

[root@jouet ~]#

- Arnaldo

#4 lore raw

[tip:perf/core] perf cgroup: Simplify arguments when tracking multiple events

In reply to weiping zhang
perf cgroup: Simplify arguments when tracking multiple events
Commit-ID:  25f72f9ed88d5be86c92432fc779e2725e3506cd
Gitweb:     https://git.kernel.org/tip/25f72f9ed88d5be86c92432fc779e2725e3506cd
Author:     weiping zhang <[email protected]>
AuthorDate: Mon, 29 Jan 2018 23:48:09 +0800
Committer:  Arnaldo Carvalho de Melo <[email protected]>
CommitDate: Thu, 22 Feb 2018 10:02:27 -0300

perf cgroup: Simplify arguments when tracking multiple events

When using -G with one cgroup and -e with multiple events, only the first event gets the correct cgroup setting, all events from the second onwards will track system-wide events.

If the user wants to track multiple events for a specific cgroup, the user must give parameters like the following:

  $ perf stat -e e1 -e e2 -e e3 -G test,test,test

This patch simplify this case, just type one cgroup:

  $ perf stat -e e1 -e e2 -e e3 -G test
  $ mkdir -p /sys/fs/cgroup/perf_event/empty_cgroup
  $ perf stat -e cycles -e cache-misses -a -I 1000 -G empty_cgroup

Before:

     1.001007226   <not counted>      cycles	   empty_cgroup
     1.001007226           7,506      cache-misses

After:

     1.000834097   <not counted>      cycles	   empty_cgroup
     1.000834097   <not counted>      cache-misses empty_cgroup
Cc Alexander Shishkin <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Peter Zijlstra <[email protected]>
[ Improved the doc text a bit, providing an example for cgroup + system wide counting ]
---
 tools/perf/Documentation/perf-record.txt |  6 +++++-
 tools/perf/Documentation/perf-stat.txt   |  6 +++++-
 tools/perf/util/cgroup.c                 | 17 ++++++++++++++++-
 3 files changed, 26 insertions(+), 3 deletions(-)
tools/perf/Documentation/perf-record.txt +5 -1
index 3eea6de35a38..76bc2181d214 100644
@@ -308,7 +308,11 @@ can be provided. Each cgroup is applied to the corresponding event, i.e., first
 to first event, second cgroup to second event and so on. It is possible to provide
 an empty cgroup (monitor all the time) using, e.g., -G foo,,bar. Cgroups must have
 corresponding events, i.e., they always refer to events defined earlier on the command
-line.
+line. If the user wants to track multiple events for a specific cgroup, the user can
+use '-e e1 -e e2 -G foo,foo' or just use '-e e1 -e e2 -G foo'.
+
+If wanting to monitor, say, 'cycles' for a cgroup and also for system wide, this
+command line can be used: 'perf stat -e cycles -G cgroup_name -a -e cycles'.
 
 -b::
 --branch-any::
tools/perf/Documentation/perf-stat.txt +5 -1
index 2bbe79a50d3c..2b38e222016a 100644
@@ -118,7 +118,11 @@ can be provided. Each cgroup is applied to the corresponding event, i.e., first
 to first event, second cgroup to second event and so on. It is possible to provide
 an empty cgroup (monitor all the time) using, e.g., -G foo,,bar. Cgroups must have
 corresponding events, i.e., they always refer to events defined earlier on the command
-line.
+line. If the user wants to track multiple events for a specific cgroup, the user can
+use '-e e1 -e e2 -G foo,foo' or just use '-e e1 -e e2 -G foo'.
+
+If wanting to monitor, say, 'cycles' for a cgroup and also for system wide, this
+command line can be used: 'perf stat -e cycles -G cgroup_name -a -e cycles'.
 
 -o file::
 --output file::
tools/perf/util/cgroup.c +16 -1
index 984f69144f87..5dd9b5ea314d 100644
@@ -157,9 +157,11 @@ int parse_cgroups(const struct option *opt __maybe_unused, const char *str,
 		  int unset __maybe_unused)
 {
 	struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
+	struct perf_evsel *counter;
+	struct cgroup_sel *cgrp = NULL;
 	const char *p, *e, *eos = str + strlen(str);
 	char *s;
-	int ret;
+	int ret, i;
 
 	if (list_empty(&evlist->entries)) {
 		fprintf(stderr, "must define events before cgroups\n");
@@ -188,5 +190,18 @@ int parse_cgroups(const struct option *opt __maybe_unused, const char *str,
 			break;
 		str = p+1;
 	}
+	/* for the case one cgroup combine to multiple events */
+	i = 0;
+	if (nr_cgroups == 1) {
+		evlist__for_each_entry(evlist, counter) {
+			if (i == 0)
+				cgrp = counter->cgrp;
+			else {
+				counter->cgrp = cgrp;
+				refcount_inc(&cgrp->refcnt);
+			}
+			i++;
+		}
+	}
 	return 0;
 }