-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_output.sh
More file actions
executable file
·123 lines (102 loc) · 5.16 KB
/
test_output.sh
File metadata and controls
executable file
·123 lines (102 loc) · 5.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/bin/bash
# test_output.sh - Validate blkbench output formatting
#
# Runs short benchmarks with io_uring on a tmpfs file and checks:
# - Human-readable output has all required sections
# - JSON output is valid and has all required fields
#
# Requires: blkbench binary, jq, tmpfs-backed /tmp
set -euo pipefail
PASS=0
FAIL=0
TESTFILE="/tmp/blkbench-test-output.raw"
check() {
local desc="$1" cond="$2"
if eval "$cond"; then
PASS=$((PASS + 1))
else
echo "FAIL: $desc"
FAIL=$((FAIL + 1))
fi
}
cleanup() { rm -f "$TESTFILE" /tmp/blkbench-out-*.txt; }
trap cleanup EXIT
dd if=/dev/zero of="$TESTFILE" bs=1M count=64 2>/dev/null
echo "== Human-readable output (randread) =="
./blkbench --driver io_uring --path "$TESTFILE" --rw randread \
--bs 4k --iodepth 32 --numjobs 1 --runtime 1 > /tmp/blkbench-out-human.txt 2>&1
HUMAN=$(cat /tmp/blkbench-out-human.txt)
# Header line
check "header has rw=" 'echo "$HUMAN" | grep -q "^blkbench: rw=randread"'
check "header has bs=4k" 'echo "$HUMAN" | grep -q "bs=4k"'
check "header has iodepth=32" 'echo "$HUMAN" | grep -q "iodepth=32"'
check "header has numjobs=1" 'echo "$HUMAN" | grep -q "numjobs=1"'
check "header has runtime=1s" 'echo "$HUMAN" | grep -q "runtime=1s"'
# IOPS+BW line
check "read line has IOPS=" 'echo "$HUMAN" | grep -q "read: IOPS="'
check "read line has BW=" 'echo "$HUMAN" | grep -q "BW=.*MiB/s"'
check "read line has MB/s" 'echo "$HUMAN" | grep -q "MB/s)"'
# Latency line
check "lat line present" 'echo "$HUMAN" | grep -q "lat (.*): min=.*, max=.*, avg="'
# Percentile table
check "percentile header" 'echo "$HUMAN" | grep -q "lat percentiles"'
check "p1 present" 'echo "$HUMAN" | grep -q "1.00th="'
check "p50 present" 'echo "$HUMAN" | grep -q "50.00th="'
check "p99 present" 'echo "$HUMAN" | grep -q "99.00th="'
check "p99.9 present" 'echo "$HUMAN" | grep -q "99.90th="'
check "p99.99 present" 'echo "$HUMAN" | grep -q "99.99th="'
# CPU line
check "cpu line present" 'echo "$HUMAN" | grep -q "cpu: usr=.*%, sys=.*%"'
# IOs line
check "ios line present" 'echo "$HUMAN" | grep -q "ios: total=.*, errors=.*, flushes="'
echo ""
echo "== JSON output (randread) =="
./blkbench --driver io_uring --path "$TESTFILE" --rw randread \
--bs 4k --iodepth 32 --numjobs 1 --runtime 1 \
--output-format json > /tmp/blkbench-out-json.txt 2>&1
# Validate JSON
check "JSON is valid" 'jq . /tmp/blkbench-out-json.txt >/dev/null 2>&1'
# Check required fields
check "json has job.rw" 'jq -e ".job.rw" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has job.bs" 'jq -e ".job.bs" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has job.iodepth" 'jq -e ".job.iodepth" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has job.numjobs" 'jq -e ".job.numjobs" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has job.driver" 'jq -e ".job.driver" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has iops" 'jq -e ".iops" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has bw_bytes" 'jq -e ".bw_bytes" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has read_iops" 'jq -e ".read_iops" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has write_iops" 'jq -e ".write_iops" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has lat_ns.min" 'jq -e ".lat_ns.min" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has lat_ns.max" 'jq -e ".lat_ns.max" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has lat_ns.mean" 'jq -e ".lat_ns.mean" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has lat_ns.percentiles" 'jq -e ".lat_ns.percentiles" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has cpu.usr" 'jq -e ".cpu.usr" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has cpu.sys" 'jq -e ".cpu.sys" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has ios_total" 'jq -e ".ios_total" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has errors" 'jq -e ".errors" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
check "json has flushes" 'jq -e ".flushes" /tmp/blkbench-out-json.txt >/dev/null 2>&1'
# Sanity: IOPS should be > 0
IOPS=$(jq '.iops' /tmp/blkbench-out-json.txt)
check "json iops > 0" '[ "$(echo "$IOPS > 0" | bc)" = "1" ]'
# Sanity: lat min <= mean <= max
MIN=$(jq '.lat_ns.min' /tmp/blkbench-out-json.txt)
MAX=$(jq '.lat_ns.max' /tmp/blkbench-out-json.txt)
MEAN=$(jq '.lat_ns.mean' /tmp/blkbench-out-json.txt)
check "lat min <= mean" '[ "$(echo "$MIN <= $MEAN" | bc)" = "1" ]'
check "lat mean <= max" '[ "$(echo "$MEAN <= $MAX" | bc)" = "1" ]'
# CPU sanity: non-negative
USR=$(jq '.cpu.usr' /tmp/blkbench-out-json.txt)
SYS=$(jq '.cpu.sys' /tmp/blkbench-out-json.txt)
check "cpu usr >= 0" '[ "$(echo "$USR >= 0" | bc)" = "1" ]'
check "cpu sys >= 0" '[ "$(echo "$SYS >= 0" | bc)" = "1" ]'
echo ""
echo "== Mixed workload output (randrw) =="
./blkbench --driver io_uring --path "$TESTFILE" --rw randrw \
--bs 4k --iodepth 16 --numjobs 1 --runtime 1 --rwmixread 70 \
> /tmp/blkbench-out-mixed.txt 2>&1
MIXED=$(cat /tmp/blkbench-out-mixed.txt)
check "mixed has read line" 'echo "$MIXED" | grep -q "read:.*IOPS="'
check "mixed has write line" 'echo "$MIXED" | grep -q "write:.*IOPS="'
echo ""
echo "=== Results: $PASS passed, $FAIL failed ==="
[ "$FAIL" -eq 0 ]