Commit 55013c9e authored by Michal Berger's avatar Michal Berger Committed by Tomasz Zawadzki
Browse files

scripts/perf: Add tool for collecting vmstat



Wrap it around actual vmstat but include extra info, relevant for the
CI pool.

Change-Id: I5a02a1735bfa4149e0e0376bc8a0ee688631701a
Signed-off-by: default avatarMichal Berger <michal.berger@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/21178


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
parent 36eea926
Loading
Loading
Loading
Loading
+91 −0
Original line number Diff line number Diff line
#!/usr/bin/env bash
#  SPDX-License-Identifier: BSD-3-Clause
#  Copyright (C) 2023 Intel Corporation
#  All rights reserved.

shopt -s nullglob extglob

pmdir=$(readlink -f "$(dirname "$0")")
rootdir=$(readlink -f "$pmdir/../../../")

help() {
	cat <<- HELP

		Usage: $0 [-h] [-c count] [-d dir] [-p prefix] [-r reprint_header_count]

		-h - Print this message.
		-c - Execute count times. 0 is the default and it means to run
		     indefinitely.
		-d - Directory where results should be saved. Default is /tmp.
		-p - Add prefix to saved files.
		-r - Stat count after which header should be re-printed. Default is 20.
		-t - How long to wait before each stat dump. Default is 1s.

		When started, ${0##*/} will enter loop to continuosly dump
		vmstat. Each iteration will be logged to stderr and a log file
		(dir/${0##*/}.pm.log).

	HELP
}

get_extra_meminfo() {
	local match="" data

	match+="|MemAvailable"
	match+="|Shmem"
	match+="|HugePages_(Total|Free)"
	match+="|Hugepagesize"

	data=($(grep -E "^($match):" /proc/meminfo | awk '{print $2}'))
	echo "${data[*]}"
}

_vmstat() {
	local count=$1 interval=$2 reprint_header=${3:-20} _count
	local vmstat _vmstat stat_idx header=()

	_count=$count
	while ((stat_idx = stat_idx == reprint_header ? 1 : ++stat_idx, count <= 0 ? 1 : _count--)); do
		mapfile -t vmstat < <(vmstat --timestamp)
		# Enhance output to include stuff we are most interested in
		vmstat[2]="${vmstat[2]} $(get_extra_meminfo)"
		if ((stat_idx == 1)); then
			header=("${vmstat[@]::2}")
			header[0]="${header[0]}     ----extra memory----"
			# Keep the header ordered as in get_extra_meminfo()
			header[1]="${header[1]}     avail shmem hp_total hp_free hp_size"
			_vmstat=("${header[@]}" "${vmstat[2]}")
		else
			_vmstat=("${vmstat[2]}")
		fi
		printf '%s\n' "${_vmstat[@]}"
		sleep "${interval}s"
	done > >(tee "$output_dir/$log_file")
}

count=0
interval=1
output_dir=/tmp
prefix=""
reprint_header=20

while getopts c:d:hp:r:t: opt; do
	case "$opt" in
		c) count=$OPTARG ;;
		d) output_dir=$OPTARG ;;
		h)
			help
			exit 0
			;;
		p) prefix=$OPTARG ;;
		r) reprint_header=$OPTARG ;;
		t) interval=$OPTARG ;;
		*) ;;
	esac
done

declare -r log_file=${prefix:+${prefix}_}${0##*/}.pm.log

mkdir -p "$output_dir"

_vmstat "$count" "$interval" "$reprint_header"