Skip to content

Latest commit

 

History

History
230 lines (209 loc) · 13 KB

File metadata and controls

230 lines (209 loc) · 13 KB

Dite 项目升级计划

目标

把现有的 DiskSpd batch 脚本升级成一个可打包的 Windows 命令行程序,保留现有测试逻辑,早期以 CrystalDiskMark-like 体验起步,中期加入 GUI,后期扩展为多引擎、多任务的高级工具,始终走差异化路线,不与专业工具正面竞争。

技术栈

  • Python 3.13+
  • PyInstaller onedir 打包
  • JSON 配置文件(Config/ 目录下多文件)
  • 外部工具内置:DiskSpd.exe、RAMMap.exe(开发者在本地 Tools/ 放置,打包脚本复制)

项目目录结构

D:\Coding\Dite\
├── AGENTS.md                              # 项目交接文档
├── PLAN.md                                # 本计划
├── README.md                              # 用户说明文档
├── main.py                                # PyInstaller 打包入口
├── build.py                               # PyInstaller 打包脚本
├── Config\                                # 配置目录(扁平,无子目录)
│   ├── tools.json                         # 工具 exe 路径
│   ├── engine_defaults.json               # 引擎级默认参数
│   ├── tasks.json                         # 共享 task 定义
│   ├── presets.json                       # 内置 3 个预设
│   ├── settings.json                      # 预留:GUI/用户偏好
│   └── Custom_*.json                      # 用户自定义预设(放即生效)
├── 版本演变分析报告.md                     # 版本记录
├── 文章20260624.md                         # 文章草稿
├── DiskSpd_CrystalDiskMark-Like_V17.bat   # 脚本最终版
├── DiskSpd_Realistic_V17.bat              # 脚本最终版
├── Archive\                               # 旧版本归档总目录
│   ├── Early\                             # 脚本时代产物
│   │   ├── Data\                          # 旧表格 / 记录 / 图表
│   │   ├── RawOut\                        # 脚本历史日志
│   │   │   ├── V1-V9\
│   │   │   ├── V10-V16\
│   │   │   └── CrystalDiskMark\
│   │   └── Source\                        # 旧 bat 脚本,平铺
│   ├── V20\                               # V20 Python 源码归档
│   │   ├── Source\                        # Python 源码
│   │   ├── presets.json
│   │   ├── main.py
│   │   └── build.py
│   ├── V21\                               # V21 Python 源码归档(V22 升级前快照)
│   │   ├── Source\                        # Python 源码
│   │   ├── presets.json
│   │   ├── main.py
│   │   └── build.py
│   ├── V22\                               # V22 Python 源码归档(V23 升级前快照)
│   │   ├── Source\                        # Python 源码
│   │   ├── Config\                        # 配置文件快照
│   │   ├── main.py
│   │   └── build.py
│   └── V23\                               # V23 Python 源码归档(V24 升级前快照)
│       ├── Source\                        # Python 源码
│       ├── Config\                        # 配置文件快照
│       ├── main.py
│       └── build.py
├── Source\                                # Python 源码 V24+,平铺
│   ├── engines\                           # 引擎实现子包
│   │   ├── base.py
│   │   ├── cache_clear.py
│   │   ├── diskspd.py
│   │   ├── filegen.py
│   │   ├── fio.py
│   │   └── robocopy.py
│   ├── __main__.py
│   ├── cli.py
│   ├── config.py
│   ├── context.py
│   ├── formatter.py
│   ├── scheduler.py
│   └── utils.py
├── Outputs\                               # 程序运行日志
├── Release\                               # 发布分发包
│   └── Dite_V24_x64.7z                    # V24 Windows x64 分发包
├── Tools\                                 # 外部工具(diskspd.exe / RAMMap.exe)
├── DevTool\                               # 开发辅助脚本
├── Temp\                                  # 临时目录,随时清空
├── RawOut\                                # 脚本 V17 输出日志
└── Data\                                  # 数据

目录规则

  • 项目内所有文件只保留一份,不允许外面一份、文件夹里一份。
  • 文档、最新数据、脚本最后一版保留在根目录。
  • Archive 是所有历史归档的总目录,项目内不再设置其他 archive
  • Archive/Early/ 汇总脚本时代的产物,其下 Source/ 平铺所有旧 bat,不再子目录。
  • Archive/Early/RawOut/ 下 3 个子目录分别存放对应阶段日志。
  • Archive/V20/ 存放 V20 Python 源码归档。
  • Archive/V21/ 存放 V21 Python 源码归档。
  • Archive/V22/ 存放 V22 Python 源码归档。
  • Archive/V23/ 存放 V23 Python 源码归档。
  • Source/ 下直接平铺 .py 文件;多引擎实现放在 Source/engines/ 子包中。
  • Release/ 存放对外发布包,命名规则 <Program>_<Version>_<Arch>.7z
  • Temp/ 随时清空,运行期使用。

