From 20df04119351f42df112e4c18dd11dd2d59e18f4 Mon Sep 17 00:00:00 2001 From: Karol Latecki Date: Tue, 1 Sep 2020 18:10:57 +0200 Subject: [PATCH] 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 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4013 Tested-by: SPDK CI Jenkins Reviewed-by: Michal Berger Reviewed-by: Shuhei Matsumoto Reviewed-by: Jim Harris --- test/nvme/perf/common.sh | 64 ++++++++++++------------------- test/nvme/perf/run_perf.sh | 78 ++++++++++++++++++-------------------- 2 files changed, 61 insertions(+), 81 deletions(-) diff --git a/test/nvme/perf/common.sh b/test/nvme/perf/common.sh index 27c75338f..46d1cc85c 100755 --- a/test/nvme/perf/common.sh +++ b/test/nvme/perf/common.sh @@ -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() { diff --git a/test/nvme/perf/run_perf.sh b/test/nvme/perf/run_perf.sh index ba54007b1..f43de1b3a 100755 --- a/test/nvme/perf/run_perf.sh +++ b/test/nvme/perf/run_perf.sh @@ -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} \