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..02da7c1 --- /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-stat -- sched:sched_stat_[smth] -- CMD" + echo " perf script record sched-stat -- [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