【问题标题】:cassandra java heap space issues with phpcassaphpcassa的cassandra java堆空间问题
【发布时间】:2013-06-27 14:14:44
【问题描述】:

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

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

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

我只是在做一个大小为 100 的批量插入(在 BATCH 中插入 100 个)。

在我看到这个错误之后,我不再有 cqlsh 访问权限,几乎 1 小时都没有 nodetool 访问权限。

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

注意:在带有 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

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

【问题讨论】:

  • 虚拟机上的JVM好像有问题,你给它分配了多少内存?
  • @LyubenTodorov 我在哪里可以知道 jvm 使用了多少?是用cassandra-env.sh写的吗?
  • 检查我的更新,但是它在cassandra-env.sh

标签: cassandra phpcassa


【解决方案1】:

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

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


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

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

【讨论】:

  • 当我start/stop cassandra 服务时,我得到以下信息; xss = -ea -javaagent:/usr/share/cassandra/lib/jamm-0.2.5.jar -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -Xms1001M -Xmx1001M -Xmn100M -XX:+HeapDumpOnOutOfMemoryError -Xss180k 所以我猜大概是1G
  • @aacanakin 应该够了,内存不足堆栈跟踪显示了什么?
  • 看来我错过了这些日志。目前,我正在处理重新启动测试,但我现在没有 cqlsh 访问权限
  • 好的,我把服务器拿回来了。我开始跟踪system.logoutput.logerror.log
  • @aacanakin 通常这个错误记录在一个单独的文件中,因为如果 jvm 因错误而死,你不能记录所述错误。 Check this link,通常在发生错误时会说明创建的文件的名称和位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 2022-01-12
  • 2014-11-21
相关资源
最近更新 更多