test/nvme_perf: use float arithmetics

Using only Bash for calculation in this script
results in operating only on integers, which lead
to wrong results being saved after test run.

For example - submission latency of 0.175usec was
saved as 0usec.

Change-Id: I6f9924d12189631ab6d0bdc5385e642b6c2aa34f
Signed-off-by: Karol Latecki <karol.latecki@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4013
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Michal Berger <michalx.berger@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Karol Latecki 2020-09-01 18:10:57 +02:00 committed by Tomasz Zawadzki
parent 195fb4e40e
commit 20df041193
2 changed files with 61 additions and 81 deletions

View File

@ -319,57 +319,52 @@ function preconditioning() {
rm -f $testdir/config.fio
}
function bc() {
$(type -P bc) -l <<< "scale=3; $1"
}
function get_results() {
local reads_pct
local writes_pct
reads_pct=$(bc -l <<< "scale=3; $2/100")
writes_pct=$(bc -l <<< "scale=3; 1-$reads_pct")
reads_pct=$(bc "$2 / 100")
writes_pct=$(bc "1 - $reads_pct")
case "$1" in
iops)
iops=$(jq -r '.jobs[] | .read.iops + .write.iops' $TMP_RESULT_FILE)
iops=${iops%.*}
echo $iops
;;
mean_lat_usec)
mean_lat=$(jq -r ".jobs[] | (.read.lat_ns.mean * $reads_pct + .write.lat_ns.mean * $writes_pct)" $TMP_RESULT_FILE)
mean_lat=${mean_lat%.*}
echo $((mean_lat / 1000))
mean_lat=$(jq -r ".jobs[] | (.read.lat_ns.mean * $reads_pct + .write.lat_ns.mean * $writes_pct)/1000" $TMP_RESULT_FILE)
echo $mean_lat
;;
p90_lat_usec)
p90_lat=$(jq -r ".jobs[] | (.read.clat_ns.percentile.\"90.000000\" // 0 * $reads_pct + .write.clat_ns.percentile.\"90.000000\" // 0 * $writes_pct)" $TMP_RESULT_FILE)
p90_lat=${p90_lat%.*}
echo $((p90_lat / 1000))
p90_lat=$(jq -r ".jobs[] | (.read.clat_ns.percentile.\"90.000000\" // 0 * $reads_pct + .write.clat_ns.percentile.\"90.000000\" // 0 * $writes_pct)/1000" $TMP_RESULT_FILE)
echo $p90_lat
;;
p99_lat_usec)
p99_lat=$(jq -r ".jobs[] | (.read.clat_ns.percentile.\"99.000000\" // 0 * $reads_pct + .write.clat_ns.percentile.\"99.000000\" // 0 * $writes_pct)" $TMP_RESULT_FILE)
p99_lat=${p99_lat%.*}
echo $((p99_lat / 1000))
p99_lat=$(jq -r ".jobs[] | (.read.clat_ns.percentile.\"99.000000\" // 0 * $reads_pct + .write.clat_ns.percentile.\"99.000000\" // 0 * $writes_pct)/1000" $TMP_RESULT_FILE)
echo $p99_lat
;;
p99_99_lat_usec)
p99_99_lat=$(jq -r ".jobs[] | (.read.clat_ns.percentile.\"99.990000\" // 0 * $reads_pct + .write.clat_ns.percentile.\"99.990000\" // 0 * $writes_pct)" $TMP_RESULT_FILE)
p99_99_lat=${p99_99_lat%.*}
echo $((p99_99_lat / 1000))
p99_99_lat=$(jq -r ".jobs[] | (.read.clat_ns.percentile.\"99.990000\" // 0 * $reads_pct + .write.clat_ns.percentile.\"99.990000\" // 0 * $writes_pct)/1000" $TMP_RESULT_FILE)
echo $p99_99_lat
;;
stdev_usec)
stdev=$(jq -r ".jobs[] | (.read.clat_ns.stddev * $reads_pct + .write.clat_ns.stddev * $writes_pct)" $TMP_RESULT_FILE)
stdev=${stdev%.*}
echo $((stdev / 1000))
stdev=$(jq -r ".jobs[] | (.read.clat_ns.stddev * $reads_pct + .write.clat_ns.stddev * $writes_pct)/1000" $TMP_RESULT_FILE)
echo $stdev
;;
mean_slat_usec)
mean_slat=$(jq -r ".jobs[] | (.read.slat_ns.mean * $reads_pct + .write.slat_ns.mean * $writes_pct)" $TMP_RESULT_FILE)
mean_slat=${mean_slat%.*}
echo $((mean_slat / 1000))
mean_slat=$(jq -r ".jobs[] | (.read.slat_ns.mean * $reads_pct + .write.slat_ns.mean * $writes_pct)/1000" $TMP_RESULT_FILE)
echo $mean_slat
;;
mean_clat_usec)
mean_clat=$(jq -r ".jobs[] | (.read.clat_ns.mean * $reads_pct + .write.clat_ns.mean * $writes_pct)" $TMP_RESULT_FILE)
mean_clat=${mean_clat%.*}
echo $((mean_clat / 1000))
mean_clat=$(jq -r ".jobs[] | (.read.clat_ns.mean * $reads_pct + .write.clat_ns.mean * $writes_pct)/1000" $TMP_RESULT_FILE)
echo $mean_clat
;;
bw_Kibs)
bw=$(jq -r ".jobs[] | (.read.bw + .write.bw)" $TMP_RESULT_FILE)
bw=${bw%.*}
echo $((bw))
echo $bw
;;
esac
}
@ -378,13 +373,11 @@ function get_bdevperf_results() {
case "$1" in
iops)
iops=$(grep Total $TMP_RESULT_FILE | awk -F 'Total' '{print $2}' | awk '{print $2}')
iops=${iops%.*}
echo $iops
;;
bw_Kibs)
bw_MBs=$(grep Total $TMP_RESULT_FILE | awk -F 'Total' '{print $2}' | awk '{print $4}')
bw_MBs=${bw_MBs%.*}
echo $((bw_MBs * 1024))
bw_KBs=$(grep Total $TMP_RESULT_FILE | awk -F 'Total' '{print $2}' | awk '{print $4}')
bc "$bw_KBs * 1024"
;;
esac
}
@ -397,16 +390,7 @@ function get_nvmeperf_results() {
local min_lat_usec
read -r iops bw_MBs mean_lat_usec min_lat_usec max_lat_usec <<< $(tr -s " " < $TMP_RESULT_FILE | grep -oP "(?<=Total : )(.*+)")
# We need to get rid of the decimal spaces due
# to use of arithmetic expressions instead of "bc" for calculations
iops=${iops%.*}
bw_MBs=${bw_MBs%.*}
mean_lat_usec=${mean_lat_usec%.*}
min_lat_usec=${min_lat_usec%.*}
max_lat_usec=${max_lat_usec%.*}
echo "$iops $(bc <<< "$bw_MBs * 1024") $mean_lat_usec $min_lat_usec $max_lat_usec"
echo "$iops $(bc "$bw_MBs * 1024") $mean_lat_usec $min_lat_usec $max_lat_usec"
}
function run_spdk_nvme_fio() {

View File

@ -257,22 +257,33 @@ if $DPDKMEM; then
dpdk_mem_pid=$!
fi
iops_disks=0
bw=0
min_lat_disks_usec=0
max_lat_disks_usec=0
mean_lat_disks_usec=0
p90_lat_disks_usec=0
p99_lat_disks_usec=0
p99_99_lat_disks_usec=0
stdev_disks_usec=0
mean_slat_disks_usec=0
mean_clat_disks_usec=0
#Run each workolad $REPEAT_NO times
for ((j = 0; j < REPEAT_NO; j++)); do
if [ $PLUGIN = "spdk-perf-bdev" ]; then
run_bdevperf > $TMP_RESULT_FILE
iops_disks=$((iops_disks + $(get_bdevperf_results iops)))
bw=$((bw + $(get_bdevperf_results bw_Kibs)))
iops_disks=$(bc "$iops_disks + $(get_bdevperf_results iops)")
bw=$(bc "$bw + $(get_bdevperf_results bw_Kibs)")
cp $TMP_RESULT_FILE $result_dir/perf_results_${MIX}_${PLUGIN}_${NO_CORES}cpus_${DATE}_${k}_disks_${j}.output
elif [ $PLUGIN = "spdk-perf-nvme" ]; then
run_nvmeperf $DISKNO > $TMP_RESULT_FILE
read -r iops bandwidth mean_lat min_lat max_lat <<< $(get_nvmeperf_results)
iops_disks=$((iops_disks + iops))
bw=$((bw + bandwidth))
mean_lat_disks_usec=$((mean_lat_disks_usec + mean_lat))
min_lat_disks_usec=$((min_lat_disks_usec + min_lat))
max_lat_disks_usec=$((max_lat_disks_usec + max_lat))
iops_disks=$(bc "$iops_disks+$iops")
bw=$(bc "$bw+$bandwidth")
mean_lat_disks_usec=$(bc "$mean_lat_disks_usec + $mean_lat")
min_lat_disks_usec=$(bc "$min_lat_disks_usec + $min_lat")
max_lat_disks_usec=$(bc "$max_lat_disks_usec + $max_lat")
cp $TMP_RESULT_FILE $result_dir/perf_results_${MIX}_${PLUGIN}_${NO_CORES}cpus_${DATE}_${k}_disks_${j}.output
else
@ -294,16 +305,15 @@ for ((j = 0; j < REPEAT_NO; j++)); do
elif [[ $RW = *"write"* ]]; then
rwmixread=0
fi
iops_disks=$((iops_disks + $(get_results iops $rwmixread)))
mean_lat_disks_usec=$((mean_lat_disks_usec + $(get_results mean_lat_usec $rwmixread)))
p90_lat_disks_usec=$((p90_lat_disks_usec + $(get_results p90_lat_usec $rwmixread)))
p99_lat_disks_usec=$((p99_lat_disks_usec + $(get_results p99_lat_usec $rwmixread)))
p99_99_lat_disks_usec=$((p99_99_lat_disks_usec + $(get_results p99_99_lat_usec $rwmixread)))
stdev_disks_usec=$((stdev_disks_usec + $(get_results stdev_usec $rwmixread)))
mean_slat_disks_usec=$((mean_slat_disks_usec + $(get_results mean_slat_usec $rwmixread)))
mean_clat_disks_usec=$((mean_clat_disks_usec + $(get_results mean_clat_usec $rwmixread)))
bw=$((bw + $(get_results bw_Kibs $rwmixread)))
iops_disks=$(bc "$iops_disks + $(get_results iops $rwmixread)")
mean_lat_disks_usec=$(bc "$mean_lat_disks_usec + $(get_results mean_lat_usec $rwmixread)")
p90_lat_disks_usec=$(bc "$p90_lat_disks_usec + $(get_results p90_lat_usec $rwmixread)")
p99_lat_disks_usec=$(bc "$p99_lat_disks_usec + $(get_results p99_lat_usec $rwmixread)")
p99_99_lat_disks_usec=$(bc "$p99_99_lat_disks_usec + $(get_results p99_99_lat_usec $rwmixread)")
stdev_disks_usec=$(bc "$stdev_disks_usec + $(get_results stdev_usec $rwmixread)")
mean_slat_disks_usec=$(bc "$mean_slat_disks_usec + $(get_results mean_slat_usec $rwmixread)")
mean_clat_disks_usec=$(bc "$mean_clat_disks_usec + $(get_results mean_clat_usec $rwmixread)")
bw=$(bc "$bw + $(get_results bw_Kibs $rwmixread)")
cp $TMP_RESULT_FILE $result_dir/perf_results_${MIX}_${PLUGIN}_${NO_CORES}cpus_${DATE}_${k}_disks_${j}.json
cp $testdir/config.fio $result_dir/config_${MIX}_${PLUGIN}_${NO_CORES}cpus_${DATE}_${k}_disks_${j}.fio
@ -325,32 +335,18 @@ if $DPDKMEM; then
fi
#Write results to csv file
iops_disks=$((iops_disks / REPEAT_NO))
bw=$((bw / REPEAT_NO))
iops_disks=$(bc "$iops_disks / $REPEAT_NO")
bw=$(bc "$bw / $REPEAT_NO")
if [[ "$PLUGIN" =~ "plugin" ]]; then
mean_lat_disks_usec=$((mean_lat_disks_usec / REPEAT_NO))
p90_lat_disks_usec=$((p90_lat_disks_usec / REPEAT_NO))
p99_lat_disks_usec=$((p99_lat_disks_usec / REPEAT_NO))
p99_99_lat_disks_usec=$((p99_99_lat_disks_usec / REPEAT_NO))
stdev_disks_usec=$((stdev_disks_usec / REPEAT_NO))
mean_slat_disks_usec=$((mean_slat_disks_usec / REPEAT_NO))
mean_clat_disks_usec=$((mean_clat_disks_usec / REPEAT_NO))
elif [[ "$PLUGIN" == "spdk-perf-bdev" ]]; then
mean_lat_disks_usec=0
p90_lat_disks_usec=0
p99_lat_disks_usec=0
p99_99_lat_disks_usec=0
stdev_disks_usec=0
mean_slat_disks_usec=0
mean_clat_disks_usec=0
mean_lat_disks_usec=$(bc "$mean_lat_disks_usec / $REPEAT_NO")
p90_lat_disks_usec=$(bc "$p90_lat_disks_usec / $REPEAT_NO")
p99_lat_disks_usec=$(bc "$p99_lat_disks_usec / $REPEAT_NO")
p99_99_lat_disks_usec=$(bc "$p99_99_lat_disks_usec / $REPEAT_NO")
stdev_disks_usec=$(bc "$stdev_disks_usec / $REPEAT_NO")
mean_slat_disks_usec=$(bc "$mean_slat_disks_usec / $REPEAT_NO")
mean_clat_disks_usec=$(bc "$mean_clat_disks_usec / $REPEAT_NO")
elif [[ "$PLUGIN" == "spdk-perf-nvme" ]]; then
mean_lat_disks_usec=$((mean_lat_disks_usec / REPEAT_NO))
p90_lat_disks_usec=0
p99_lat_disks_usec=0
p99_99_lat_disks_usec=0
stdev_disks_usec=0
mean_slat_disks_usec=0
mean_clat_disks_usec=0
mean_lat_disks_usec=$(bc "$mean_lat_disks_usec/$REPEAT_NO")
fi
printf "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n" ${DISKNO} ${iops_disks} ${mean_lat_disks_usec} ${p90_lat_disks_usec} ${p99_lat_disks_usec} \