Files
membank/auto-check/scripts/disk.sh
12600k-rog-d4 2aaaa16ae2 0813
2026-08-13 22:49:50 +08:00

78 lines
3.1 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
echo "===TEST:disk==="
TEST_DIR=${AUTOCHECK_DISK_DIR:-/tmp/auto-check-disk}
mkdir -p "$TEST_DIR"
START_TIME=$(date +%s%N)
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 ''