Kafka群集需要多少内存?

时间:2018-12-17 14:11:43

标签: apache-kafka

我如何计算Kafka集群需要多少内存和cpu? 我的群集由3个节点组成,每秒吞吐量约为800条消息。

当前,它们有(每个)6 GB内存,2个CPU,1T磁盘,这似乎还不够。您会分配多少?

2 个答案:

答案 0 :(得分:1)

我认为您想从分析kafka群集开始。

请参阅此帖子的答案:CPU Profiling kafka brokers

基本上,建议您使用Prometheus和grafana堆栈在时间轴上可视化您的负载-从此您应该能够确定瓶颈。并链接到描述方法的文章。

此外,您可能会发现帖子比较有趣,因为发帖人似乎和您的工作量差不多。

答案 1 :(得分:1)

您需要提供有关用例的更多详细信息,例如消息的平均大小等,但是无论如何,这是我的2美分:

Confluent's documentation可能会有所启发:

  

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 and Confluent Reference Architecture。这是内存使用的部分,

  

ZooKeeper 使用JVM堆,通常4GB RAM就足够了。太   由于不断发生垃圾,堆很小会导致CPU占用过多   收集,而太大的堆可能导致较长的垃圾收集   在ZooKeeper群集中暂停并失去连接。

     

Kafka代理同时使用JVM堆和OS页面缓存。 JVM堆用于在代理之间复制分区并用于日志   压实。复制需要1MB(默认copy.max.fetch.size)   对于代理上的每个分区。在Apache Kafka 0.10.1中(合流   平台3.1),我们添加了新配置   (replica.fetch.response.max.bytes)限制用于以下目的的总RAM   复制到10MB,以避免内存和垃圾回收问题   当代理上的分区数量很高时。对于日志压缩,   计算所需的内存更加复杂,我们建议   如果您正在使用此功能,请参阅Kafka文档。   对于中小型部署,通常堆大小为4GB   足够。另外,强烈建议消费者   总是从内存中读取,即从写入Kafka和   仍存储在OS页面缓存中。内存量   要求取决于写入此数据的速率以及距离多远   您期望消费者获得支持。如果您每小时写入20GB   经纪人,您允许经纪人比正常情况落后3小时   在这种情况下,您将需要为OS页面缓存保留60GB。在案件   消费者被迫从磁盘读取数据时,性能将下降   显着

     

Kafka Connect 本身不占用太多内存,但是某些连接器在内部缓冲数据以提高效率。如果运行多个连接器   使用缓冲,您将需要将JVM堆大小增加到1GB   或更高。

     

消费者的每个消费者至少使用2MB内存,如果经纪人做出大量响应(通常用于突发流量),则最多使用64MB。   生产者将分别具有64MB的缓冲区。首先分配1GB RAM,然后为每个生产者增加64MB,为每个计划的消费者增加16MB。

在调整体系结构配置时,需要考虑许多不同的因素。我建议您阅读上述文档,监视您现有的集群和资源,最后进行相应的调整。