版本号规则

  • 脚本阶段版本号到 V17 结束。
  • Python 程序阶段版本号从 V20 开始,当前已迭代至 V24

第一阶段:命令行 MVP(V20,已完成)

功能

  1. 启动后提示输入目标磁盘盘符,默认取程序所在磁盘。
  2. 提示选择预设:1 = CrystalDiskMark-Like,2 = Realistic,3 = Fast;输入其他提示“尚在开发中”。
  3. 读取 presets.json 加载预设参数。
  4. 执行与 V17 脚本等价的流程:
    • 初始写入测速
    • 计算并执行填充
    • RAMMap 清缓存
    • 先全部读测试,再全部写测试
    • 解析 MiB/s 并输出 Summary
  5. 输出 txt 日志,保存为 Dite_V20_<盘符>-disk_<预设名>_<时间戳>.log,以 UTF-8 with BOM 保存。

源码结构

Source/   (平铺)
  __main__.py      # 包入口(python -m Source)
  cli.py           # 交互提示
  config.py        # 预设、配置加载
  runner.py        # 测试流程编排(V20)
  engine_base.py   # Engine 抽象接口
  engine_diskspd.py # DiskSpd 实现
  engine_fio.py    # FIO 预留空接口
  engine_native.py # 原生引擎预留
  utils.py         # 管理员检测、日志命名、速度解析
main.py            # PyInstaller 打包入口(根目录)
build.py           # PyInstaller 打包脚本(根目录)
presets.json       # 预设配置(根目录)

关键实现点

  • 管理员检测:未提升权限时提示并退出;打包后的 exe 附带 requireAdministrator manifest。
  • 工具路径解析:优先使用同目录 Tools/,再回退到 PATH。
  • DiskSpd 命令构造保持与 V17 完全一致,参数顺序特别注意 -d 在目标文件之前。
  • 速度解析:通过 subprocess.run(..., capture_output=True) 拿到 stdout,正则匹配 Total IO 后第一行 total: 的 MiB/s;失败时回退到首个不含 Read IOtotal: 行。
  • 浮点速度处理:直接用 Python float 计算 fill time,避免 batch 的整数截断问题。

第二阶段:任务组与 CLI 增强(V21 → V22,已完成)

V21(基准版本)

  • 实现基于 schedule 的预设配置:每个预设由 tasks + schedule 组成。
  • 支持逻辑操作:measurefillrunrepeatsummary
  • 支持三种预设:CrystalDiskMark-Like、Realistic、Fast。
  • 命令行参数支持 --disk--preset--config--no-pause
  • 失败时清理测试文件并输出错误原因。
  • 使用 TeeStream 统一捕获屏幕输出和日志文件,日志与屏幕内容一致。
  • 未提升管理员权限时打印警告并继续运行;admin_mode: "require" 的步骤会被自动跳过。
  • 控制台输出强制 UTF-8,避免中文乱码。

源码结构(V21)

Source/
  __main__.py           # 包入口、Tee 日志、参数解析、主流程
  cli.py                # 交互提示
  config.py             # 配置与预设模型、JSON 加载
  context.py            # 运行时上下文(盘符、管理员、结果、变量、测试文件路径)
  formatter.py          # 标题与日志文件名格式化
  scheduler.py          # 任务调度器:measure / fill / run / repeat / summary
  utils.py              # 管理员检测、项目根目录、测试文件清理
  engines/              # 引擎子包
    __init__.py         # 引擎注册与构建
    base.py             # Engine 抽象接口与 EngineResult
    diskspd.py          # DiskSpd 引擎
    cache_clear.py      # RAMMap 缓存清理引擎
    fio.py              # FIO 预留引擎
    robocopy.py         # RoboCopy 预留引擎
main.py                 # PyInstaller 入口
build.py                # PyInstaller 打包脚本
presets.json            # 预设配置

