Commit 1dc06520 authored by Michal Berger's avatar Michal Berger Committed by Jim Harris
Browse files

test/scheduler: Calculate median of the cpu load samples



Done for debug purposes to clearly see how the outliers can
(sometimes heavily) influence the average.

Related to #3362.

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


Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
parent b22f1b34
Loading
Loading
Loading
Loading
+21 −3
Original line number Diff line number Diff line
@@ -628,11 +628,12 @@ collect_cpu_idle() {

	get_cpu_time "$time" idle 0 1 "${cpus_to_collect[@]}"

	local user_load
	local user_load load_median
	for cpu in "${cpus_to_collect[@]}"; do
		samples=(${cpu_times[cpu]})
		printf '* cpu%u idle samples: %s (avg: %u%%)\n' \
			"$cpu" "${samples[*]}" "${avg_cpu_time[cpu]}"
		load_median=$(calc_median "${samples[@]}")
		printf '* cpu%u idle samples: %s (avg: %u%%, median: %u%%)\n' \
			"$cpu" "${samples[*]}" "${avg_cpu_time[cpu]}" "$load_median"
		# Cores with polling reactors have 0% idle time,
		# while the ones in interrupt mode won't have 100% idle.
		# During the tests, polling reactors spend the major portion
@@ -703,3 +704,20 @@ update_thread_cpus_map() {
	done
	((${#thread_cpus[@]} > 0))
}

calc_median() {
	local samples=("$@") samples_sorted
	local middle median sample

	samples_sorted=($(printf '%s\n' "${samples[@]}" | sort -n))

	middle=$((${#samples_sorted[@]} / 2))
	if ((${#samples_sorted[@]} % 2 == 0)); then
		median=$(((samples_sorted[middle - 1] + samples_sorted[middle]) / 2))
	else
		median=${samples_sorted[middle]}
	fi

	echo "$median"

}