基准测试工具之你不知道的两三事 | 13. 怎样保存和复盘一轮测试
基准测试最令人遗憾的结果不是吞吐量低而是几天后再看那张截图已经说不清它来自哪个版本、哪份配置和哪台机器。性能结果天然依赖上下文。同样的吞吐量可能来自不同设备数、批大小、接口、数据库参数和硬件状态同一个 P99 峰值也可能对应客户端 GC、网络抖动、服务端合并或磁盘写满。没有原始证据复盘只能变成猜测。这一篇讨论怎样把一次 IoT Benchmark 运行保存为“可追溯实验包”让结果不仅能看还能复现、解释和审计。1. 为什么只保存截图远远不够截图通常只能保留某一刻的结果矩阵却会丢失决定结果含义的条件。只留下的内容后来无法回答的问题一张吞吐量截图使用了哪个数据库版本和写入接口一份config.properties服务端配置、硬件和网络环境是否相同一个最终 CSV测试中途是否出现超时、重试或错误日志一组监控曲线曲线的时间窗口对应哪一轮 Benchmark一句“测试通过”正确性验证检查了数量、时间戳还是具体值真正可复盘的结果必须能够重新建立“这一轮究竟发生了什么”的时间线。测试问题运行编号配置与版本原始日志与结果资源与正确性证据异常时间线带边界的结论2. 先给每轮测试一个唯一编号不要使用“最终版”“再跑一次”或“test2”作为运行名称。一个实用的运行编号至少应包含日期、对象、负载和轮次例如20260718-iotdb200-session-write-r03它可以映射为字段示例作用日期20260718便于按时间定位环境变化。被测对象iotdb200-session标明版本族或接口。负载write区分纯写、混合、乱序等场景。轮次r03保留同一配置下的重复运行。如果是多实例集群测试还应为每个客户端增加实例后缀如client-0、client-1并由一个总运行编号把它们关联起来。3. 建立一份可追溯实验包下面是一种建议目录。它不是 IoT Benchmark 自动生成的固定格式而是测试者在工具输出之外建立的归档约定。runs/20260718-iotdb200-session-write-r03/ ├── README.md # 测试问题、结论与异常摘要 ├── manifest.yaml # 运行编号、时间、机器和版本 ├── config/ │ ├── benchmark.properties # 本轮实际使用的完整配置 │ └── database.conf # 与结论相关的服务端配置 ├── output/ │ ├── benchmark.log # 完整客户端日志 │ └── test-result.csv # 最终结果与配置快照 ├── monitor/ │ ├── client/ # 压测机 CPU、网络、GC 等 │ └── server/ # 每个数据库节点的资源记录 ├── correctness/ │ ├── verification.log # 验证日志 │ └── checks.md # 预期量、实际量与抽样结果 └── checksums.txt # 关键数据集和文件校验值这个目录最重要的原则是原始证据与人工结论分开保存。日志和 CSV 不应被手工“修漂亮”异常解释放进README.md必要的清洗或汇总则另存新文件并说明生成方法。4. IoT Benchmark 提供了哪些结果出口在当前配置中至少要区分两类 CSV 能力。4.1CSV_OUTPUT保存最终结果和配置CSV_OUTPUTtrue当前代码会把配置、结果指标和延迟统计写入data/csvOutput/下的测试结果文件。它适合保存一轮结束时的最终汇总也是最轻量的归档方式。4.2TEST_DATA_PERSISTENCE持久化测量结果TEST_DATA_PERSISTENCECSV RECORD_SPLITtrue RECORD_SPLIT_MAX_LINE10000000 REMARKwrite_baseline_r03TEST_DATA_PERSISTENCE支持None、IoTDB、MySQL和CSV。选择 CSV 时工具会通过CSVRecorder保存测量记录选择数据库时则需要配置对应的结果库地址、端口、库名、账号和连接参数。二者不要混为一谈CSV_OUTPUTtrue负责输出最终测试结果 CSVTEST_DATA_PERSISTENCECSV走的是测量结果持久化路径。是否两者都开启取决于你需要“最终摘要”还是“更细的过程记录”。需求建议配置说明只保留最终结果与配置CSV_OUTPUTtrue简单适合小规模手工测试。保存更细的测量记录TEST_DATA_PERSISTENCECSV便于分析不同操作和时间段。多轮集中查询结果TEST_DATA_PERSISTENCEIoTDB或MySQL需要单独维护结果库和标识。只看终端或日志TEST_DATA_PERSISTENCENone仍建议额外归档完整日志和配置。配置中的账号和密码不应原样进入公开实验包。可以保存一份脱敏副本同时在受控位置保留实际运行配置。5. 用REMARK和打印间隔增强可追踪性REMARK会参与结果标识或表名构造适合放入简短、无特殊字符的运行标签REMARKiotdb200_session_write_r03 # 保留必要的进度和中间结果 IS_QUIET_MODEfalse LOG_PRINT_INTERVAL5 RESULT_PRINT_INTERVAL60中间结果不是最终结论但它能帮助建立时间线。例如第 180 秒开始 P99 上升而同一时刻某个节点磁盘写入等待升高就比“整轮平均值变差”更容易定位问题。设置打印间隔时也要控制日志量。过密的日志可能产生额外开销过疏则可能错过短时异常。最稳妥的做法是在正式对比前固定间隔并让所有候选对象使用相同配置。6. 配置、版本和环境要保存到什么粒度仅保存 Benchmark 配置还不够。一轮测试至少应记录下面这些信息类别必须记录推荐补充BenchmarkGit 提交或发布版本、DB_SWITCH、完整配置Java 版本、启动方式、客户端日志级别。数据库产品版本、提交或镜像摘要、关键服务端配置驱动版本、插件版本、后台任务状态。数据数据来源、设备数、测点数、类型、时间范围输入文件校验值、乱序比例与随机种子。硬件CPU、内存、磁盘类型与容量、机器数量NUMA、文件系统、挂载参数。部署单机或集群、节点角色、副本和分片设置容器限制、网络拓扑、访问入口。时间开始与结束时间、时区、预热与正式阶段各机器时钟同步状态。版本最好记录为不可变标识例如 Git commit、容器镜像 digest 或完整构建号而不是只写“最新版”。数据库配置也应保存本轮实际生效值不能只链接一份后来可能被修改的公共配置。7. 资源监控必须与运行时间对齐资源曲线只有和 Benchmark 时间线对齐后才有解释力。多机测试尤其要确认时区和系统时钟一致并保存以下关键时间点数据库启动或重启完成时间预热开始与结束时间正式运行开始与结束时间异常、超时或人工操作时间正确性验证开始与结束时间。监控系统数据库压测客户端监控系统数据库压测客户端开始采集预热负载正式运行开始响应、超时或错误记录中间结果正式运行结束正确性验证结束采集并归档时间窗口如果测试期间发生了清库、重启、扩容或参数修改必须记入时间线。这类操作不能只写在聊天记录里否则之后无法判断曲线变化来自系统还是人工干预。8. 怎样复盘一轮测试复盘不应从“吞吐量是多少”开始而应按证据门禁逐层推进。第一步确认实验身份检查运行编号、候选对象、配置摘要、开始结束时间和结果文件是否互相对应防止拿错轮次。第二步检查完整性与正确性确认进程是否正常结束成功与失败点数是否符合预期验证日志是否存在值或行数差异。正确性未通过时性能结果应标记为无效。第三步观察稳定阶段把预热、正式运行和收尾阶段分开。平均吞吐量不能掩盖正式阶段内部的持续下降、周期抖动或长尾恶化。第四步关联资源和事件将 P99、失败数与客户端 CPU、服务端 CPU、磁盘、网络、GC 和后台任务放在同一时间轴上。相关性可以帮助定位但仍不能直接当作因果结论。第五步与同配置多轮结果比较确认当前结果是否落在稳定范围。若只在某一轮异常应先解释环境和状态差异若多轮都出现相同变化才更接近可重复现象。9. 一份复盘摘要应该怎样写一个合格的README.md不需要很长但应包含以下内容# 运行摘要 - 运行编号待填 - 测试问题待填 - 被测对象与版本待填 - 唯一变量待填 - 正式运行窗口待填 - 正确性门禁通过 / 未通过 / 未执行 ## 主要结果 - 各操作成功点数、失败点数待填 - 吞吐量与 P99 的多轮范围待填 - 客户端与服务端资源峰值待填 ## 异常时间线 - 时间点—现象—相关日志—相关资源待填 ## 结论与边界 - 当前证据支持的结论待填 - 尚不能覆盖的场景待填 - 下一步复测条件待填“未执行”比空白更好因为它明确告诉读者哪一类证据缺失。若某项数据来自人工计算或二次汇总也应注明来源文件和计算口径。10. 四个常见误区第一只保存最好的一轮。异常轮次同样重要它能揭示稳定性和环境敏感性。第二测试结束后再凭记忆补配置。运行前就应复制实际配置并生成运行编号。第三把监控截图当原始数据。截图适合展示原始时间序列才适合复盘和重新计算。第四修改原始日志后不留痕迹。任何过滤、聚合和清洗都应生成新文件保留原始证据。系列文章第一篇数据库基准测试工具是什么第二篇从一次时序数据库写入测试开始第三篇如何模拟线上写入负载第四篇如何读懂测试结果波动第五篇什么是读写混合负载第六篇如何模拟线上读写混合负载第七篇怎样做一场公平的性能对比第八篇怎样找到并发与批大小的合理区间第九篇如何模拟乱序写入第十篇不同写入接口该怎样比较第十一篇性能测试与正确性验证有什么区别第十二篇单机测试与集群测试有什么不同第十三篇怎样保存和复盘一轮测试第十四篇一份可复用的基准测试方案模板

