perf: measure set benchmarks with user and system time
This commit is contained in:
+25
-18
@@ -16,6 +16,7 @@ PERF_EVENTS='task-clock,context-switches,cpu-migrations,page-faults,minor-faults
|
||||
PACKAGER='krosh <gudovdo@my.msu.ru>'
|
||||
APT_SOURCE=/etc/apt/sources.list.d/alt.list
|
||||
APT_GET=/usr/lib/apt/apt-get
|
||||
TIME_COMMAND=/usr/bin/time
|
||||
RPM_BUILD_GIT=https://git.altlinux.org/gears/r/rpm-build.git
|
||||
RPM_GIT=https://git.altlinux.org/gears/r/rpm.git
|
||||
|
||||
@@ -93,7 +94,7 @@ operation_label()
|
||||
|
||||
run_once()
|
||||
{
|
||||
local operation=$1 variant=$2 run=$3 start end status perf_stat
|
||||
local operation=$1 variant=$2 run=$3 status perf_stat time_file
|
||||
local libdir="$variant/lib/usr/lib64"
|
||||
local root="$COMMON/root"
|
||||
local raw="$variant/raw"
|
||||
@@ -117,8 +118,9 @@ run_once()
|
||||
)
|
||||
fi
|
||||
|
||||
start=$(date +%s%N)
|
||||
if env LC_ALL=C APT_CONFIG="$COMMON/apt.conf" \
|
||||
time_file="$raw/$operation.$run.time.tsv"
|
||||
if "$TIME_COMMAND" -f $'%U\t%S' -o "$time_file" -- \
|
||||
env LC_ALL=C APT_CONFIG="$COMMON/apt.conf" \
|
||||
LD_LIBRARY_PATH="$libdir" \
|
||||
taskset -c "$CPU" "${command[@]}" \
|
||||
>"$raw/$operation.$run.stdout" \
|
||||
@@ -127,10 +129,7 @@ run_once()
|
||||
else
|
||||
status=$?
|
||||
fi
|
||||
end=$(date +%s%N)
|
||||
|
||||
RUN_TIME=$(awk -v start="$start" -v end="$end" \
|
||||
'BEGIN { printf "%.6f", (end - start) / 1000000000 }')
|
||||
read -r RUN_USER_TIME RUN_SYSTEM_TIME <"$time_file"
|
||||
RUN_STATUS=$status
|
||||
}
|
||||
|
||||
@@ -228,8 +227,8 @@ benchmark_variant()
|
||||
{
|
||||
local variant=$1 result=$2 debug_file=$3 debuginfo_rpm=$4
|
||||
local runtime_file=$5 dso_name=$6
|
||||
local operation run average label status_text perf_result perf_dir
|
||||
local -a times statuses
|
||||
local operation run average_user average_system label status_text perf_result perf_dir
|
||||
local -a user_times system_times statuses
|
||||
local -a operations=(
|
||||
check
|
||||
autoremove
|
||||
@@ -241,7 +240,7 @@ benchmark_variant()
|
||||
)
|
||||
|
||||
mkdir -p "$variant/raw/perf-stat"
|
||||
printf 'command\taverage_seconds\trun1_seconds\trun2_seconds\trun3_seconds\texit_status\n' \
|
||||
printf 'command\taverage_user_seconds\taverage_system_seconds\trun1_user_seconds\trun1_system_seconds\trun2_user_seconds\trun2_system_seconds\trun3_user_seconds\trun3_system_seconds\texit_status\n' \
|
||||
>"$result"
|
||||
perf_result=${result%.tsv}.perf-stat.tsv
|
||||
perf_dir=${result%.tsv}.perf
|
||||
@@ -257,22 +256,27 @@ benchmark_variant()
|
||||
fi
|
||||
|
||||
for operation in "${operations[@]}"; do
|
||||
times=()
|
||||
user_times=()
|
||||
system_times=()
|
||||
statuses=()
|
||||
|
||||
for ((run = 1; run <= RUNS; ++run)); do
|
||||
run_once "$operation" "$variant" "$run"
|
||||
times+=("$RUN_TIME")
|
||||
user_times+=("$RUN_USER_TIME")
|
||||
system_times+=("$RUN_SYSTEM_TIME")
|
||||
statuses+=("$RUN_STATUS")
|
||||
if ((COLLECT_PERF)); then
|
||||
append_perf_stat "$operation" "$run" \
|
||||
"$variant/raw/perf-stat/$operation.$run.tsv" "$perf_result"
|
||||
fi
|
||||
printf '%s: run %d/%d: %ss, status=%s\n' \
|
||||
"$operation" "$run" "$RUNS" "$RUN_TIME" "$RUN_STATUS"
|
||||
printf '%s: run %d/%d: user=%ss system=%ss status=%s\n' \
|
||||
"$operation" "$run" "$RUNS" \
|
||||
"$RUN_USER_TIME" "$RUN_SYSTEM_TIME" "$RUN_STATUS"
|
||||
done
|
||||
|
||||
average=$(printf '%s\n' "${times[@]}" | \
|
||||
average_user=$(printf '%s\n' "${user_times[@]}" | \
|
||||
awk '{ total += $1 } END { printf "%.6f", total / NR }')
|
||||
average_system=$(printf '%s\n' "${system_times[@]}" | \
|
||||
awk '{ total += $1 } END { printf "%.6f", total / NR }')
|
||||
|
||||
status_text=${statuses[0]}
|
||||
@@ -284,9 +288,11 @@ benchmark_variant()
|
||||
done
|
||||
|
||||
label=$(operation_label "$operation")
|
||||
printf '%s\t%s\t%s\t%s\t%s\t%s\n' \
|
||||
"$label" "$average" \
|
||||
"${times[0]}" "${times[1]}" "${times[2]}" "$status_text" \
|
||||
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
|
||||
"$label" "$average_user" "$average_system" \
|
||||
"${user_times[0]}" "${system_times[0]}" \
|
||||
"${user_times[1]}" "${system_times[1]}" \
|
||||
"${user_times[2]}" "${system_times[2]}" "$status_text" \
|
||||
>>"$result"
|
||||
|
||||
if ((COLLECT_PERF && PERF_RECORD)); then
|
||||
@@ -300,6 +306,7 @@ for command in git gear-hsh hsh rpm rpmquery rpm2cpio cpio apt-get apt-cache \
|
||||
taskset awk sed date sha256sum ldd readelf readlink eu-unstrip; do
|
||||
command -v "$command" >/dev/null || fail "required command not found: $command"
|
||||
done
|
||||
[[ -x $TIME_COMMAND ]] || fail "time executable not found: $TIME_COMMAND"
|
||||
if ((COLLECT_PERF)); then
|
||||
command -v perf >/dev/null || \
|
||||
fail "perf is not installed; install the ALT package: apt-get install perf"
|
||||
|
||||
Reference in New Issue
Block a user