【发布时间】:2015-06-29 22:19:03
【问题描述】:
我遇到了 Cassandra 节点因“java.lang.OutOfMemoryError: Java heap space”异常而定期死亡的问题。
我的设置包含在 5 个虚拟机上运行的 5 个 Cassandra 2.0.11 节点。 每个 VM 都有 8GB RAM、100GB 磁盘容量和相当快的 CPU。
我已经尝试过增加堆大小。目前它设置为默认值(8GB 的 1/4=2GB)。
内存填充得非常快,接缝成为限制因素。如何强制 cassandra 使用更少的内存?我可以容忍较慢的写入操作以换取稳定性。
目前我只写没有更新、读取或删除。 我编写每个文件约 100000 个值的时间序列。并发级别为 QUORUM,复制因子为 3。我使用 datastax 中的 java-driver。
表是这样创建的:
"CREATE TABLE IF NOT EXISTS %s.%s(\n" +
"ts_type text,\n" +
"ts_name text,\n" +
"year int,\n" +
"time timestamp,\n" +
"value double,\n" +
"PRIMARY KEY((ts_type, ts_name), year, time));"
数据是这样写的:
for (final Double value : data) {
final Insert insertStatement = (Insert) QueryBuilder.insertInto(keyspace, tableName)
.value("ts_type", tsType)
.value("ts_name", tsName)
.value("time", timestampAsDate)
.value("year", timestamp.getYear())
.value("value", value)
.setConsistencyLevel(consistencyLevel);
batch.add(insertStatement);
zeitpunkt = zeitpunkt.plus(period);
if (index++ % 200 == 0) {
sets.add(client.executeAsync(batch));
batch = (Batch) QueryBuilder.unloggedBatch().setConsistencyLevel(consistencyLevel);
}
}
这是一个垂死节点的堆栈跟踪: http://pastebin.com/tTNRgJMP
如您所见,GC 在这里花了很长时间。
这是一个死节点的堆转储: http://i.imgur.com/rOJ3MIl.jpg
知道我做错了什么吗?
提前感谢您的帮助。
【问题讨论】:
-
您是否控制了一次正在处理的请求数量的速率?如果您提交请求的速度超过了完成的速度,最终您将在某个时候压倒您的集群。知道集群的容量总是好的,你可能会超过它。