相关新闻

广东AI企业崛起:百亿市值背后的技术与商业逻辑

广东AI企业崛起:百亿市值背后的技术与商业逻辑

1. 广东资本市场新势力崛起:AI驱动下的"百亿市值俱乐部"扩容 去年这个时候,广东的百亿市值上市公司名单还只有87家。今天打开股票软件,这个数字已经变成了96家。作为长期跟踪区域经济发展的观察者,我注意到一个有趣的现…

2026/7/21 18:30:53 阅读更多 →
CefFlashBrowser:如何在2025年完美运行Flash内容与游戏存档?

CefFlashBrowser:如何在2025年完美运行Flash内容与游戏存档?

CefFlashBrowser:如何在2025年完美运行Flash内容与游戏存档? 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 当现代浏览器纷纷告别Flash时代,你是否还在…

2026/7/21 18:30:55 阅读更多 →
3分钟诊断修复:为什么你的老手柄在新游戏中失灵?

3分钟诊断修复:为什么你的老手柄在新游戏中失灵?

3分钟诊断修复:为什么你的老手柄在新游戏中失灵? 【免费下载链接】XOutput A small DirectInput to Xinput wrapper 项目地址: https://gitcode.com/gh_mirrors/xou/XOutput 当你满怀期待地连接珍藏多年的游戏手柄,准备在现代游戏中重…

