cassandra可以在m1.xlarge实例上处理多少负载?

时间:2013-12-10 18:05:41

标签: amazon-ec2 garbage-collection cassandra

我在3个EC2 m1.xlarge实例上设置了3个Cassandra(1.2.10)集群节点。

基于默认配置,包含多个指南,例如:

  • datastax_clustering_ami_2.4
  • 不使用EBS,而是在短命中搜索0 xfs,
  • 在单独的磁盘上提交日志,
  • RF = 3,
  • 6GB堆,200MB新大小(也测试了更大的新大小/堆值),
  • enhanced limits.conf。

每秒500次写入,群集仅工作几个小时。在那之后,由于CPU过载(主要是GC +压缩),它似乎无法响应。

节点保持Up状态,但是它们的负载很大,而且日志中充满了GC信息和消息,如:

ERROR [Native-Transport-Requests:186] 2013-12-10 18:38:12,412 ErrorMessage.java (line 210) Unexpected exception during request java.io.IOException: Broken pipe

nodetool在每个节点上显示许多丢弃的突变:

Message type           Dropped
RANGE_SLICE                  0
READ_REPAIR                  7
BINARY                       0
READ                         2
MUTATION               4072827
_TRACE                       0
REQUEST_RESPONSE          1769

对于m1.xlarge的3节点集群,500 wps是否过多,我应该添加节点?或者是否有可能以某种方式进一步调整GC? 您可以使用3个m1.xlarge节点提供哪些负载?你的GC配置是什么?

1 个答案:

答案 0 :(得分:7)

Cassandra完全能够在单个节点上每秒处理数万次小写入。我刚刚检查了我的笔记本电脑,并在Cassandra 1.2上从cassandra-stress获得了大约29000次写入/秒。因此,即使对于单个节点,每秒500次写入也不是真正令人印象深刻的数字。

但请注意,数据刷新到磁盘的速度也有限制,并且您绝对不希望传入数据速率接近HDD的物理功能。因此,如果这些写入足够大,则每秒500次写入可能太多。

首先 - 写入的平均大小是多少?你的复制因素是什么?通过复制因子和平均写入大小相乘的写入次数 - 然后您将大致知道群集所需的写入吞吐量。但是你应该为其他与I / O相关的任务(如压缩)留出一些安全余量。互联网上有各种基准测试,告诉单个m1.xlarge实例应能写入20 MB / s到100 MB / s之间的任何地方......

如果您的群集具有足够的I / O吞吐量(例如,比所需的多3倍),但是您观察到OOM问题,则应尝试:

  1. 减少memtable_total_space_mb(这将导致C *刷新较小的memtables,更常见的是,更早地释放堆)
  2. 将write_request_timeout降低到例如2秒而不是10秒(如果您有大量写入,则不希望在驻留在堆上的传入队列中保留太多它们)
  3. 关闭row_cache(如果您启用了它)
  4. key_cache的较小尺寸
  5. 考虑升级到Cassandra 2.0,它在堆外移动了很多东西(例如布隆过滤器和索引摘要);如果您只是为每个节点存储大量数据,这一点尤其重要
  6. 添加更多HDD并设置多个数据目录,以提高刷新性能
  7. 设置更大的新一代尺寸;我通常将它设置为大约800M的6 GB堆,以避免对终身压力的压力。
  8. 如果您确定memtable flushing滞后,请确保启用sstable压缩 - 这将减少物理上保存到磁盘的数据量,但需要额外的CPU周期