Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/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
C# 大量插入时Cassandra内存不足_C#_Cassandra - Fatal编程技术网

C# 大量插入时Cassandra内存不足

C# 大量插入时Cassandra内存不足,c#,cassandra,C#,Cassandra,我试图插入具有大列值(1-25Mb)的数据,几秒钟后,我的一个节点死亡,要么抛出OOM,要么陷入无休止的GC循环 它通常尝试刷新CFs,但随后它表示无法减少堆的使用,因为不存在脏列族 由于日志建议我减小memtable/cache的大小,我试图找出是什么耗尽了所有内存以适应我的设置,因此我运行了nodetool flush/invalidaterowcache/invalidatekeycache,然后通过jconsole触发了GC 不幸的是,即使服务器处于空闲状态,我的内存使用率仍然很高(>6

我试图插入具有大列值(1-25Mb)的数据,几秒钟后,我的一个节点死亡,要么抛出OOM,要么陷入无休止的GC循环

它通常尝试刷新CFs,但随后它表示无法减少堆的使用,因为不存在脏列族

由于日志建议我减小memtable/cache的大小,我试图找出是什么耗尽了所有内存以适应我的设置,因此我运行了
nodetool flush/invalidaterowcache/invalidatekeycache
,然后通过jconsole触发了GC

不幸的是,即使服务器处于空闲状态,我的内存使用率仍然很高(>60%)

所以,我的问题是,为什么在插入大值时服务器内存不足?还有,为什么服务器没有返回一些内存

编辑 我做了一个heapdump,堆中充满了字节[],主要由of
org.apache.cassandra.io.sstable.IndexSummary$KeyPosition
引用


我不明白这怎么可能,因为所有的东西都应该被冲洗掉。

在我看来,你似乎触及了这个问题。我不确定Cassandra是否消除了一些碎片问题,但一般来说,在.NET和可能的任何Windows程序中,都会遇到这种情况

当您选择超过85000字节的任何内容时(是的,奇数,但它是什么),对象存储在大型对象堆中。LOH只在第2代时被GC’ed,但更糟糕的是,它从未被压缩。部分原因是因为

结果:当您存储2MB、5MB、3MB、2MB、3MB的对象并且2MB的对象被GC’ed时,您可能有4MB的空闲空间。但是,如果您随后尝试创建一个3MB的新对象,则由于碎片(2MB的2个孔)而无法将其放置在那里,并移动到堆的顶部。最终,这个空间用完了。因此:可能有足够的可用内存,但由于此碎片,无论如何您都会得到一个OOM

此问题主要出现在64位(WOW64)和32位Windows上的32位x86应用程序上。64位应用程序也有碎片问题,但由于虚拟内存要大得多,所以在遇到实际碎片问题之前,首先要对内存进行分页(变得非常慢)


如果这确实是一个问题(您可以使用和直观地检查碎片),您可以通过创建一个大的字节池并重用您自己的池来解决它,从而防止碎片。

我使用MAT调查了堆转储,结果发现OutOfMemory的发生是因为Thrift使用了大量内存

因为我必须为我的列值传输大块数据,所以我将这些设置更改为128,以“确保安全”:

  • 节俭\u框架\u运输\u尺寸\u mb
  • 节俭\u最大消息\u长度\u以mb为单位
但事实证明,Thrift为每个接收线程分配一个
字节[2*Thrift\u max\u message\u length\u in\u mb]
,我有三个。所以我使用768Mb只是为了接收缓冲


将设置更改为32修复了我的问题。

不幸的是,我的问题在Cassandra方面,所以Java/Linux。而且,我刚刚做了一个heapdump,它实际上已经满了。@alprema:碎片不是特定于.NET的,甚至不是特定于操作系统的。如果你调查了heapdump,但没有发现漏洞,那么Cassandra实际上已经没有内存了。卡桑德拉虫子?你试过这些吗?你的JVM是如何在Linux机器上设置的?(堆大小、垃圾收集设置等)另外,您如何配置Cassandra?是否对列族使用辅助索引?我要检查的第一个地方是确保您的linux机器上有足够大的堆。服务器不会释放内存,因为它要么有对数据的活动引用(所有您刚刚放入的内容),要么您正在使用不经常收集的naive stop world GC,当它收集时,它会停止所有内容。