流口水的表现

如何解决流口水的表现

我对不同机器上 Drools 的性能有疑问。 我做了非常简单的 JMH 基准测试:

package ge.magticom.rules.benchmark;
import ge.magticom.rules.benchmark.Subscriber
rule "bali.free.smsparty"
    activation-group "main"
    salience 4492
    when
        $subs:Subscriber(chargingProfileID == 2)

    then
    $subs.setResult(15);
end

rule "bali.free.smsparty5"
    activation-group "main"
    salience 4492
    when
        $subs:Subscriber(chargingProfileID == 3)

    then
    $subs.setResult(14);
end
    @Benchmark
    public Subscriber send() throws Exception {
        Subscriber subscriber = new Subscriber();
        subscriber.setChargingProfileID(5);
        StatelessKieSession session = ruleBase.newStatelessKieSession();
        ArrayList<Object> objs = new ArrayList<Object>();
        objs.add(subscriber);
        session.execute(objs);
        return subscriber;
    }

在家用开发机器上 名称=“Ubuntu” VERSION="20.04.2 LTS(焦点窝)"

(Intel(R) Core(TM) i7-8700 cpu @ 3.20GHz 12 Threads) 64 GB 内存,JDK 11,性能非常好: 有 7 个线程,每秒有近 2M 的操作(无状态)

Benchmark             Mode  Cnt        score        Error  Units
RulesBenchmark.send  thrpt    5  2154292.750 ± 149405.498  ops/s

但是在预生产服务器上是 Intel(R) Xeon(R) Gold 6258R cpu @ 2.70GHz,112 个线程和 1 TB RAM 我只有一半的性能(甚至增加线程) NAME="Oracle Linux 服务器" VERSION="8.4"

Benchmark             Mode  Cnt        score        Error  Units
RulesBenchmark.send  thrpt    5  1084939.195 ± 107897.663  ops/s

我正在尝试使用 java 11 和 Drolls 7.54.0.Final 测试我们的计费系统。 我们的系统基于 Jrockit realtime 1.6 和 drools 4.0.3 版。我们正在将系统从 Sun Solaris SPARK 迁移到 Intel 基础系统。

在 Jrockit 1.6 上运行相同的规则我在家庭和预生产环境中遇到了甚至值得的性能问题: 家庭测试基准:

Benchmark             Mode  Cnt       score      Error  Units
RulesBenchmark.send  thrpt   20  692054.563 ± 3507.519  ops/s

试生产基准:

Benchmark                   Mode  Cnt        score       Error  Units
RulesBenchmark.send        thrpt   20   382283.288 ±  6405.953  ops/s

如您所见,非常简单的规则几乎是性能的一半。

但是对于真正的规则,比如我们的在线收费系统,它的性能甚至很差:

我得到的家庭环境

Benchmark                     Mode  Cnt    score    Error  Units
WorkerBenchmark.send         thrpt    5  152.846 ± 87.076  ops/s

这意味着 1 条消息包含近 100 次迭代 所以在 00:01:49 基准测试处理了 16287 个会话和 430590 个规则调用事件。单个规则调用平均约为 2.33 毫秒,这不是很大,但没有预生产那么糟糕

在预生产服务器上

Benchmark                     Mode  Cnt   score   Error  Units
WorkerBenchmark.send         thrpt    5  35.013 ± 9.565  ops/s

在 00:01:54 我只有 3723 个会话,其中包含全部 98571 个规则调用事件。每次调用平均为 10.7299 msc。

在运行所有这些基准测试期间,预生产系统上没有运行任何东西。但是在家庭环境中有很多开发工具,正在运行来自 Intellij IDEA 的测试

您能否提出任何可能导致性能差异的建议。我尝试了不同的 Java 版本和供应商。这些结果基于 oracle-jdk-11.0.8。

以下是 Preproduction 服务器的内核参数:


 fs.file-max = 6815744
 kernel.sem = 2250 32000 100 128
 kernel.shmmni = 4096
 kernel.shmall = 1073741824
 kernel.shmmax = 4398046511104
 net.core.rmem_default = 262144
 net.core.rmem_max = 4194304
 net.core.wmem_default = 262144
 net.core.wmem_max = 1048576
 net.ipv4.conf.all.rp_filter = 2
 net.ipv4.conf.default.rp_filter = 2
 fs.aio-max-nr = 1048576
 net.ipv4.ip_local_port_range = 9000 65500

解决方法

这只是一个非常疯狂的猜测,因为我确实没有足够的信息,但是使用相同垃圾收集器的 2 个环境是否以相同的方式配置?也许您在一侧使用 ParallelGC(根据我的经验,在您测量时,它更适合纯吞吐量)而另一侧使用 G1?

,

感谢回答。

我使用了几个 GC 配置,没有一个是 ParallelGC。我认为GC不是问题。我在最终测试中使用了 ZGC,GC 暂停时间不超过 5 msc(也用 java 16 测试,暂停时间低于 100 微秒)。 :

@Fork(value = 2,jvmArgs = {"--illegal-access=permit","-Xms10G","-XX:+UnlockDiagnosticVMOptions","-XX:+DebugNonSafepoints","-Xmx10G","-XX:+UnlockExperimentalVMOptions","-XX:ConcGCThreads=5","-XX:ParallelGCThreads=10","-XX:+UseZGC","-XX:+UsePerfData","-XX:MaxMetaspaceSize=10G","-XX:MetaspaceSize=256M"}

java -version

    java version "11.0.8" 2020-07-14 LTS
    Java(TM) SE Runtime Environment 18.9 (build 11.0.8+10-LTS)
    Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.8+10-LTS,mixed mode)

这是用 AsyncProfilers 生成的火焰图 FlameGraph from home PC

This is from server

如您所见,在家庭环境中 Java 进程使用了​​整个时间的 95%,但在服务器上仅使用了 65%。时差也很明显:

RulesBenchmark.send                       thrpt    5  1612318.098 ± 64712.672   ops/s

Home Result FlameGraph.html

RulesBenchmark.send                       thrpt    5  775498.081 ± 72237.890   ops/s

Server Flame Graph.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?