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,但我建议增加堆大小。
我曾尝试使用 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,但我建议增加堆大小。