口水表演 [英] Drools performance

查看:12
本文介绍了口水表演的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个关于Drool在不同机器上的性能的问题。 我做了一个非常简单的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;Ubuntu 版本=20.04.2 LTS(焦点Fossa)

(英特尔(R)酷睿(TM)i7-8700 CPU@3.20 GHz 12线程)采用JDK 11的64 GB内存,具有非常出色的性能: 在7个线程的情况下,每秒有近2M次操作(无状态)

Benchmark             Mode  Cnt        Score        Error  Units
RulesBenchmark.send  thrpt    5  2154292.750 ± 149405.498  ops/s
但在试生产服务器上,它是英特尔(R)至强(R)Gold 6258R CPU@2.70 GHz,具有112个线程和1 TB RAM,我的性能只有一半(甚至增加了线程) 名称=Oracle Linux服务器 版本=8.4

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

我正在尝试使用Java 11和Drolls 7.54.0测试我们的计费系统。 我们的系统基于Jrockit Realtime 1.6和Drools版本4.0.3。我们正在将系统从Sun Solaris Spark移至基于Intel的系统。

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

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 Benchmark处理了16287个会话和430590个规则调用事件。单次规则调用平均约为2.33毫秒,虽然不是很大,但也没有试生产时那么差

在试生产服务器上

Benchmark                     Mode  Cnt   Score   Error  Units
WorkerBenchmark.send         thrpt    5  35.013 ± 9.565  ops/s
在00:01:54中,我只得到了3,723个会话,总共包含98571个规则调用事件。每次呼叫平均为10.7299毫秒。

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

你能提出什么建议吗,这可能会导致表现上的如此大的差异。我尝试了不同的Java版本和供应商。这些结果基于Oracle-jdk-11.0.8。

以下是试生产服务器的内核参数:


 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

推荐答案

感谢您的答复。

我使用了几种GC配置,没有一种是并行GC。我认为GC不是问题。我在最终测试中使用了ZGC,GC的暂停时间不超过5毫秒(也使用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-版本

    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生成的火焰图表

如您所见,在家庭环境中,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

这篇关于口水表演的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