我们目前正在使用ab
工具进行一些压力测试。单个插入物在cassandra中表现很好。但是,当谈到批量插入时,我目前正在处理java内存不足错误:Java Heap Space。
我有一台安装了Ubuntu服务器13.04的虚拟机器,内置2G内存
我对cassandra的内部配置知之甚少。
我只是制作一个大小为100的批量插入(在BATCH
中插入100个)。
在我看到此错误后,我已经不再cqlsh
次访问,而是nodetool
访问了近1小时。
如何在重载中修复此错误?
注意:对于HTTP POST
次请求的单个插入,不会发生这种情况。
注意:在我的专栏系列中,我有一个包含TimeUUIDType的键,列值为int
s和varchar
s
更新:测试结果显示我在6000次请求之前没有任何错误。但是,当涉及到7000时,php代码会抛出以下内容:
Error connecting to 127.0.0.1: Thrift\Exception\TTransportException: TSocket: timed out reading 4 bytes from 127.0.0.1:9160
Morever,cassandra在重负荷中记录以下内容;
WARN [ScheduledTasks:1] 2013-06-28 03:43:07,931 GCInspector.java (line 142)
Heap is 0.9231763795560355 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
答案 0 :(得分:2)
批处理听起来不像是一个足够大的数据集导致内存问题,所以这听起来像是虚拟机上的JVM问题。你分配了多少内存?
您可以通过启动JConsole进行检查(只需在终端/提示符下键入jconsole)并查看“内存”选项卡,特别是Max
下的值:
由于 C * 的启动脚本中包含的XX:+HeapDumpOnOutOfMemoryError参数,您还可以获得有关导致崩溃的原因的详细信息,它基本上是一个存储导致内存问题的堆栈跟踪的日志文件
通常,堆大小由calculate_heap_sizes()
中的cassandra-env.sh
函数自动计算。但是,您可以通过将MAX_HEAP_SIZE设置为不同的值来覆盖生成的函数的数量。在174和174号线上使用相同的变量。用于设置最小和最大堆大小的cassandra-env.sh JVM_OPTS="$JVM_OPTS -Xmx${MAX_HEAP_SIZE}"
中的175。