我正在测试从BoneCP到HikariCP的迁移.
基准(HikariCP Benchmark)的结果如下:
Benchmark (maxPoolSize) (pool) Mode Samples Score Score error Units c.z.h.b.ConnectionBench.cycleCnnection 32 hikari thrpt 16 1033,071 38,893 ops/ms c.z.h.b.ConnectionBench.cycleCnnection 32 bone thrpt 16 1648,954 42,610 ops/ms c.z.h.b.ConnectionBench.cycleCnnection 32 tomcat thrpt 16 592,838 21,709 ops/ms c.z.h.b.ConnectionBench.cycleCnnection 32 c3p0 thrpt 16 125,857 3,666 ops/ms c.z.h.b.ConnectionBench.cycleCnnection 32 vibur thrpt 16 831,693 9,299 ops/ms c.z.h.b.StatementBench.cycleStatement 32 hikari thrpt 16 49983,959 4796,385 ops/ms c.z.h.b.StatementBench.cycleStatement 32 bone thrpt 8 7022,146 526,111 ops/ms c.z.h.b.StatementBench.cycleStatement 32 tomcat thrpt 16 28777,731 1011,316 ops/ms c.z.h.b.StatementBench.cycleStatement 32 c3p0 thrpt 16 3367,641 137,937 ops/ms c.z.h.b.StatementBench.cycleStatement 32 vibur thrpt 16 1739,060 45,451 ops/ms
我认为分数越高越好,所以:
为什么HikariCP中的cycleConnection比BoneCP低?
考虑到cycleConnection结果,cycleStatement结果是否足以更好地迁移到HikariCP?
分数错误列的含义是什么?
这些主题中的任何提示,建议等或相关的HikariCP迁移对我都非常有帮助.
非常感谢
第一次更新:
@brettw,谢谢你的建议,并祝贺你的出色工作.
我昨晚用nohup ./benchmark.sh做了一个完整的运行&得到了这些结果:
Benchmark (maxPoolSize) (pool) Mode Samples Score Score error Units c.z.h.b.ConnectionBench.cycleCnnection 32 hikari thrpt 150 965,017 27,307 ops/ms c.z.h.b.ConnectionBench.cycleCnnection 32 bone thrpt 150 1528,097 26,963 ops/ms c.z.h.b.ConnectionBench.cycleCnnection 32 tomcat thrpt 150 473,702 8,068 ops/ms c.z.h.b.ConnectionBench.cycleCnnection 32 c3p0 thrpt 150 108,527 1,591 ops/ms c.z.h.b.ConnectionBench.cycleCnnection 32 vibur thrpt 150 740,603 14,556 ops/ms c.z.h.b.StatementBench.cycleStatement 32 hikari thrpt 60 47998,292 3112,217 ops/ms c.z.h.b.StatementBench.cycleStatement 32 bone thrpt 120 6210,647 110,100 ops/ms c.z.h.b.StatementBench.cycleStatement 32 tomcat thrpt 150 25919,389 437,232 ops/ms c.z.h.b.StatementBench.cycleStatement 32 c3p0 thrpt 150 3074,133 62,629 ops/ms c.z.h.b.StatementBench.cycleStatement 32 vibur thrpt 150 1517,554 25,027 ops/ms
查看扩展输出,我在日志中看到这个异常堆栈跟踪6次:
Iteration 15: [com.zaxxer.hikari.benchmark.StatementBench.cycleStatement-jmh-worker-7] INFO com.zaxxer.hikari.pool.HikariPool - HikariCP pool HikariPool-0 is shutting down. java.lang.IllegalStateException: Attempt to remove an object from the bag that was not borrowed or reserved at com.zaxxer.hikari.util.ConcurrentBag.remove(ConcurrentBag.java:207) at com.zaxxer.hikari.pool.HikariPool.closeConnection(HikariPool.java:394) at com.zaxxer.hikari.pool.HikariPool.releaseConnection(HikariPool.java:223) at com.zaxxer.hikari.proxy.ConnectionProxy.close(ConnectionProxy.java:216) at com.zaxxer.hikari.benchmark.StatementBench$ConnectionState.teardown(StatementBench.java:63) at com.zaxxer.hikari.benchmark.generated.StatementBench_cycleStatement.cycleStatement_Throughput(StatementBench_cycleStatement.java:100) at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.openjdk.jmh.runner.LoopBenchmarkHandler$BenchmarkTask.call(LoopBenchmarkHandler.java:204) at org.openjdk.jmh.runner.LoopBenchmarkHandler$BenchmarkTask.call(LoopBenchmarkHandler.java:186) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)
最后,我回答你帖子中的其他主题:
pom.xml已更新为快速和完整执行.
干净启动后无法执行测试.
有一个带有Web应用程序的Tomcat服务器.在测试执行期间,计算机既没有高负载也没有运行繁重的过程.
JDK版本是jdk1.7.0_67
Linux是x86_64-redhat-linux-gnu
CPU型号是Intel(R)Xeon(R)CPU E5-2690 0 @ 2.90GHz
也许是一个重要问题:测试已经在虚拟机中运行,并与VMWare一起部署.
再次感谢
第二次更新:关于迁移的问题已经变为另一个关于虚拟化和基准测试的问题,这也是有趣且有用的.
到现在为止,我必须关注虚拟环境.当我有一点时间的时候,我将在真实和直接的环境中运行测试,我将把结果带到这里.我打赌这些测试会将HikariCP显示为最佳连接池.
@brettw,谢谢你的支持和你的态度.
HikariCP的作者之一.几件事要检查.首先,看起来你使用了基准测试的"快速"模式,我们通常用它来快速"冒烟测试"变化.我建议全程运行.上面的结果看起来有点奇怪,至少在cycleStatement测试中,因为所有池应该显示16(在快速模式下)样本,但BoneCP只显示8.完整运行需要相当多的时间,但如果你只想比较两个池,你可以缩短时间,如下:
./benchmark.sh -p pool=hikari,bone
其次,编辑基准测试的pom.xml文件,并确保它使用最新的HikariCP版本.它现在应该是2.2.5版本(非SNAPSHOT),但是已提交的pom.xml看起来仍然具有2.1.1-SNAPSHOT.
"分数误差"是样本中的一种标准偏差,如果消耗CPU的盒子上有其他进程,它往往会爬得更高.我建议在干净启动后运行基准测试,在系统"安定"一两分钟之后,并确保在测试期间无法运行无关的进程(浏览器等).
我们会对您的跑步的最新结果感兴趣,因为我们尚未看到HikariCP得分低于任何游泳池.你能告诉我们你在运行什么环境吗?CPU类型/核心,操作系统,Java版本,以及它是否是虚拟机.谢谢.
更新:
如何让8核E5-2690的分数如此之低?在我的桌面上i7 Haswell 4核心我得到的HikariCP分数为23130.760,骨骼得分为10378.450,而E5-2690则为965.017和1528.097?
我想知道(并研究)VMWare Hypervisor限制之类的东西是否正在发挥作用.我承认我远不是VM Hypervisor的专家.在基准测试中,HikariCP肯定会惩罚你的CPU.
更新2:
回复以下评论.这个问题本身不是虚拟化.虚拟化是伟大的,并留在这里.问题主要归结为在虚拟化硬件上运行微基准测试是准确还是有意义.
我认为,一般来说,一个在真实硬件上具有较高基准的库也可能在虚拟化硬件上表现更好 - 即使相同的工具不能用于测量它.这就是为什么我上面建议针对预期的应用程序运行宏基准测试工具,例如JMeter.尝试使用库A(HikariCP)和库B(BoneCP).这适用于任何两个库.
总之,运行利用硬件计数器等功能的微基准线束很可能会在虚拟化硬件上产生奇怪的结果.这可能是在VMWare论坛中提出的一个很好的主题.
关于使用哪个库,可以运行JMeter或类似的宏基准测试工具,也可以翻转硬币.