关键实现点

  • 调度层 scheduler.py 根据 ScheduleStep.admin_mode 跳过需要管理员权限的步骤。
  • 引擎层 cache_clear.py 在未提升权限时返回 returncode=1,作为安全兜底。
  • TeeStreamsys.stdout/sys.stderr 同时输出到屏幕和日志缓冲区,缓冲区中 \r\n/\r 统一替换为 \n
  • 日志文件以 UTF-8 with BOM 写入,文件名前缀为 Dite_V22_
  • 打包脚本 build.py 先构建 Dite_V22.exe,再重命名为 Dite.exe;输出目录保持 dist/Dite_V22/

V22(配置重构 + CopyCross)

  • V21 源码归档至 Archive/V21/,版本标识升级为 V22。
  • 重构配置系统:从单文件 presets.json 拆分为 Config/ 目录下多个扁平文件。
  • 引入共享 tasks.json、引擎默认 engine_defaults.json、工具路径 tools.json
  • Config/Custom_*.json 自动识别为用户自定义预设,追加到菜单末尾。
  • 新增 CopyCross 预设组(11-17),基于 RoboCopy 实现跨盘真实数据复制测试。
  • 新增 filegen 引擎,基于 CSPRNG + XOR 生成高质量随机测试数据。
  • 新增异步管线模拟模式(16-17),多线程并发生成、复制、清理。
  • RoboCopy 引擎支持中英文双语输出解析,/NFL 抑制文件列表。
  • 新增 simulatestoreverifycleanup 调度动作。
  • 预设重新排序:Realistic 移至第 1 位,1-9 为 DiskSpd 预设。

V23(结构化输出 + 后处理)

  • V22 源码归档至 Archive/V22/,版本标识升级为 V23。
  • 新增 CSV 结构化数据输出(Source/csv_writer.py),每次测试同步生成 .csvOutputs/
    • 列结构:测试时间、盘符、工具、预设、指标名、指标值、单位、日志文件名。
    • 参考根路径旧版 CSV 汇总表 原始数据0x-xxx_Latest.csv 的双语表头风格。
  • 新增数据后处理展示模块(Source/postproc.py),读取历史 CSV 生成对比表格。
  • .gitignore 全面锁定,排除非源码目录(Tools/、Data/、DevTool/、RawOut/、Release/、.csv、.xlsx)。

V24(IOPS / 延迟与多指标 repeat)

  • V23 源码归档至 Archive/V23/,版本标识升级为 V24。
  • DiskSpd 引擎新增 -L 延迟采集支持,解析 IOPS 与多粒度延迟(avg / min / max / p25 / p50 / p75 / p90 / p95 / p99 / p99.9 … p99.9999999)。
  • engine_defaults.jsonmeasure_latency 默认启用,summary 输出同时展示 Speed、IOPS、Latency。
  • repeat 调度动作支持多指标独立聚合:可对每个指标分别指定 mean / max / min,未显式指定的数值指标默认 mean
  • CrystalDiskMark 行为预设(5-9)的 repeat 改为对 speed / iops 取 max、对 latency_p99_msmin,更贴近 CrystalDiskMark 的取最高成绩逻辑。
  • 删除旧 measure 调度动作,统一使用 run + store
  • fill 动作重命名为 diskspd_fill,明确其为 DiskSpd 专属填充步骤。
  • 后续计划(暂缓):summary 通用化、CSV 输出与后处理重构、simulate 能力增强、FIO/原生引擎、GUI。

第三阶段:GUI

  • 框架待定(PyQt6 / PySide6 / Dear PyGui 等中后期评估)。
  • 图形化选择磁盘、预设、显示实时输出和 Summary。

第四阶段:多引擎与高级功能

  • 实现 FIO 引擎。
  • 原生引擎(Windows API)调研与实现。
  • 多任务队列、对比报告、结果数据库等。

差异点与定位

  • 不追求替代 Iometer、CrystalDiskMark 等专业工具。
  • 主打“预设即开即用 + 真实世界大文件测试 + 后续多引擎对比”。
  • 先满足个人评测工作流,再逐步开放。

打包说明

  • PyInstaller onedir 输出到 dist/Dite_V24/(已被 .gitignore 忽略)。
  • build.py 会把 Tools/Config/ 复制到打包输出目录。
  • 打包产物中的可执行文件为 Dite.exe;发布包为 Release/Dite_V24_x64.7z
  • .gitignore 已配置,忽略 Python 缓存、PyInstaller 中间产物、Outputs/、Temp/、Tools/、Data/、DevTool/、RawOut/、Release/、Old/、OldData/、.csv、.xlsx 等。