diff --git a/README.md b/README.md index ebe1ae6..ed15862 100644 --- a/README.md +++ b/README.md @@ -648,3 +648,13 @@ python3 gpu_tester.py --test all --format html --output report.html | PCIe | Gen4 x16 | Gen4 x16 | Gen5 x16 | Gen5 x16 | Gen5 x16 | Gen5 x16 | | 最低驱动 | 470 | 470 | 535 | 535 | 550 | 550 | | 最低 CUDA | 11.0 | 11.0 | 12.1 | 12.1 | 12.4 | 12.4 | + +## 测试磁盘性能和使用方式 + +```bash +./disk_benchmark.sh -h +``` + +```bash +./disk_benchmark.sh --path /path/to/test --numjobs 8 --rw randread --iodepth 1 +``` diff --git a/disk_benchmark.sh b/disk_benchmark.sh new file mode 100755 index 0000000..4044fa4 --- /dev/null +++ b/disk_benchmark.sh @@ -0,0 +1,157 @@ +#!/bin/bash +# 2025-05-24 add by dukai + +set -euo pipefail + +DEFAULT_PATH="/tmp" +DEFAULT_NUMJOBS=1 +DEFAULT_RW="randread" +DEFAULT_BS="4k" +DEFAULT_IODEPTH=1 +DEFAULT_SIZE="80G" +DEFAULT_RUNTIME=300 +DEFAULT_RAMP_TIME=10 + +usage() { + cat < 测试文件所在目录 (默认: ${DEFAULT_PATH}) + -j, --numjobs <并发数> 并发工作线程数 (默认: ${DEFAULT_NUMJOBS}) + -r, --rw <策略> 读写策略 (默认: ${DEFAULT_RW}) + -b, --bs <块大小> I/O 块大小 (默认: ${DEFAULT_BS}) + -d, --iodepth <队列深度> I/O 队列深度 (默认: ${DEFAULT_IODEPTH}) + -s, --size <大小> 测试文件大小 (默认: ${DEFAULT_SIZE}) + -t, --runtime <秒> 测试持续时间 (默认: ${DEFAULT_RUNTIME}s) + --ramp <秒> 预热时间 (默认: ${DEFAULT_RAMP_TIME}s) + -o, --output <目录> 结果输出目录 (默认: 当前目录) + -h, --help 显示此帮助 + +支持的 --rw 策略: + read 顺序读 + write 顺序写 + randread 随机读 ← 默认 + randwrite 随机写 + readwrite 顺序混合读写(50/50) + randrw 随机混合读写(50/50) + trimwrite Trim + 写(NVMe 专用) + +示例: + $(basename "$0") --path /data --numjobs 8 --rw randread --iodepth 32 +HELP + exit 0 +} + +PATH_ARG="$DEFAULT_PATH" +NUMJOBS="$DEFAULT_NUMJOBS" +RW="$DEFAULT_RW" +BS="$DEFAULT_BS" +IODEPTH="$DEFAULT_IODEPTH" +SIZE="$DEFAULT_SIZE" +RUNTIME="$DEFAULT_RUNTIME" +RAMP_TIME="$DEFAULT_RAMP_TIME" +OUTPUT_DIR="." + +while [[ $# -gt 0 ]]; do + case "$1" in + -p|--path) PATH_ARG="${2:?'--path 需要参数'}"; shift 2 ;; + -j|--numjobs) NUMJOBS="${2:?'--numjobs 需要参数'}"; shift 2 ;; + -r|--rw) RW="${2:?'--rw 需要参数'}"; shift 2 ;; + -b|--bs) BS="${2:?'--bs 需要参数'}"; shift 2 ;; + -d|--iodepth) IODEPTH="${2:?'--iodepth 需要参数'}"; shift 2 ;; + -s|--size) SIZE="${2:?'--size 需要参数'}"; shift 2 ;; + -t|--runtime) RUNTIME="${2:?'--runtime 需要参数'}"; shift 2 ;; + --ramp) RAMP_TIME="${2:?'--ramp 需要参数'}"; shift 2 ;; + -o|--output) OUTPUT_DIR="${2:?'--output 需要参数'}"; shift 2 ;; + -h|--help) usage ;; + *) echo "[ERROR] 未知参数: $1,使用 --help 查看帮助" >&2; exit 1 ;; + esac +done + +VALID_RW="read write randread randwrite readwrite randrw trimwrite" +echo "$VALID_RW" | grep -qw "$RW" \ + || { echo "[ERROR] 不支持的 --rw 策略: '$RW'。支持: $VALID_RW" >&2; exit 1; } + +[[ "$NUMJOBS" =~ ^[1-9][0-9]*$ ]] || { echo "[ERROR] --numjobs 必须为正整数" >&2; exit 1; } +[[ "$IODEPTH" =~ ^[1-9][0-9]*$ ]] || { echo "[ERROR] --iodepth 必须为正整数" >&2; exit 1; } +[[ "$RUNTIME" =~ ^[1-9][0-9]*$ ]] || { echo "[ERROR] --runtime 必须为正整数" >&2; exit 1; } + +command -v fio &>/dev/null || { echo "[ERROR] 未找到 fio,请先安装: apt install fio / yum install fio" >&2; exit 1; } +[[ -d "$PATH_ARG" ]] || { echo "[ERROR] 测试路径不存在: $PATH_ARG" >&2; exit 1; } +[[ -w "$PATH_ARG" ]] || { echo "[ERROR] 测试路径无写权限: $PATH_ARG" >&2; exit 1; } +mkdir -p "$OUTPUT_DIR" || { echo "[ERROR] 无法创建输出目录: $OUTPUT_DIR" >&2; exit 1; } + +TIMESTAMP=$(date '+%Y%m%d_%H%M%S') +JOB_NAME="${RW}_${BS}_j${NUMJOBS}_qd${IODEPTH}" +TEST_FILE="${PATH_ARG}/fio_test_${TIMESTAMP}.tmp" +OUTPUT_PREFIX="${OUTPUT_DIR}/${JOB_NAME}_${TIMESTAMP}" +SUMMARY_FILE="${OUTPUT_PREFIX}_summary.txt" + +cat <