我如何计算我的 Kafka 集群需要多少内存和 CPU?我的集群由 3 个节点组成,吞吐量约为每秒 800 条消息。
目前他们有(每个)6 GB ram,2 CPU,1T 磁盘,似乎还不够。你会分配多少?
Gio*_*ous 10
您需要提供有关您的用例的更多详细信息,例如消息的平均大小等,但无论如何这是我的 2 美分:
Confluent 的文档可能会有所启发:
CPU
大多数 Kafka 部署往往对 CPU 要求相当低。因此,确切的处理器设置不如其他资源重要。请注意,如果启用 SSL,则 CPU 要求可能会高得多(具体细节取决于 CPU 类型和 JVM 实现)。您应该选择具有多个内核的现代处理器。普通集群使用 24 台核心机器。
如果您需要在更快的 CPU 或更多内核之间进行选择,请选择更多内核。多核提供的额外并发将远远超过稍微快一点的时钟速度。
如何计算吞吐量 计算吞吐量
也可能会有所帮助。例如,如果您每秒有 800 条消息,每条消息 500 字节,那么您的吞吐量为800*500/(1024*1024) = ~0.4MB/s. 现在,如果您的主题已分区,并且您有 3 个代理启动并运行了 3 个副本,这将导致0.4/3*3=0.4MB/s每个代理。
有关架构的更多详细信息,请参阅 Confluent 的白皮书Apache Kafka 和 Confluent 参考架构。这是内存使用部分,
ZooKeeper使用 JVM 堆,4GB RAM 通常就足够了。堆太小会因不断的垃圾收集而导致 CPU 过高,而堆太大可能会导致长时间的垃圾收集暂停和 ZooKeeper 集群内的连接丢失。
卡夫卡经纪人同时使用 JVM 堆和操作系统页面缓存。JVM 堆用于代理之间的分区复制和日志压缩。对于代理上的每个分区,复制需要 1MB(默认的 replica.max.fetch.size)。在 Apache Kafka 0.10.1(Confluent Platform 3.1)中,我们添加了一个新配置(replica.fetch.response.max.bytes),将用于复制的总 RAM 限制为 10MB,以避免内存和垃圾回收问题。代理上的分区很高。对于日志压缩,计算所需内存比较复杂,如果你使用这个功能,我们建议你参考Kafka文档。对于中小型部署,4GB 堆大小通常就足够了。此外,强烈建议消费者始终从内存中读取,即 来自写入 Kafka 且仍存储在 OS 页面缓存中的数据。这需要的内存量取决于写入此数据的速率以及您期望消费者获得多远。如果您每小时为每个代理写入 20GB 并且您允许代理在正常情况下落后 3 小时,您将需要为操作系统页面缓存保留 60GB。在消费者被迫从磁盘读取的情况下,性能将显着下降
Kafka Connect本身并不使用太多内存,但一些连接器会在内部缓冲数据以提高效率。如果您运行多个使用缓冲的连接器,您需要将 JVM 堆大小增加到 1GB 或更大。
消费者每个消费者至少使用 2MB,在来自代理的大量响应的情况下(通常用于突发流量)最多使用 64MB。 每个生产者将有一个 64MB 的缓冲区。首先分配 1GB RAM,并为每个计划的生产者增加 64MB,为每个消费者增加 16MB。
在调整架构配置时,需要考虑许多不同的因素。我建议阅读上述文档,监控您现有的集群和资源,最后相应地调整它们。
我认为您想从分析您的 kafka 集群开始。
请参阅这篇文章的答案:CPU Profiling kafka Brokers。
它基本上建议您使用 prometheus 和 grafana 堆栈在时间轴上可视化您的负载 - 由此您应该能够确定您的瓶颈。并链接到一篇描述如何操作的文章。
另外,您可能会发现这篇文章很有趣,因为发帖者的工作量似乎与您大致相同。
| 归档时间: |
|
| 查看次数: |
8120 次 |
| 最近记录: |