E.g.:
 # perf script record -- sched:sched_stat_sleep -- ./foo
 # perf script report sched-stat
or
 # perf script record -- -e sched:sched_stat_sleep

v2: Add ability to record events for a defined process. It executes a small
bash script, then executes perf with filtering by pid and then a bash script
executes a target process.

Signed-off-by: Andrew Vagin <ava...@openvz.org>
---
 tools/perf/scripts/python/bin/sched-stat-record |   65 +++++++++++++++++++++++
 tools/perf/scripts/python/bin/sched-stat-report |    5 ++
 2 files changed, 70 insertions(+), 0 deletions(-)
 create mode 100644 tools/perf/scripts/python/bin/sched-stat-record
 create mode 100644 tools/perf/scripts/python/bin/sched-stat-report

diff --git a/tools/perf/scripts/python/bin/sched-stat-record 
b/tools/perf/scripts/python/bin/sched-stat-record
new file mode 100644
index 0000000..5e0bd97
--- /dev/null
+++ b/tools/perf/scripts/python/bin/sched-stat-record
@@ -0,0 +1,65 @@
+#!/bin/bash
+# perf script record -- sched:sched_stat_[smth] -- CMD
+# perf script record -- -e sched:sched_stat_[smth]
+#
+set -o monitor
+
+usage()
+{
+       echo "Usage:"
+       echo "  perf script record -- sched:sched_stat_[smth] -- CMD"
+       echo "  perf script record -- [PERF OPTS] -e sched:sched_stat_[smth]"
+       exit 1;
+}
+
+declare -a opt
+declare -a cmd
+f=0;
+for i in "${@:2}"; do
+       if [ "$i" == "--" ]; then
+               f=1
+               continue
+       fi
+       if [ $f -eq 1 ]; then
+               cmd[${#cmd[*]}]="$i"
+       else
+               opt[${#opt[*]}]="$i"
+       fi
+done
+
+if [[ "${opt[@]}" != *sched_stat_* ]]; then
+       usage;
+fi
+
+if [ ${#cmd[@]} -eq 0 ]; then
+       if [ ${#opt[@]} -eq 0 ]; then
+               usage;
+       fi
+       exec perf record -agP \
+               -e sched:sched_switch \
+               --filter "prev_state == 1 || prev_state == 2" \
+               "${opt[@]}"
+fi
+
+if [ ${#opt[@]} -ne 1 ]; then
+       usage;
+fi
+
+# Wait until a target process is stopped.
+bash -c 'kill -STOP $$; exec "$@"' -- "${cmd[@]}" &
+pid=$!
+wait %1
+[ $? -eq 147 ] || exit 1;
+
+perf record -agP \
+               -e sched:sched_switch \
+               --filter "prev_pid == $pid && prev_state == 1 || prev_state == 
2" \
+               -e sched:sched_process_exit -e "${opt[@]}" --filter "pid == 
$pid" &
+pid_perf=$!
+kill -CONT %1
+while :; do
+       wait %1
+       [ $? -eq 127 ] && break;
+done
+kill -INT %2
+wait %2
diff --git a/tools/perf/scripts/python/bin/sched-stat-report 
b/tools/perf/scripts/python/bin/sched-stat-report
new file mode 100644
index 0000000..e5114ce
--- /dev/null
+++ b/tools/perf/scripts/python/bin/sched-stat-report
@@ -0,0 +1,5 @@
+#!/bin/bash
+# description: profiling sleep times
+perf inject -s -i perf.data -o perf.data.d || exit
+perf report -i perf.data.d || exit
+unlink perf.data.d
-- 
1.7.1

_______________________________________________
Devel mailing list
Devel@openvz.org
https://openvz.org/mailman/listinfo/devel

Reply via email to