Memory ApacheIgnite使用太多RAM
我曾尝试使用Ignite来存储事件,但在插入新数据时遇到了RAM使用过多的问题 我正在使用1GB堆和默认配置运行ignite节点Memory ApacheIgnite使用太多RAM,memory,ram,ignite,Memory,Ram,Ignite,我曾尝试使用Ignite来存储事件,但在插入新数据时遇到了RAM使用过多的问题 我正在使用1GB堆和默认配置运行ignite节点 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
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试图清理一些空间(未成功)
然后我停下来大约10分钟,然后GC成功地清理了一些空间,我可以继续加载新数据
然后再次堆满负载,并重新开始
这是一种非常奇怪的行为,我无法找到一种方法来加载10^7个事件而不出现这些问题
一个大概的事件应该是:
8+8+4+10(时间戳大小?)约为30字节
30字节x3(开销),因此每条记录的开销应小于100字节
所以10^7*10^2=10^9字节=1Gb
所以看起来10^7个事件应该适合1Gb内存,不是吗
实际上,从2.0版开始,Ignite使用默认设置将所有存储在堆外 这里的主要问题是,您生成了一个包含10000个插入的非常大的查询字符串,应该对其进行解析,当然,它将存储在堆中。在为每个查询减小此大小后,您将在此处获得更好的结果 但是,正如您在中所看到的,Ignite为每个条目增加了大约200字节的开销。此外,为每个节点添加大约200-300MB的内部内存,并为JVM和GC提供合理的内存量,以便高效运行
如果您真的只想使用1gb堆,您可以尝试优化GC,但我建议增加堆大小。实际上,从2.0版开始,Ignite使用默认设置将所有存储在堆外 这里的主要问题是,您生成了一个包含10000个插入的非常大的查询字符串,应该对其进行解析,当然,它将存储在堆中。在为每个查询减小此大小后,您将在此处获得更好的结果 但是,正如您在中所看到的,Ignite为每个条目增加了大约200字节的开销。此外,为每个节点添加大约200-300MB的内部内存,并为JVM和GC提供合理的内存量,以便高效运行
如果您真的只想使用1gb堆,您可以尝试调整GC,但我建议增加堆大小。您使用哪个版本的Ignite?最新版本的Ignite 2.2.0您使用哪个版本的Ignite?最新版本的Ignite 2.2.0谢谢!减少单个插入的大小有助于提高效率。但奇怪的是,当插入大量数据时,GC不能足够快地删除无用的数据。它只能在停止插入数据后5-10分钟内完成。直观地看,它应该在将数据放入堆外之后删除无用的数据,不是吗?在这种情况下,我认为GC收集无用的数据,但堆的大小很小,对如此大的查询进行解析会产生大量垃圾。这些事情会导致GC速度下降。谢谢!减少单个插入的大小有助于提高效率。但奇怪的是,当插入大量数据时,GC不能足够快地删除无用的数据。它只能在停止插入数据后5-10分钟内完成。直观地看,它应该在将数据放入堆外之后删除无用的数据,不是吗?在这种情况下,我认为GC收集无用的数据,但堆的大小很小,对如此大的查询进行解析会产生大量垃圾。这些都会导致GC速度的降低。