java - 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>
解决方案
您可以尝试减少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
应该会有所帮助。
让我知道它是否有效。
雅科夫
推荐阅读
- javascript - 什么是 gatsbyContentfulFluid?
- java - 如何在 mvn clean install 期间停止配置组件类 bean 函数以执行?
- django - 如何在 vue.js 和 django rest 框架中访问经过身份验证的登录用户
- html - 如何将图像放在文本旁边因为我想将图像放在一些文本旁边
- flutter - Open flutter screen from Native Method call
- python-asyncio - 如何在 Python 中将基于回调的库与 asyncio 库结合起来?
- typescript - 如何在 atom 中正确显示 emacs 编辑的文件?
- reactjs - Jest 使用 create-react-app 手动模拟:如何在测试中使用模拟值
- javascript - 如何在特定 laravel 刀片视图上扩展 vuejs 应用程序实例
- javascript - jQuery从包含的脚本中最近的按钮数据标签中获取