一、问题背景
默认的 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("\n"); //for (int count = 0; count < 1+informativeText.length(); count++) //System.out.print("\b"); } } }- Ant 重新编译项目
返回 BenchmarkSQL 根目录,执行编译:ant
编译成功后会自动覆盖 run 目录下的 class 字节码文件,无需手动替换。 - 重新运行压测即可生效
再次执行压测脚本,控制台将每秒刷新一次性能数据。
评论