【问题标题】:Cassandra eating up all the off heap memoryCassandra 吃掉了所有的堆外内存
【发布时间】:2017-10-09 06:02:24
【问题描述】:

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

问题:我在服务器上加载了 50,000 个用户,每个用户最初有 1000 条记录,一段时间后,每个用户又添加了 20 条记录。我想获取稍后添加的 20 条附加记录(查询:select * from table where userID='xyz' and timestamp > 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 次读取/秒

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

【问题讨论】:

    标签: cassandra datastax


    【解决方案1】:

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

    【讨论】:

    • 我的分区不是很大,每个用户不超过1020条记录。同样在负载测试中,我只重复读取前 50,000 个用户的记录,总计只有 4.5 GB 的数据。所以,我的查询是 - 当行缓存被禁用时,什么会填满 50GB(堆外)内存。
    • 重复是什么意思?所有 50,000 个用户的单个读取记录集是否总计为 4.5 GB?还是所有查询的总和?
    • @daniel:50k 用户的总数据总计为 4.5GB。重复意味着仅读取 50k 用户的数据,并且在测试中未读取额外的 200GB
    • 每个用户有 1020 条记录,每个查询为一个用户获取最后 20 条记录。有 150,000 个用户,但在负载测试中,我反复获取前 50,000 个用户的记录(一个接一个)=>(50,000 个用户 * 1020 个记录)= 4.25 GB
    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多