我们正在运行一个 2-client-3-server 集群。即使我们提供更多堆,我们也会不断看到 OOM。下面是堆转储快照,知道为什么我们看到这么多 CacheEvent 对象吗,这里到底发生了什么?
查看“GridSelectorNioSessionImpl”的源代码,似乎它有一个无限队列正在累积 WriteRequests。知道为什么这些不被冲洗吗?我正在阅读有关设置 messageQueue 的信息,即使是 ignite 日志也会警告它可能会导致 OOM,因为它是无界的。但我无法将该设置与“GridSelectorNioSessionImpl”中发生的队列初始化相关联。
TIA
GridContinuousMessage
来自需要通知侦听器更新的连续查询。
看起来队列由于负载过重而变得太大,消息上下文 [dataBytes] 也很大。
我认为您可以使用以下属性:
/** Maximum size of buffer for pending events. Default value is {@code 10_000}. */
public static final int MAX_PENDING_BUFF_SIZE =
IgniteSystemProperties.getInteger("IGNITE_CONTINUOUS_QUERY_PENDING_BUFF_SIZE", 10_000);
/** Batch buffer size. */
private static final int BUF_SIZE =
IgniteSystemProperties.getInteger("IGNITE_CONTINUOUS_QUERY_SERVER_BUFFER_SIZE", 1000);
最有趣的是IGNITE_CONTINUOUS_QUERY_SERVER_BUFFER_SIZE。
在内部,连续查询将更新存储在缓冲区中,每个分区一个缓冲区。缓冲区被最多 1000 个事件填满,并在满时重新创建。 IE。每个分区可能有 1000 个活动对象。一个节点可能有最多 1024 个分区(默认值),在这种情况下,存储的事件总数最多可达 100 万。现在将其乘以对象的大小(100+ KB)并检查结果。
很可能将 IGNITE_CONTINUOUS_QUERY_SERVER_BUFFER_SIZE 设置为 100 或 50 将解决问题。