卡桑德拉耗尽了所有的堆内存

时间:2017-05-10 14:12:04

标签: cassandra datastax

使用的数据库:Datastax cassandra community 3.0.9 集群:3 x(8核64GB AWS),300GB io1和3000iops。 分配的Java堆内存= 8g 写入一致性:仲裁,读取一致性:ONE复制因子:3

问题:我为我们的服务器加载了50,000个用户,每个用户最初都有1000条记录,过了一段时间后,每个用户又添加了20条记录。我想获取之后添加的20条额外记录(查询:从表中选择*,其中userID =' xyz'以及时间戳> 123)

CREATE TABLE tbl (
    userID text,
    timestamp timestamp,
    ....
    PRIMARY KEY (userID, timestamp)
);

除了50,000个用户的原始数据之外,我已经向tbl添加了额外的200GB数据。

堆内存使用量在2-4 GB范围内,但几乎所有剩余的堆内存(56 GB)都被cassandra吃掉了。

从这一点开始,如果向表中添加更多数据,由于内存不足,会导致读取吞吐量急剧下降。

虽然它符合读取吞吐量SLA,但似乎不是可扩展的解决方案 - (3 x 64 GB)RAM用于200 GB数据。

注意:

  • 在负载测试实验中,仅记录最初的50,000个用户 被抓了。
  • 禁用行缓存。
  • 它的读密集型应用程序 - 2000次读/秒

堆内存使用率高的可能原因是什么?

1 个答案:

答案 0 :(得分:0)

如果您的分区非常大,那么阅读时间会更长。由于您的数据由userid分区,因此与每个用户ID关联的所有数据都存储在磁盘上的单个分区中(在分区内,您的数据按时间戳排序 - 您的群集密钥)。在阅读时,cassandra必须遍历整个分区才能找到您在读取时请求的数据。如果每个用户标识都有大量与之关联的数据,则磁盘上可能会有相当大的分区,这需要更长的时间来读取。