perf cgroup: simplify arguments if track multiple events for a cgroup
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
@@ -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
@@ -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
@@ -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
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 testbefore:
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 testSigned-off-by weiping zhang <[email protected]>
thanks,
jirka
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 testbefore:
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 testSigned-off-by weiping zhang <[email protected]>Acked-by Jiri Olsa <[email protected]>
Hi Arnaldo,
Ping...
Arnaldo Carvalho de Melo
maintainerEm 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 testbefore:
1.001007226 <not counted> cycles test
1.001007226 7,506 cache-missesafter:
1.000834097 <not counted> cycles test 1.000834097 <not counted> cache-misses test
Quoted 5 lines
Quoted 3 lines
Quoted 1 line
Signed-off-by weiping zhang <[email protected]>Acked-by Jiri Olsa <[email protected]>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
tip-bot for weiping zhang
merge bot[tip:perf/core] perf cgroup: Simplify arguments when tracking multiple events
In reply to weiping zhangperf 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-missesAfter:
1.000834097 <not counted> cycles empty_cgroup
1.000834097 <not counted> cache-misses empty_cgroup--- 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
@@ -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
@@ -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
@@ -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 ; }