1

我们目前正在使用ab工具进行一些压力测试。单个插入在 cassandra 中运行良好。但是,当涉及到批量插入时,我目前正在处理 java 内存不足错误:Java Heap Space。

我有一台虚拟机,其中安装了 Ubuntu 服务器 13.04,内存为 2G

我对cassandra的内部配置了解不多。

我只是在制作大小为 100 的批量插入(100 插入 a BATCH)。

在我看到这个错误之后,我无法再cqlsh访问,nodetool几乎 1 小时都无法访问。

如何在重载时修复此错误?

注意:它不会发生在带有HTTP POST请求的单个插入上。

注意:在我的列族中,我有一个 TimeUUIDType 键,列值为ints 和varchars

更新:测试结果显示在 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

此外,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
4

1 回答 1

2

批处理听起来不像是一个足够大的数据集导致内存问题,所以这听起来像是虚拟机上的 JVM 的问题。你给它分配了多少内存?

您可以通过启动 JConsole(只需在终端/提示符中键入 jconsole)并查看“内存”选项卡进行检查,特别是以下值Max

JVM 内存统计


由于C*的启动脚本中包含的XX:+HeapDumpOnOutOfMemoryError参数, 您还可以获得有关导致崩溃的确切原因的一些详细信息,它基本上是一个日志文件,用于存储导致​​内存问题的堆栈跟踪。

通常,堆大小由 中的calculate_heap_sizes()函数自动计算cassandra-env.sh。但是,您可以通过将 MAX_HEAP_SIZE 设置为不同的值来覆盖该函数生成的数字。在 cassandra-env.sh 的第 174 和 175 行使用相同的变量JVM_OPTS="$JVM_OPTS -Xmx${MAX_HEAP_SIZE}"来设置最小和最大堆大小。

于 2013-06-27T14:37:54.410 回答