Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory ApacheIgnite使用太多RAM_Memory_Ram_Ignite - Fatal编程技术网

Memory ApacheIgnite使用太多RAM

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

我曾尝试使用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 = []
    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速度的降低。