我正在测试从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迁移对我都非常有帮助。
非常感谢
第一次更新:
@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)
最后,我回答你帖子中的其他主题:
再次感谢
第二次更新: 关于迁移的问题已经变成另一个关于虚拟化和基准测试的问题,这也是有趣且有用的。
到现在为止,我必须专注于虚拟环境。当我有一点时间时,我将在真实和直接的环境中运行测试,并且我将把结果带到这里。 我敢打赌,这些测试会将HikariCP显示为最佳连接池。
@brettw,谢谢你的支持和你的态度。
答案 0 :(得分:5)
HikariCP的作者之一。几件事要检查。首先,看起来你使用了" quick"基准模式,我们通常用于"抽烟测试"变化很快。我建议全程运行。上面的结果看起来有点奇怪,至少在 cycleStatement 测试中,因为所有池都应显示 16 (在快速模式下)样本,但BoneCP仅显示 8 。完整运行需要相当多的时间,但如果你只是想比较两个池,你可以缩短时间,如下:
./benchmark.sh -p pool=hikari,bone
其次,编辑基准测试的 pom.xml 文件,并确保它使用最新的HikariCP版本。它现在应该是2.2.5版(非SNAPSHOT),但是提交的pom.xml看起来仍然有2.1.1-SNAPSHOT。
"得分错误"如果样本中有其他进程消耗CPU,则样本中的标准偏差是一种标准偏差。我建议在干净启动后运行基准测试,在系统完成后#34;已确定"一两分钟,并确保在测试期间无法运行无关的进程(浏览器等)。
我们会对您的跑步的最新结果感兴趣,因为我们尚未看到HikariCP得分低于任何游泳池。你能告诉我们你在运行什么环境吗? CPU类型/核心,操作系统,Java版本,以及它是否是虚拟机。感谢。
<强>更新强>
如何让8核E5-2690的分数如此之低?在我的桌面上i7 Haswell 4核I get HikariCP scores为23130.760,骨骼得分为10378.450,对比E5-2690为965.017和1528.097?
我想知道(并研究)VMWare Hypervisor限制之类的东西是否正在发挥作用。我承认我远不是VM Hypervisor的专家。在基准测试中,HikariCP肯定会惩罚你的CPU。
<强> UPDATE2:强>
回复以下评论。这个问题本身并不是虚拟化。虚拟化是伟大的,并留在这里。问题主要归结为在虚拟化硬件上运行 micro - 基准测试是准确还是有意义。
我认为,一般来说,在真实硬件上更高的基准库也可能在虚拟化硬件上表现更好 - 即使相同的工具不能用于测量它。这就是为什么我上面建议对目标应用程序运行 宏 -benchmarking工具,例如JMeter。尝试使用库A(HikariCP)和库B(BoneCP)。这适用于任何两个库。
总之,运行 micro -benchmark线束利用硬件计数器等功能很可能会在虚拟化硬件上产生奇怪的结果。这可能是在VMWare论坛中提出的一个很好的主题。
关于使用哪个库,可以运行JMeter或类似的宏基准测试工具,也可以翻转硬币。