gpt4 book ai didi

java - 为什么 JVM 性能会随着负载的增加而提高?

转载 作者:行者123 更新时间:2023-11-30 05:27:44 27 4
gpt4 key购买 nike

我们发现,当负载较轻时,JVM 的性能会下降。特别是在测试环境中的多次运行中,我们注意到,当注入(inject)系统的订单消息速率降低时,延迟会恶化约 100%。下面是有关该问题的一些背景信息,如果有任何帮助,我将不胜感激。

简单地说,正在研究的演示 Java 交易应用程序可以被认为有 3 个重要的线程:订单接收线程,处理器线程,交换发送器线程

订单接收线程接收订单并将其放在处理器 q 上。处理器线程从处理器 q 中获取它,进行一些基本处理并将其放在交换器 q 上。交易所发送器线程从交易所 q 获取订单并将订单发送到交易所。

当注入(inject)系统的订单率从较高数量变为较低数量时,从订单接收到订单发送到交易所的延迟会恶化 100%。

尝试的解决方案:

  1. 通过发送高消息速率并在降低消息速率之前启动系统来预热 JVM 中的关键代码路径:没有解决问题

  2. 分析应用程序:使用分析器可以显示代码中的热点,通过改进实现可以实现 10 -15% 的改进。但是仅仅通过提高消息率就可以达到 100% 的改善。

有人对此有任何见解/建议吗?是否与线程上的调度抖动有关。

是否是在低消息速率下线程被从核心切换出来?

下面有 2 篇我认为可能相关的帖子。然而我们的症状有点不同:

is the jvm faster under load?

Why does the JVM require warmup?

最佳答案

低/中负载的一致延迟需要对 Linux 进行特定调整。

以下是我的旧检查列表中的一些要点,这些要点与具有毫秒延迟要求的组件相关。

  • 将 CPU 核心配置为始终运行和最大频率(here 是 RedHat 的文档)
  • 为关键应用程序线程配置专用 CPU 内核
    • 使用 isolcpus 从调度程序中排除专用内核
    • 使用taskset将关键线程绑定(bind)到特定核心
  • 将您的服务配置为在单个 NUMA 节点中运行(使用 numactl)

Linux 调度程序和功率采样是造成低/中低延迟下高差异的关键因素。

默认情况下,CPU 核心在不活动时会降低频率,因此您的下一个请求在降频后的核心上处理速度会变慢。

CPU 缓存是关键的性能 Assets ,如果您的关键线程被调度在不同的内核上,它将丢失其缓存数据。此外,同一核心的其他线程调度将逐出缓存,这也会增加关键代码的延迟。

在重负载下,这些因素不太重要(频率达到最大,线程大约 100% 忙碌,倾向于坚持特定的核心)。

尽管在低/中负载下,这些因素会对平均延迟和高百分位数产生负面影响(与重负载情况相比,99 个百分位数可能要差几个数量级)。

对于高吞吐量应用程序(超过 100k 请求/秒),高级线程间通信方法(例如 LMAX disruptor )也很有用。

关于java - 为什么 JVM 性能会随着负载的增加而提高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58212003/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com