首先请原谅我可能是一个非常幼稚的问题。 我的任务是为我的项目确定正确的nosql数据库。 我以高度并发的方式插入和更新表(列族)中的记录。
然后我遇到了这个。
INFO 11:55:20,924 Writing Memtable-scan_request@314832703(496750/1048576 serialized/live bytes, 8204 ops)
INFO 11:55:21,084 Completed flushing /var/lib/cassandra/data/mykey/scan_request/mykey-scan_request-ic-14-Data.db (115527 bytes) for commitlog position ReplayPosition(segmentId=1372313109304, position=24665321)
INFO 11:55:21,085 Writing Memtable-scan_request@721424982(1300975/2097152 serialized/live bytes, 21494 ops)
INFO 11:55:21,191 Completed flushing /var/lib/cassandra/data/mykey/scan_request/mykey-scan_request-ic-15-Data.db (304269 bytes) for commitlog position ReplayPosition(segmentId=1372313109304, position=26554523)
WARN 11:55:21,268 Heap is 0.829968311377531 full. You may need to reduce memtable and/or cache sizes. Cassandra will now flush up to the two largest memtables to free up memory. Adjust flush_largest_memtables_at threshold in cassandra.yaml if you don't want Cassandra to do this automatically
WARN 11:55:21,268 Flushing CFS(Keyspace='mykey', ColumnFamily='scan_request') to relieve memory pressure
INFO 11:55:25,451 Enqueuing flush of Memtable-scan_request@714386902(324895/843149 serialized/live bytes, 5362 ops)
INFO 11:55:25,452 Writing Memtable-scan_request@714386902(324895/843149 serialized/live bytes, 5362 ops)
INFO 11:55:25,490 Completed flushing /var/lib/cassandra/data/mykey/scan_request/mykey-scan_request-ic-16-Data.db (76213 bytes) for commitlog position ReplayPosition(segmentId=1372313109304, position=27025950)
WARN 11:55:30,109 Heap is 0.9017950505664833 full. You may need to reduce memtable and/or cache sizes. Cassandra will now flush up to the two largest memtables to free up memory. Adjust flush_largest_memtables_at threshold in cassandra.yaml if you don't want Cassandra to do this automatically
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid8849.hprof ...
Heap dump file created [1359702396 bytes in 105.277 secs]
WARN 12:25:26,656 Flushing CFS(Keyspace='mykey', ColumnFamily='scan_request') to relieve memory pressure
INFO 12:25:26,657 Enqueuing flush of Memtable-scan_request@728952244(419985/1048576 serialized/live bytes, 6934 ops)
我注意到我能插入&在我得到这个之前更新大约600万条记录。我在单个节点上使用cassandra。尽管日志中有提示,但我无法确定要更改的配置。我确实检查了bin / cassandra shell脚本,我看到他们在提出-Xms&之前已经做了很多操作。 -Xmx值。
请提供建议。
答案 0 :(得分:9)
首先,你可以运行
ps -ef|grep cassandra
查看Cassandra中-Xmx的设置。 -Xms和-Xmx的默认值基于系统内存量。
您可以尝试增加MAX_HEAP_SIZE(在conf / cassandra-env.sh中)以查看问题是否会消失。
例如,您可以替换
MAX_HEAP_SIZE="${max_heap_size_in_mb}M"
与
MAX_HEAP_SIZE="2048M"
答案 1 :(得分:2)
我认为为Cassandra调整垃圾收集器可能会解决OOM错误。当我们使用默认设置时,Cassandra使用垃圾收集器的并发标记和清除(CMS)JVM实现。通常,CMS垃圾收集器只会在堆几乎完全填充后启动。但是CMS进程本身需要一些时间才能完成,问题是在CMS进程完成之前JVM用完空间。我们可以设置使用旧代空间的百分比来触发CMS,并在bin / cassandra.in中使用以下选项JAVA_OPTS变量下的.sh文件
-XX:CMSInitiatingOccupancyFraction = {percentage} - 这会控制触发CMS时旧代的百分比,我们可以将此位设置为较低值,直到CMS处理完成为止。
-XX:+ UseCMSInitiatingOccupancyOnly - 此参数确保百分比保持不变
另外,通过以下选项,我们可以实现增量CMS
-XX:+ UseConcMarkSweepGC \ -XX:+ CMSIncrementalMode \ -XX:+ CMSIncrementalPacing \ -XX:CMSIncrementalDutyCycleMin = 0 \ -XX:+ CMSIncrementalDutyCycle = 10
考虑到CPU的内核数量,我们可以增加并行CMS线程
-XX:ParallelCMSThreads = {numberOfTreads}
此外,我们可以调整年轻一代的垃圾收集,使过程达到最佳状态。在这里,我们必须控制重复使用的对象的数量
为实现这一目标,我们可以设置以下参数
在对象从年轻一代迁移到老一代之前,他们被置于称为“年轻的行为”的阶段。因此,我们可以使用以下参数控制对象到旧代的迁移