如何解决流口水的表现
我对不同机器上 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)
如您所见,在家庭环境中 Java 进程使用了整个时间的 95%,但在服务器上仅使用了 65%。时差也很明显:
RulesBenchmark.send thrpt 5 1612318.098 ± 64712.672 ops/s
RulesBenchmark.send thrpt 5 775498.081 ± 72237.890 ops/s
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。