【问题标题】:HikariCP: migration from BoneCP and analyze benchmark dataHikariCP:从 BoneCP 迁移并分析基准数据
【发布时间】:2014-11-26 17:36:19
【问题描述】:

我正在测试从 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 骨骼 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 骨骼 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?
  • Score Error 列是什么意思?

这些主题中的任何提示、建议等或相关迁移到 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 骨 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 骨骼 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 次:

迭代 15:[com.zaxxer.hikari.benchmark.StatementBench.cycleStatement-jmh-worker-7] 信息 com.zaxxer.hikari.pool.HikariPool - HikariCP 池 HikariPool-0 正在关闭 下。 java.lang.IllegalStateException:尝试从包中移除一个没有借用或保留的对象 在 com.zaxxer.hikari.util.ConcurrentBag.remove(ConcurrentBag.java:207) 在 com.zaxxer.hikari.pool.HikariPool.closeConnection(HikariPool.java:394) 在 com.zaxxer.hikari.pool.HikariPool.releaseConnection(HikariPool.java:223) 在 com.zaxxer.hikari.proxy.ConnectionProxy.close(ConnectionProxy.java:216) 在 com.zaxxer.hikari.benchmark.StatementBench$ConnectionState.teardown(StatementBench.java:63) 在 com.zaxxer.hikari.benchmark.generated.StatementBench_cycleStatement.cycleStatement_Throughput(StatementBench_cycleStatement.java:100) 在 sun.reflect.GeneratedMethodAccessor1.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.openjdk.jmh.runner.LoopBenchmarkHandler$BenchmarkTask.call(LoopBenchmarkHandler.java:204) 在 org.openjdk.jmh.runner.LoopBenchmarkHandler$BenchmarkTask.call(LoopBenchmarkHandler.java:186) 在 java.util.concurrent.FutureTask.run(FutureTask.java:262) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 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,感谢您的支持和良好的态度。

【问题讨论】:

  • 虚拟机是否可以使用所有 8 个内核?
  • @brettw 再次感谢。当我执行 more /proc/cpuinfo 时,我得到 processor : 0processor : 1 的数据,所以我的答案是否定的,这个 VM实例有 2 个核心。
  • more I read 关于使用 JMH 之类的低级基准测试工具对 VMWare 实例进行基准测试,我对结果越怀疑。低级基准测试很好,我建议在真实硬件上运行它来满足自己。但现实生活中的性能通常有很大不同,因此如果您有办法使用负载测试工具对应用程序 (req/s) 进行基准测试,那么考虑到虚拟化环境可能会更好。

标签: jdbc benchmarking connection-pooling vmware hikaricp


【解决方案1】:

这里是 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 核 I get HikariCP scores 上为 23130.760,骨骼得分为 10378.450,而在 E5-2690 上为 965.017 和 1528.097?

我想知道(并研究)VMWare Hypervisor 节流之类的东西是否正在发挥作用。我承认我远非 VM Hypervisor 专家。在基准测试中,HikariCP 肯定会惩罚你的 CPU。

更新 2:
回复下面的评论。这个问题本身不是虚拟化。虚拟化很棒,而且会一直存在。问题基本上归结为在虚拟化硬件上运行 micro 基准测试是否准确或有意义。

我认为,一般而言,在真实硬件上进行更高基准测试的库可能也会在虚拟化硬件上表现更好——即使不能使用相同的工具在那里测量它。这就是为什么上面我建议针对预期的应用程序运行一个-基准测试工具,例如JMeter。尝试使用库 A (HikariCP) 和库 B (BoneCP)。这适用于任何两个库。

总而言之,运行 micro-benchmark 工具(利用硬件计数器等)很可能会在虚拟化硬件上产生奇怪的结果。这可能是在 VMWare 论坛上提出的一个很好的话题。

关于使用哪个库,要么运行 JMeter 或类似的宏基准测试工具,要么掷硬币。

【讨论】:

  • 我用新的数据和结果扩展了主帖。如果你愿意,你可以检查它们。非常感谢。
  • 再次感谢您的回答。我反复反对虚拟化,可悲的是,虚拟部署不会改变。因此,即使有这些 cycleConnection 结果并考虑到 cycleStatement 结果比 BoneCP 好一倍,您是否推荐迁移?我可以进行另一种测试吗?非常感谢
  • 感谢您的回答。有时间我会试试 JMeter。非常感谢!
  • 另一个问题:使用 JProfiler 之类的分析器进行测试怎么样?如果我使用 HikariCP 而不是 BoneCP 获得更好的绝对 CPU 百分比,您是否推荐迁移?再次感谢
猜你喜欢
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多