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

 吕骥源_342 发布于 2022-12-09 15:12

我正在测试从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 个回答
  • 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或类似的宏基准测试工具,也可以翻转硬币.

    2022-12-11 02:07 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有