如何计算我的Kafka集群需要多少内存和cpu?我的集群由3个节点组成,吞吐量约为每秒800条消息。
目前他们有(每个)6 GB内存,2个CPU,1T磁盘,这似乎是不够的。你会分配多少?
发布于 2019-03-02 20:31:47
你需要提供一些关于你的用例的更多细节,比如消息的平均大小等,但不管怎样,这里是我的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堆,4 4GB内存通常就足够了。太小的堆将由于持续的垃圾收集而导致高CPU,而太大的堆可能会导致长时间的垃圾收集暂停和ZooKeeper集群内的连接丢失。
JVM代理同时使用堆和OS页面缓存。JVM堆用于代理之间的分区复制和日志压缩。对于代理上的每个分区,复制需要1MB (默认replica.max.fetch.size)。在Apache Kafka 0.10.1 (Confluent Platform 3.1)中,我们添加了一个新的配置(replica.fetch.response.max.bytes),将用于复制的总内存限制为10MB,以避免在代理上的分区数量较多时出现内存和垃圾收集问题。对于日志压缩,计算所需内存比较复杂,如果您使用该功能,建议参考Kafka文档。对于中小型部署,4 4GB的堆大小通常就足够了。此外,强烈建议消费者始终从内存读取,即从写入Kafka但仍存储在操作系统页面缓存中的数据读取。所需的内存量取决于写入此数据的速率,以及您期望消费者获得的内存落后多远。如果每个代理每小时写入20 OS,并且允许代理在正常情况下延迟3小时,则需要为操作系统页面缓存保留60 OS。在强制消费者从磁盘读取的情况下,性能将显著下降
Kafka Connect本身并不占用太多内存,但为了提高效率,一些连接器会在内部缓冲数据。如果运行多个使用缓冲的连接器,则需要将JVM堆大小增加到1 1GB或更高。
消费者每个消费者至少使用2MB,在来自代理的大响应情况下最多使用64MB (通常用于突发流量)。Producers将有一个64MB的缓冲区。从分配1 1GB开始,为每个生产者增加64MB,为每个计划的消费者增加16MB。
在调优架构的配置时,需要考虑许多不同的因素。我建议仔细阅读前面提到的文档,监控您现有的集群和资源,最后对它们进行相应的调整。
发布于 2019-03-02 18:02:24
我想你应该从分析你的kafka集群开始。
看这篇文章的答案:CPU Profiling kafka brokers。
它基本上建议你使用prometheus和grafana堆栈在时间线上可视化你的负载-从这个你应该能够确定你的瓶颈。并链接到一篇描述如何实现的文章。
此外,你可能会发现这篇文章很有趣,因为这篇帖子似乎和你的工作量差不多。
https://stackoverflow.com/questions/53816988
复制相似问题