HikariCP:从BoneCP迁移并分析基准数据

时间:2014-11-26 17:36:19

标签: jdbc benchmarking connection-pooling vmware hikaricp

我正在测试从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,谢谢你的支持和你的态度。

1 个答案:

答案 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或类似的宏基准测试工具,也可以翻转硬币。