2026/7/21 18:30:57 阅读更多 →

最新新闻

深度解析DINOv3蒸馏技术:从ViT-7B到轻量级模型的高效知识迁移

深度解析DINOv3蒸馏技术:从ViT-7B到轻量级模型的高效知识迁移

深度解析DINOv3蒸馏技术:从ViT-7B到轻量级模型的高效知识迁移 【免费下载链接】dinov3 Reference PyTorch implementation and models for DINOv3 项目地址: https://gitcode.com/GitHub_Trending/di/dinov3 在计算机视觉领域,模型规模与性能之间…

2026/7/22 1:34:24 阅读更多 →
Winhance中文版:基于C的Windows系统优化架构解析与实践指南

Winhance中文版:基于C的Windows系统优化架构解析与实践指南

Winhance中文版:基于C#的Windows系统优化架构解析与实践指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winha…

2026/7/22 1:34:24 阅读更多 →
100+专业图表模板:ML Visuals如何让机器学习论文图表创作变得简单?

100+专业图表模板:ML Visuals如何让机器学习论文图表创作变得简单?

100专业图表模板:ML Visuals如何让机器学习论文图表创作变得简单? 【免费下载链接】ml-visuals 🎨 ML Visuals contains figures and templates which you can reuse and customize to improve your scientific writing. 项目地址: https:/…

2026/7/22 1:34:24 阅读更多 →
从寄存器到Driverlib:TI C2000 CLB开发实战与映射解析

从寄存器到Driverlib:TI C2000 CLB开发实战与映射解析

1. 项目概述:从寄存器到Driverlib的桥梁搞嵌入式开发,特别是用TI的C2000系列做实时控制,寄存器操作是绕不开的基本功。但说实话,天天对着技术参考手册(TRM)查寄存器偏移地址、算位域掩码,时间长…

2026/7/22 1:34:24 阅读更多 →
Java Diff Utils:企业级文本差异计算与合并解决方案

Java Diff Utils:企业级文本差异计算与合并解决方案

Java Diff Utils:企业级文本差异计算与合并解决方案 【免费下载链接】java-diff-utils Diff Utils library is an OpenSource library for performing the comparison / diff operations between texts or some kind of data: computing diffs, applying patches, g…

2026/7/22 1:34:24 阅读更多 →
PHP容器化实践:定制Alpine基础镜像与安全优化

PHP容器化实践:定制Alpine基础镜像与安全优化

1. 项目概述:为什么需要定制PHP基础镜像?在容器化部署成为主流的今天,直接使用官方PHP镜像就像带着整个五金店去修水管——虽然什么工具都有,但大部分都用不上。生产环境需要的是精炼、安全、可复用的基础镜像,这也是我…

2026/7/22 1:33:23 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