一、问题背景
默认的 BenchmarkSQL 压测输出有一个很大的短板:控制台不会实时刷新性能数据。
原生版本只会间隔很久打印一次汇总数据,无法看到每秒瞬时吞吐量、性能波动、抖动、锁超时阶段性能下跌。
在 TPCC 压测、并发调优、锁冲突排查、参数调优场景中非常鸡肋:
- 看不到实时 TPM/TPS 变化
- 压测卡住、锁等待、事务阻塞时无法定位问题阶段
- 只能等测试结束才能看结果,调测效率极低
二、优化效果
修改源码重新编译后,可实现: - 每秒自动打印一次压测性能数据
- 输出:当前时间、平均 TPM、瞬时 TPM、JVM 内存占用
- 全程可视化观察性能波动、抖动、阻塞、锁超时下跌
- 无需等待压测结束,实时判断压测稳定性
三、修改原理
原生 updateStatusLine 为低频刷新,本次修改强制 1000ms 秒级刷新,同时手动计算瞬时吞吐量、平均吞吐量、内存使用率,替换原生覆盖式输出为换行日志,全程保留压测记录。
四、完整修改步骤
- 进入源码目录
解压 BenchmarkSQL 安装包,进入核心客户端源码路径:
cd benchmarksql-5.0/src/client 编辑 jTPCC.java 核心文件
synchronized private void updateStatusLine() { long currTimeMillis = System.currentTimeMillis(); if(currTimeMillis > sessionNextTimestamp) { StringBuilder informativeText = new StringBuilder(""); Formatter fmt = new Formatter(informativeText); double tpmC = (6000000*fastNewOrderCounter/(currTimeMillis - sessionStartTimestamp))/100.0; double tpmTotal = (6000000*transactionCount/(currTimeMillis - sessionStartTimestamp))/100.0; sessionNextTimestamp += 1000; /* update this every seconds */ fmt.format("%s: Term-00, Running Average tpmTOTAL: %.2f", getCurrentTime(), tpmTotal); /* XXX What is the meaning of these numbers? */ recentTpmC = (fastNewOrderCounter - sessionNextKounter) * 12; recentTpmTotal= (transactionCount-sessionNextKounter)*12; sessionNextKounter = fastNewOrderCounter; fmt.format(" Current tpmTOTAL: %d", recentTpmTotal); long freeMem = Runtime.getRuntime().freeMemory() / (1024*1024); long totalMem = Runtime.getRuntime().totalMemory() / (1024*1024); fmt.format(" Memory Usage: %dMB / %dMB ", (totalMem - freeMem), totalMem); System.out.print(informativeText); System.out.print(" "); //for (int count = 0; count < 1+informativeText.length(); count++) //System.out.print(""); } } }- Ant 重新编译项目
返回 BenchmarkSQL 根目录,执行编译:ant
编译成功后会自动覆盖 run 目录下的 class 字节码文件,无需手动替换。 - 重新运行压测即可生效
再次执行压测脚本,控制台将每秒刷新一次性能数据。
快速答案:修改 BenchmarkSQL 源码可让控制台每秒实时刷新 TPS/TPM,4 步完成:改代码 → ant 编译 → 替换 class → 重跑压测,详见下文。
常见问题(FAQ)
BenchmarkSQL 默认多久刷新一次性能数据?
原生版本间隔很久才打印一次汇总数据,无法看到每秒瞬时吞吐量。本文修改后可实现每秒刷新 TPS/TPM。
修改源码后需要重新编译吗?
需要。修改 Java 源码后在项目根目录执行 ant 重新编译,编译成功后会自动覆盖 run 目录下的 class 文件。
实时日志会影响压测性能吗?
每秒打印一次日志对性能影响极小,可忽略。建议压测时将控制台输出重定向到文件,方便后续分析。
TPS 和 TPM 分别是什么?
TPS(Transactions Per Second)是每秒事务数,TPM(Transactions Per Minute)是每分钟事务数,两者都是衡量数据库吞吐能力的核心指标。
\n
评论