口水表演 [英] Drools performance
本文介绍了口水表演的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个关于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
RulesBenchmark.send thrpt 5 775498.081 ± 72237.890 ops/s
这篇关于口水表演的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文