# NvmeTest **Repository Path**: zzkuang/nvme-test ## Basic Information - **Project Name**: NvmeTest - **Description**: A comprehensive NVMe/SSD performance testing toolkit for Linux with automated configuration discovery and real-time analysis. Supports x86_64, ARM64, and Zynq platforms. - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-16 - **Last Updated**: 2025-07-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # NVMe 存储性能测试套件 专为Linux系统设计的全面NVMe/SSD存储性能测试工具包。本项目提供自动化配置发现和详细的性能分析功能。 ## 📁 项目结构 ``` ├── CMakeLists.txt # CMake构建配置文件 ├── Documents.txt # 测试输出日志示例 ├── nvme_test_aarch # aarch64架构编译二进制文件 ├── Readme.md # 英文文档 ├── Readme_zh.md # 中文文档(本文件) ├── result_analysis.py # Python可视化分析工具 ├── search_config.cpp # 最佳配置发现工具 ├── write_test_aarch64_static # 静态链接的aarch64二进制文件 └── write_test.cpp # 主要的基于文件大小的测试工具 ``` ## 🚀 快速开始 ### 适用于任何Linux系统 ```bash # 1. 自动发现最佳设置 ./search_config /path/to/test/ # 2. 使用发现的设置运行性能测试 ./write_test /path/to/test/ 1GB # 3. 分析结果 python result_analysis.py Documents.txt ``` ### 适用于Zynq/ARM64平台 ```bash # 使用预编译的静态二进制文件(无依赖) ./search_config_aarch64_static /mnt/nvme/ ./write_test_aarch64_static /mnt/nvme/ 1GB ``` ## 📊 工具概览 ### 1. 配置发现工具 (`search_config`) 自动为您的存储设备找到最佳的I/O配置。 **功能特性:** - 测试多种块大小(64KB - 8MB) - 比较DirectIO与缓存I/O - 评估SyncIO性能影响 - 提供推荐设置 **使用方法:** ```bash ./search_config /path/to/test/ # 手动配置覆盖 ./search_config /path/to/test/ --auto=0 --block-size=1024 --direct=1 ``` ### 2. 性能测试工具 (`write_test`) 进行精确的基于文件大小的写入性能测试。 **功能特性:** - 基于文件大小的测试:指定确切的数据量(100MB、1.5GB、10TB) - 实时监控:显示实时进度和预计完成时间 - 灵活的I/O模式:DirectIO、SyncIO配置 - 进度跟踪:可自定义报告间隔 **使用方法:** ```bash ./write_test /path/to/test/ <文件大小> [选项] ``` ### 3. 结果分析工具 (`result_analysis.py`) 提供全面的可视化和统计分析功能。 **功能特性:** - 性能曲线可视化 - 速度分布分析 - 统计摘要 - 多格式图表导出 ## 🛠️ 从源码构建 ### 前置要求 ```bash # Ubuntu/Debian系统 sudo apt update sudo apt install build-essential cmake g++ # 用于ARM64交叉编译 sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu ``` ### 编译过程 #### 本地编译 ```bash mkdir build cd build cmake .. make # 这会创建两个可执行文件: # - search_config(配置发现) # - write_test(性能测试) ``` #### ARM64/Zynq交叉编译 ```bash # 配置发现工具 aarch64-linux-gnu-g++ -o search_config_aarch64_static search_config.cpp \ -std=c++11 -O2 -static -pthread # 性能测试工具 aarch64-linux-gnu-g++ -o write_test_aarch64_static write_test.cpp \ -std=c++11 -O2 -static -pthread ``` ## 📖 详细使用指南 ### 第一步:发现最佳配置 首先,使用配置发现工具为您的存储设备找到最佳设置: ```bash # 自动发现(推荐) ./search_config /mnt/nvme/ # 示例输出: # 正在自动测试最佳参数配置... # 测试配置: 块大小=64KB, DirectIO=是, SyncIO=否 # 速度: 280.45 MB/s # 测试配置: 块大小=128KB, DirectIO=是, SyncIO=否 # 速度: 295.32 MB/s # ... # 找到最佳配置: # 块大小: 1024KB # DirectIO: 是 # SyncIO: 否 ``` ### 第二步:运行性能测试 使用发现的最佳配置进行性能测试: ```bash # 基于发现结果运行实际测试 ./write_test /mnt/nvme/ 1GB --direct=1 --sync=0 # 或测试不同场景 ./write_test /mnt/nvme/ 5GB # 大文件测试 ./write_test /mnt/nvme/ 100MB # 快速测试 ``` ### 写入测试工具语法 ```bash ./write_test <测试目录> <文件大小> [选项] ``` ### 配置发现工具语法 ```bash ./search_config <测试目录> [选项] ``` #### 配置发现选项 | 选项 | 说明 | 默认值 | 示例 | |------|------|--------|------| | `--auto=<0\|1>` | 启用自动发现 | 1 | `--auto=0` | | `--block-size=` | 手动块大小 | 自动 | `--block-size=1024` | | `--file-size=` | 发现用的测试文件大小 | 256 | `--file-size=512` | | `--direct=<0\|1>` | 手动DirectIO设置 | 自动 | `--direct=1` | | `--sync=<0\|1>` | 手动SyncIO设置 | 自动 | `--sync=0` | #### 写入测试选项 | 选项 | 说明 | 默认值 | 示例 | |------|------|--------|------| | `--direct=<0\|1>` | 启用/禁用DirectIO | 1 | `--direct=0` | | `--sync=<0\|1>` | 启用/禁用SyncIO | 0 | `--sync=1` | | `--report=` | 进度报告间隔 | 100 | `--report=50` | ### 文件大小格式 - **兆字节**:`100MB`、`500M` - **千兆字节**:`1GB`、`2.5G` - **太字节**:`1TB`、`1.5T` - **千字节**:`512KB`、`1024K` ### 完整工作流程示例 #### 1. 配置发现 ```bash # 为您的NVMe设备找到最佳设置 ./search_config /mnt/nvme/ # 输出将显示测试的配置并推荐最佳设置 # 示例结果:块大小=1024KB,DirectIO=是,SyncIO=否 ``` #### 2. 性能测试 ```bash # 使用发现的最佳设置 ./write_test /mnt/nvme/ 1GB # 测试不同文件大小 ./write_test /mnt/nvme/ 100MB # 快速测试 ./write_test /mnt/nvme/ 5GB # 压力测试 ./write_test /mnt/nvme/ 100GB # 扩展测试 ``` #### 3. 结果分析 ```bash # 将测试输出保存到文件 ./write_test /mnt/nvme/ 1GB > test_results.txt # 生成可视化 python result_analysis.py test_results.txt ``` ### 示例命令 #### 配置发现示例 ```bash # 自动发现最佳配置 ./search_config /mnt/nvme/ # 手动比较特定配置 ./search_config /mnt/nvme/ --auto=0 --block-size=512 --direct=1 ./search_config /mnt/nvme/ --auto=0 --block-size=1024 --direct=0 # 使用不同的发现文件大小测试 ./search_config /mnt/nvme/ --file-size=512 ``` #### 性能测试示例 ```bash # 基本性能测试 ./write_test /mnt/nvme/ 1GB ./write_test /tmp/ 100MB # 高级配置 ./write_test /mnt/nvme/ 1GB --direct=0 # 禁用DirectIO进行比较 ./write_test /mnt/nvme/ 500MB --sync=1 # 启用同步I/O(较慢但更安全) ./write_test /mnt/nvme/ 2GB --report=50 # 自定义报告间隔(每50MB) # 性能比较 ./write_test /mnt/nvme/ 1GB # NVMe SSD ./write_test /media/sd0/ 1GB # SD卡 ./write_test /mnt/sata/ 1GB # SATA SSD ``` ## 📈 结果分析 ### Python可视化工具 安装依赖: ```bash pip install matplotlib numpy ``` 生成性能图表: ```bash # 分析测试结果 python result_analysis.py Documents.txt # 工具将生成: # - 性能曲线 # - 速度分布分析 # - 统计摘要 # - 带时间戳的PNG图表 ``` ### 示例输出分析 ``` ========== 测试完成 ========== 目标文件大小: 1 GB 实际写入大小: 1024.00 MB 完成进度: 100.0% 总耗时: 3.25 秒 平均写入速度: 315.39 MB/s =============================== ``` ### 性能基准 | 存储类型 | 典型速度范围 | |----------|-------------| | 高端NVMe | 1000-7000 MB/s | | 中端NVMe | 500-2000 MB/s | | SATA SSD | 300-600 MB/s | | eMMC/SD卡 | 50-200 MB/s | | 机械硬盘 | 80-200 MB/s | ## ⚙️ 理解I/O模式 ### DirectIO (`--direct=1`) - **目的**:绕过操作系统页面缓存,直接访问设备 - **优点**:可预测的性能,无双重缓冲 - **缺点**:需要对齐内存,小文件可能较慢 - **用例**:数据库应用,大型顺序I/O ### SyncIO (`--sync=1`) - **目的**:确保数据写入持久存储 - **优点**:最大数据安全性,断电不丢失数据 - **缺点**:显著降低性能 - **用例**:关键数据,事务日志,配置文件 ### 块大小(固定为1MB) - **理由**:适合大多数现代SSD和NVMe设备 - **好处**:性能和内存使用的良好平衡 - **对齐**:与DirectIO要求兼容 ## 🔧 配置发现深度解析 `search_config`工具系统性地测试不同的I/O配置,为您的存储设备找到最佳设置。 ### 测试矩阵 - **块大小**:64KB、128KB、256KB、512KB、1MB、4MB、8MB - **DirectIO模式**:启用、禁用 - **SyncIO模式**:禁用(可选启用但通常较慢) - **测试文件大小**:每个配置256MB(可自定义) ### 示例发现会话 ```bash $ ./search_config /mnt/nvme/ NVMe写入速率测试工具 (单线程版) 正在自动测试最佳参数配置... 测试配置: 块大小=64KB, DirectIO=是, SyncIO=否 速度: 245.32 MB/s 测试配置: 块大小=64KB, DirectIO=否, SyncIO=否 速度: 201.45 MB/s 测试配置: 块大小=128KB, DirectIO=是, SyncIO=否 速度: 289.67 MB/s 测试配置: 块大小=128KB, DirectIO=否, SyncIO=否 速度: 223.54 MB/s ... 测试配置: 块大小=1024KB, DirectIO=是, SyncIO=否 速度: 315.48 MB/s 找到最佳配置: 块大小: 1024KB DirectIO: 是 SyncIO: 否 测试文件大小: 1024MB ``` ### 理解结果 - **更高速度**:更适合您的特定硬件组合 - **DirectIO**:通常对大文件顺序操作更快 - **块大小**:较大的块通常对NVMe设备性能更好 - **一致性**:寻找多次运行中的稳定结果 ## 🚨 重要说明 ### 安全考虑 - **磁盘空间**:测试前确保有足够的空闲空间 - **数据安全**:测试创建临时文件,会自动删除 - **系统负载**:大型测试可能影响系统性能 - **中断操作**:使用Ctrl+C安全终止测试 ### 平台特定说明 #### Zynq Ultrascale+平台 - 使用`write_test_aarch64_static`以获得最佳兼容性 - DirectIO访问可能需要root权限 - 检查PCIe配置以获得最佳NVMe性能 #### 通用Linux系统 - 验证测试目录的写权限 - 考虑文件系统类型对性能的影响 - 在扩展测试期间监控系统温度 ## 🐛 故障排除 ### 常见问题 #### 权限问题 ```bash # 解决方案:使用适当权限运行 sudo ./write_test_aarch64_static /mnt/nvme/ 1GB sudo ./search_config /mnt/nvme/ ``` #### 二进制兼容性问题 ```bash # 错误:找不到GLIBC_2.xx # 解决方案:使用静态二进制文件 ./write_test_aarch64_static /mnt/nvme/ 1GB ./search_config_aarch64_static /mnt/nvme/ ``` #### DirectIO和I/O错误 ```bash # DirectIO对齐错误 # 解决方案:禁用DirectIO ./write_test_aarch64_static /mnt/nvme/ 1GB --direct=0 # 或使用发现工具找到兼容设置 ./search_config /mnt/nvme/ ``` #### 自动发现问题 ```bash # 耗时过长:使用较小的测试文件大小 ./search_config /mnt/nvme/ --file-size=128 # 跳过自动发现:设置手动配置 ./search_config /mnt/nvme/ --auto=0 --block-size=1024 --direct=1 # 仅测试特定配置 ./search_config /mnt/nvme/ --auto=0 --block-size=512 --direct=0 ``` #### 磁盘空间问题 ```bash # 检查可用空间 df -h /mnt/nvme/ # 使用较小的测试大小进行发现 ./search_config /mnt/nvme/ --file-size=64 # 使用较小的测试大小进行性能测试 ./write_test_aarch64_static /mnt/nvme/ 100MB ``` ## 📊 完整测试会话示例 ### 配置发现会话 ```bash $ ./search_config /mnt/nvme/ NVMe写入速率测试工具 (单线程版) 正在自动测试最佳参数配置... 测试配置: 块大小=64KB, DirectIO=是, SyncIO=否 速度: 245.32 MB/s 测试配置: 块大小=128KB, DirectIO=是, SyncIO=否 速度: 289.67 MB/s 测试配置: 块大小=1024KB, DirectIO=是, SyncIO=否 速度: 315.48 MB/s 找到最佳配置: 块大小: 1024KB DirectIO: 是 SyncIO: 否 ``` ### 性能测试会话 ```bash $ ./write_test_aarch64_static /mnt/nvme/ 1GB 基于文件大小的存储写入性能测试工具 v2.0 ========== 基于文件大小的写入测试 ========== 测试配置: - 测试路径: /mnt/nvme/ - 块大小: 1024 KB - 目标文件大小: 1 GB - DirectIO: 启用 - SyncIO: 禁用 - 报告间隔: 100 MB ============================================= 已写入(MB) 进度(%) 瞬时速度(MB/s) 平均速度(MB/s) 剩余时间 100 9.8 315.50 315.50 2.8s 200 19.5 320.25 317.88 2.5s ... 1024 100.0 312.45 315.39 0s ========== 测试完成 ========== 目标文件大小: 1 GB 实际写入大小: 1024.00 MB 完成进度: 100.0% 总耗时: 3.25 秒 平均写入速度: 315.39 MB/s =============================== ``` ## 🎯 目标用户 本工具包专为以下用户设计: - **系统管理员**:在生产环境中基准测试存储性能 - **嵌入式开发者**:在ARM/Zynq平台上测试存储性能 - **性能工程师**:分析I/O特性和优化 - **Linux用户**:任何需要可靠存储性能测量的人员 - **硬件评估者**:比较不同存储设备和配置 ## 🏗️ 架构设计 项目由三个主要组件组成: 1. **配置发现引擎** (`search_config.cpp`) - 系统性参数空间探索 - 自动最佳配置检测 - 不同设置间的性能比较 2. **性能测试核心** (`write_test.cpp`) - 精确的基于文件大小的测试 - 实时进度监控 - 可配置的I/O模式和报告 3. **分析和可视化** (`result_analysis.py`) - 测试结果统计分析 - 性能曲线可视化 - 多格式图表生成 ## 🚀 性能方法论 ### 测试方法 - **系统性配置测试**:探索多个参数组合 - **受控文件大小**:消除未知数据量的变异性 - **真实I/O模式**:使用现实的块大小和访问模式 - **统计验证**:多个测量点确保结果可靠 ### 关键指标 - **吞吐量**:MB/s持续写入性能 - **一致性**:标准差和稳定性分析 - **效率**:最佳配置推荐 - **可扩展性**:不同文件大小的性能表现 ## 🤝 贡献指南 1. Fork本仓库 2. 创建功能分支 (`git checkout -b feature/amazing-feature`) 3. 进行更改 4. 在目标平台上测试(特别是ARM64/Zynq如果适用) 5. 提交更改 (`git commit -m 'Add amazing feature'`) 6. 推送到分支 (`git push origin feature/amazing-feature`) 7. 打开Pull Request ### 开发指南 - 保持C++11兼容性以获得最大平台支持 - 测试DirectIO和缓存I/O模式 - 验证交叉编译兼容性 - 为新功能更新文档 ## 📄 许可证 本项目采用MIT许可证。您可以根据许可证条款自由使用、修改和分发。 ## 📞 支持 如有问题和疑问: - **故障排除**:查看上面的详细故障排除部分 - **示例数据**:查看`Documents.txt`中的示例输出 - **编译问题**:确保为目标平台选择合适的工具链 - **性能问题**:使用配置发现工具找到最佳设置 ### 报告问题 报告问题时,请包含: - 目标平台(x86_64、ARM64、Zynq等) - 使用的编译方法 - 完整的错误消息或意外输出 - 存储设备类型和配置 - 使用的测试参数 --- **祝您基准测试愉快! 🚀**