【问题标题】:How much load can cassandra handle on m1.xlarge instance?cassandra 可以在 m1.xlarge 实例上处理多少负载?
【发布时间】:2013-12-13 03:31:16
【问题描述】:

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

基于包含多个准则的默认配置,例如:

  • datastax_clustering_ami_2.4
  • 不使用 EBS,而是在 ephemerals 上突袭了 0 xfs,
  • 在单独的磁盘上提交日志,
  • RF=3,
  • 6GB 堆,200MB 新大小(还使用更大的新大小/堆值进行了测试),
  • 增强的limits.conf。

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

节点保持运行状态,但它们的负载很大,日志中充满了 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 配置是什么?

【问题讨论】:

    标签: amazon-ec2 garbage-collection cassandra


    【解决方案1】:

    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* 更频繁地刷新较小的内存表,更早地释放堆)
    2. 将 write_request_timeout 降低到例如2 秒而不是 10 秒(如果您有大量写入,您不希望在传入队列中保留太多写入,这些队列驻留在堆上)
    3. 关闭 row_cache(如果您曾经启用它)
    4. key_cache 的大小较小
    5. 考虑升级到 Cassandra 2.0,它将很多东西移到堆外(例如布隆过滤器和索引摘要);如果您只是为每个节点存储大量数据,这一点尤其重要
    6. 添加更多硬盘并设置多个数据目录,以提高刷新性能
    7. 设置更大的新生代大小;对于 6 GB 堆,我通常将其设置为 800M 左右,以避免对老一代造成压力。
    8. 如果您确定 memtable 刷新滞后,请确保启用 sstable 压缩 - 这将减少物理保存到磁盘的数据量,但会增加 CPU 周期

    【讨论】:

    • 好吧,就我们的 I/O 速率而言,性能很糟糕(即使是临时存储),所以我们最终放弃了它。我不认为我们在从 S3 读取/写入数据并将其转储到 C* 中时将大量数据拉入其中(尽管它是实时的)。可能有一个参数可以提高我们的性能,但最终我们决定不浪费时间。不要误会我的意思,它可能在很多情况下都有效,有些人是忠实粉丝,但它对我们不起作用。这是我们严格的主观意见。
    • 我进一步调查了集群。我对其进行了多次压力测试(包括附加到 datastax java 驱动程序的压力测试),看起来集群本身在测试期间能够管理每秒大约 5K 的写入。它的表现也很稳定。现在我认为问题在于我们拥有的特定数据结构,或者可能是驱动程序的使用?复合键是否有可能有这样的性能损失?还有什么重要的?
    • @Rico 是哪个版本的?也许你被一些错误击中了?例如。就在最近,我对早期的 C* 2.0 版本进行了压力测试并获得了糟糕的性能,然后意识到我没有使用最新的稳定版本 - 升级后它就像魅力一样工作。
    • @Bartek 写入的平均大小是多少?您是否使用准备好的语句?你的负载均衡策略是什么?您的集群是否平衡良好,您的写入是否分布良好? system.log 中是否有任何警告/错误?
    • @PiotrKolaczkowski 的平均写入量约为 4K。它具有由 UUID 和时间戳构建的复合密钥。我们正在使用准备好的语句。我们使用每个节点设置 256 个令牌的 vnode。集群平衡良好,写入分布均匀。在情况非常糟糕之前,system.log 中没有错误/警告。然后是大量的 GC 跟踪,最后是:ERROR [Native-Transport-Requests:100] 2013-12-12 13:36:40,903 ErrorMessage.java(第 210 行)请求 java.io.IOException 期间出现意外异常:管道损坏(.. .)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    相关资源
    最近更新 更多