Apache Ignite 使用太多 RAM

Apache Ignite use too much RAM

我曾尝试使用 Ignite 来存储事件,但在插入新数据时遇到内存占用过多的问题 我正在运行具有 1GB 堆和默认配置的点燃节点

curs.execute("""CREATE TABLE trololo (id LONG PRIMARY KEY, user_id LONG, event_type INT, timestamp TIMESTAMP) WITH "template=replicated" """);

n = 10000
for i in range(200):
    values = []
    for j in range(n):
    id_ = i * n + j
    event_type = random.randint(1, 5)
    user_id = random.randint(1000, 5000)
    timestamp = datetime.datetime.utcnow() - timedelta(hours=random.randint(1, 100))
    values.append("({id}, {user_id},  {event_type}, '{timestamp}')".format(
        id=id_, user_id=user_id, event_type=event_type, uid=uid, timestamp=timestamp.strftime('%Y-%m-%dT%H:%M:%S-00:00')
    ))
    query = "INSERT INTO trololo (id, user_id, event_type, TIMESTAMP) VALUES %s;" % ",".join(values)

    curs.execute(query)

但是在加载大约 10^6 个事件后,我得到了 100% CPU 使用率,因为所有堆都已占用并且 GC 试图清理一些 space(未成功)

然后我停止了大约 10 分钟,然后 GC 成功清理了一些 space,我可以继续加载新数据

然后再次满载堆并重新开始

这真的很奇怪,我找不到一种方法可以加载 10^7 个事件而没有这些问题

aproximately 事件应该采取:

8 + 8 + 4 + 10(时间戳大小?)大约是 30 个字节

30 字节 x3(开销)所以每条记录应该小于 100 字节

所以 10^7 * 10^2 = 10^9 字节 = 1Gb

看来 10^7 个事件应该适合 1Gb RAM,不是吗?

实际上,从 2.0 版本开始,Ignite 使用默认设置将所有内容存储在堆外。

这里的主要问题是您生成了一个包含 10000 个插入的非常大的查询字符串,它应该被解析,当然,将存储在堆中。在为每个查询减小此大小后,您将在此处获得更好的结果。

但是,正如您在 doc for capacity planning 中看到的那样,Ignite 为每个条目增加了大约 200 字节的开销。此外,为每个节点添加大约 200-300MB 的内部内存和合理数量的内存,以便 JVM 和 GC 高效运行

如果你真的只想使用 1gb 堆,你可以尝试调整 GC,但我建议增加堆大小。