首页 > 解决方案 > Ignite 服务器节点出现 OOM,在 ConcurrentMap、TcpCommunicationSpi#recoveryDescs 中有大量积累

问题描述

在我们的规模测试设置中运行时,我们注意到 ignite 服务器节点在运行几天后进入 OOM。

在查看堆转储时,我注意到 ConcurrentMap、org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi#recoveryDescs在映射的多个条目中积累了大量消息(“未确认消息”每个 Java 文档),即下面的 ArrayDeque 似乎有很多org.apache.ignite.internal.util.nio.GridNioRecoveryDescriptor.msgReqs

在此处输入图像描述

知道什么可能导致这种“泄漏”发生吗?

我们确实在日志中也看到了长事务、锁等问题。但是让我担心的是,不管有几个客户端节点行为不端,我怀疑这里的情况仍然不会导致服务器节点出现 OOM。

关于如何避免/解决这个问题,有人对此有任何线索、建议或意见吗?基本上,即使一个或多个客户端行为不端,我也想防止服务器节点因 OOM 而崩溃。

例如,为 slowClientQueueLimit 设置一个较低的值会有帮助吗?目前我已将其设置为 1023,它比设置为 1024 的 messageQueueLimit 的值小一。

在这个特定的设置中,我们只有一个服务器节点和大约 25 个奇怪的客户端节点,它们都在 docker swarm 覆盖网络中运行(其中一些会更新事务中的大量缓存,基本上是打开 trx,获取锁在某些键上,然后在关闭 trx 之前通过 jcache api 更新几个缓存,我怀疑这种键的锁定是一个问题,但这是一个单独的问题,我将在另一个问题中提出)。

我们正在运行 2.4 版并使用 Spring 集成(计划很快升级)。

谢谢穆图

更新(10/16/18):下面是所有节点上的 TcpCommunicationSpi 设置,

             <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi">
                 <!-- Override message queue limit for incoming and outgoing messages -->
                 <property name="messageQueueLimit" value="1024"/>
                 <property name="sharedMemoryPort" value = "-1" />
                 <property name="slowClientQueueLimit" value="1023"/>
                 <property name="idleConnectionTimeout" value="3600000"/>
             </bean>

标签: javaignitegridgain

解决方案


您可以尝试减少org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi#setAckSendThreshold. 默认值为 32。让我们为拓扑中的所有节点(服务器和客户端)尝试 8 或更少。

说明如下。

为了确保通信消息的传递,Ignite 为org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi#setAckSendThreshold收到的每条消息发送确认。如果 Ignite 节点没有收到org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi#setUnacknowledgedMessagesBufferSize通信消息的确认,它会关闭连接并在重新建立连接后重新发送所有未确认的消息。

从我所看到的(假设 TcpCommunicationSpi 的所有设置都保留默认值)我会假设如果您使用计算(即用于传输的 Ignite 消息),您的缓存键和值或作业数据非常大,可能是数十或数百兆。因此,减少org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi#setAckSendThreshold应该会有所帮助。

让我知道它是否有效。

雅科夫


推荐阅读