xref: /spdk/scripts/perf/pm/collect-cpu-load (revision 34edd9f1bf5fda4c987f4500ddc3c9f50be32e7d)
159c811f0SMichal Berger#!/usr/bin/env bash
259c811f0SMichal Berger#  SPDX-License-Identifier: BSD-3-Clause
359c811f0SMichal Berger#  Copyright (C) 2023 Intel Corporation
459c811f0SMichal Berger#  All rights reserved.
559c811f0SMichal Berger
659c811f0SMichal Bergershopt -s nullglob extglob
759c811f0SMichal Berger
859c811f0SMichal Bergerpmdir=$(readlink -f "$(dirname "$0")")
959c811f0SMichal Bergerrootdir=$(readlink -f "$pmdir/../../../")
1059c811f0SMichal Bergersource "$rootdir/test/scheduler/common.sh"
118d588fbcSMichal Bergersource "$pmdir/common"
1259c811f0SMichal Berger
1359c811f0SMichal Bergerhelp() {
1459c811f0SMichal Berger	cat <<- HELP
1559c811f0SMichal Berger
16d5fe62b2SMichal Berger		Usage: $0 [-h] [-c count] [-d dir] [-l] [-p prefix] [cpu0 cpu1 ...]
1759c811f0SMichal Berger
1859c811f0SMichal Berger		-h - Print this message.
1959c811f0SMichal Berger		-c - Execute count times. 0 is the default and it means to run
2059c811f0SMichal Berger		     indefinitely.
2159c811f0SMichal Berger		-d - Directory where results should be saved. Default is /tmp.
22d5fe62b2SMichal Berger		-l - Save output of the script to a log file (dir/${0##*/}.pm.log).
2359c811f0SMichal Berger		-p - Add prefix to saved files.
2436eea926SMichal Berger		-t - How long to wait before each load read. Default is 1s.
2559c811f0SMichal Berger
2659c811f0SMichal Berger		cpu - Valid cpu id (e.g. 0) to monitor.
2759c811f0SMichal Berger
28*34edd9f1SKamil Godzwon		When started, ${0##*/} will enter loop to continuously monitor cpu
2959c811f0SMichal Berger		load. Each iteration will be logged to stderr and a log file
3059c811f0SMichal Berger		(dir/${0##*/}.pm.log).
3159c811f0SMichal Berger
3259c811f0SMichal Berger	HELP
3359c811f0SMichal Berger}
3459c811f0SMichal Berger
35d5fe62b2SMichal Bergercleanup() {
36d5fe62b2SMichal Berger	rm_pm_pid
37d5fe62b2SMichal Berger}
38d5fe62b2SMichal Berger
3959c811f0SMichal Berger# get_cpu_time() uses these, so put some stubs in place
4059c811f0SMichal Bergerxtrace_disable() { :; }
4159c811f0SMichal Bergerxtrace_restore() { :; }
4259c811f0SMichal Berger
4359c811f0SMichal Berger_get_cpu_time() {
44d5fe62b2SMichal Berger	get_cpu_time "$@"
4559c811f0SMichal Berger}
4659c811f0SMichal Berger
4759c811f0SMichal Bergercount=0
4836eea926SMichal Bergerinterval=1
49d5fe62b2SMichal Bergerlog_to_file=no
5059c811f0SMichal Bergerprefix=""
5159c811f0SMichal Berger
52d5fe62b2SMichal Bergerwhile getopts c:d:hlp:t: opt; do
5359c811f0SMichal Berger	case "$opt" in
5459c811f0SMichal Berger		c) count=$OPTARG ;;
55d5fe62b2SMichal Berger		d) PM_OUTPUTDIR=$OPTARG ;;
5659c811f0SMichal Berger		h)
5759c811f0SMichal Berger			help
5859c811f0SMichal Berger			exit 0
5959c811f0SMichal Berger			;;
60d5fe62b2SMichal Berger		l) log_to_file=yes ;;
6159c811f0SMichal Berger		p) prefix=$OPTARG ;;
6236eea926SMichal Berger		t) interval=$OPTARG ;;
6359c811f0SMichal Berger		*) ;;
6459c811f0SMichal Berger	esac
6559c811f0SMichal Bergerdone
6659c811f0SMichal Bergershift $((OPTIND - 1))
6759c811f0SMichal Berger
6859c811f0SMichal Bergerdeclare -r log_file=${prefix:+${prefix}_}${0##*/}.pm.log
6959c811f0SMichal Berger
70d5fe62b2SMichal Bergermkdir -p "$PM_OUTPUTDIR"
71d5fe62b2SMichal Bergerif [[ $log_to_file == yes ]]; then
72d5fe62b2SMichal Berger	printf 'Redirecting to %s\n' "$PM_OUTPUTDIR/$log_file" >&2
73d5fe62b2SMichal Berger	exec > "$PM_OUTPUTDIR/$log_file" 2>&1
74d5fe62b2SMichal Bergerfi
7559c811f0SMichal Berger
7659c811f0SMichal Bergercpus=("$@")
7759c811f0SMichal Berger((${#cpus[@]} > 0)) || cpus=($(get_online_cpus))
7859c811f0SMichal Berger
79d5fe62b2SMichal Bergersave_pm_pid
80d5fe62b2SMichal Bergertrap 'cleanup' EXIT
818d588fbcSMichal Bergertrap 'retag' USR1
828d588fbcSMichal Berger
8336eea926SMichal Berger_get_cpu_time "$count" "" 1 "$interval" "${cpus[@]}"
84