This commit is contained in:
12600k-rog-d4
2026-08-13 22:49:50 +08:00
parent 5e296bfe19
commit 2aaaa16ae2
24 changed files with 1415 additions and 327 deletions

View File

@@ -1,14 +1,77 @@
echo "===TEST:disk==="
TEST_DIR=${AUTOCHECK_DISK_DIR:-/tmp/stress-disk-test}
DISK_SIZE_MB=${AUTOCHECK_DISK_SIZE_MB:-1024}
TEST_DIR=${AUTOCHECK_DISK_DIR:-/tmp/auto-check-disk}
mkdir -p "$TEST_DIR"
START_TIME=$(date +%s%N)
set +e
OUTPUT=$(mkdir -p "${TEST_DIR}" && stress-ng --iomix 2 --iomix-bytes "${DISK_SIZE_MB}M" --timeout "${AUTOCHECK_DURATION:-30}s" --metrics-brief 2>&1; rm -rf "${TEST_DIR}")
EXIT_CODE=$?
set -e
END_TIME=$(date +%s%N)
DURATION_MS=$(( (END_TIME - START_TIME) / 1000000 ))
if [ "$EXIT_CODE" -eq 0 ]; then echo 'status:pass'; else echo 'status:fail'; fi
echo "duration:${DURATION_MS}ms"
echo "output:${OUTPUT}"
if command -v fio >/dev/null 2>&1; then
FIO_IMG="$TEST_DIR/fio.img"
BW_LOG="$TEST_DIR/ac-bw"
IOPS_LOG="$TEST_DIR/ac-iops"
rm -f "$BW_LOG"*.log "$IOPS_LOG"*.log "$FIO_IMG"
set +e
OUTPUT=$(fio --name=autocheck --rw=randrw --rwmixread=70 --bs=4k \
--size="${AUTOCHECK_DISK_SIZE_MB:-512}M" --iodepth=32 --numjobs=1 \
--runtime="${AUTOCHECK_DURATION:-30}" --time_based --direct=1 \
--group_reporting --output-format=normal \
--write_bw_log="$BW_LOG" --write_iops_log="$IOPS_LOG" \
--log_avg_msec=1000 --filename="$FIO_IMG" 2>&1)
EXIT_CODE=$?
set -e
READ_LINE=$(echo "$OUTPUT" | grep -E '^[[:space:]]*read:' | head -1)
WRITE_LINE=$(echo "$OUTPUT" | grep -E '^[[:space:]]*write:' | head -1)
READ_IOPS=$(echo "$READ_LINE" | grep -oP 'IOPS=\K[0-9.]+' | head -1)
READ_BW=$(echo "$READ_LINE" | grep -oP 'BW=\K[0-9.]+' | head -1)
WRITE_IOPS=$(echo "$WRITE_LINE" | grep -oP 'IOPS=\K[0-9.]+' | head -1)
WRITE_BW=$(echo "$WRITE_LINE" | grep -oP 'BW=\K[0-9.]+' | head -1)
SCORE=$(awk -v r="${READ_BW:-0}" -v w="${WRITE_BW:-0}" 'BEGIN{printf "%.1f", r+w}')
IOPS_TOTAL=$(awk -v r="${READ_IOPS:-0}" -v w="${WRITE_IOPS:-0}" 'BEGIN{printf "%.1f", r+w}')
END_TIME=$(date +%s%N)
DURATION_MS=$(( (END_TIME - START_TIME) / 1000000 ))
if [ "$EXIT_CODE" -eq 0 ]; then echo 'status:pass'; else echo 'status:fail'; fi
echo "duration:${DURATION_MS}ms"
echo "score:${SCORE}"
echo "metric:iops_total=${IOPS_TOTAL}"
[ -n "$READ_IOPS" ] && echo "metric:read_iops=${READ_IOPS}"
[ -n "$WRITE_IOPS" ] && echo "metric:write_iops=${WRITE_IOPS}"
[ -n "$READ_BW" ] && echo "metric:read_bw=${READ_BW}"
[ -n "$WRITE_BW" ] && echo "metric:write_bw=${WRITE_BW}"
[ -n "$READ_BW" ] && [ -n "$WRITE_BW" ] && echo "metric:bw_total=${SCORE}"
echo "output:${OUTPUT}"
# IOPS / 吞吐 曲线(按秒聚合)
BW_LOG_FILE=$(ls "$BW_LOG"*.log 2>/dev/null | head -1)
IOPS_LOG_FILE=$(ls "$IOPS_LOG"*.log 2>/dev/null | head -1)
echo "===SAMPLES==="
echo "time,iops_total,bw_total"
if [ -n "$BW_LOG_FILE" ] && [ -n "$IOPS_LOG_FILE" ]; then
awk -F',' '
FNR==NR { t=int($1/1000); if($3==0) ri[t]=$2; else wi[t]=$2; seen[t]=1; next }
{ t=int($1/1000); if($3==0) rb[t]=$2; else wb[t]=$2; seen[t]=1 }
END { for (k in seen) printf "%d,%.0f,%.1f\n", k, ri[k]+wi[k], (rb[k]+wb[k])/1024 }
' "$IOPS_LOG_FILE" "$BW_LOG_FILE" | sort -n
fi
echo "===END_SAMPLES==="
rm -f "$FIO_IMG" "$BW_LOG"*.log "$IOPS_LOG"*.log
else
# 无 fio降级为 stress-ng 磁盘 IO 压测(无 IOPS/吞吐曲线)
set +e
OUTPUT=$(stress-ng --iomix "${AUTOCHECK_THREADS:-2}" --iomix-bytes "${AUTOCHECK_DISK_MB:-512}M" --timeout "${AUTOCHECK_DURATION:-30}s" --temp-path /tmp --metrics-brief 2>&1)
EXIT_CODE=$?
set -e
SCORE=$(echo "$OUTPUT" | awk '/^stress-ng:/ && $4=="iomix" { v=$(NF-1)+0; if(v>0) s+=v } END{printf "%.1f", s+0}')
END_TIME=$(date +%s%N)
DURATION_MS=$(( (END_TIME - START_TIME) / 1000000 ))
if [ "$EXIT_CODE" -eq 0 ]; then echo 'status:pass'; else echo 'status:fail'; fi
echo "duration:${DURATION_MS}ms"
echo "score:${SCORE}"
echo "output:${OUTPUT}"
fi
echo ''