民工心事 发表于 2024-11-29 10:47:08

一次Kafka调优总结

概述

kafka设计的初衷是迅速处理小量的消息,一般1-10K大小的消息吞吐性能最好,kafka broker的默认设置也是以1-10K消息为基准设置的,如果程序生产消耗的消息都不大于10K,可以在只调优JVM,其他使用默认设置就能让kafka达到一个比力高的性能。
如果涉及到大消息和大流量,请先确定好实际环境的消息的最大值、生产消耗的吞吐量、磁盘数、磁盘IO速率等后,再讨论kafka集群流量、topic、partition、磁盘的多少。一般来说,一个kafka集群中,总的partitions数不应该凌驾3000,针对大流量的topic,建议一个消耗组对应一个topic,而partition至少保证一个磁盘上放一个partition,比如12块盘,那就创建12个partition的topic,kafka会主动将parition目次匀称分配到各个磁盘,前提是kafka设置了多目次挂载多磁盘。
体系优化篇

1、捏造内存

         对于大多数依靠吞吐量的应用程序来说,要只管避免内存交换、内存页和磁盘之间的交换对Kafka各方面的性能都有庞大影响。Kafka大量地使用体系页面缓存,如果捏造内存被交换到磁盘,阐明已经没有多余内存可以分配给页面缓存了。Kafka的机器上可以设置vm.swappiness为0,不答应内存交换。
另外,vm.max_map_count这个设置为历程可以具有的最大内存映射地区数,Kafka使用page cache技术,也就是用户态内存映射内核态内存,如许可以让刷盘快速。前提就是这种映射关系也是有数目限定的,所以一般都会把这个数值配成大于10万
如下是某次性能调优的设置
vim /etc/sysctl.conf vm.max_map_count=655300
vm.swappiness=0 sysctl --system         Kafka刷盘的机制可以直接使用体系的设置,它使用体系缓存页pagecache来缓存消息,而内核会将被写入的体系页面标记为dirty,并将其加入dirty list中。内核会周期性地将dirty list中的page写回到磁盘上,从而使磁盘上的数据和内存中缓存的数据同等。
当满足以下两个条件之一将触发脏数据刷新到磁盘操纵:

[*]数据存在的时间凌驾了dirty_expire_centisecs(默认300厘秒,即30秒)时间;
[*]脏数据所占内存 > dirty_background_ratio,也就是说当脏数据所占用的内存占总内存的比例凌驾dirty_background_ratio(默认10,即体系内存的10%)的时候会触发pdflush刷新脏数据。
vm.dirty_background_ratio:该值指的是体系内存的百分比,当缓存数据达到该值时触发将脏页刷盘动作。该值应该小于10,大部分情况下设为5
vm.dirty_ratio:该值是指体系内存的百分比,当缓存数据达到该值时,体系会停止所有的应用层的IO写操纵,等待刷完数据后规复IO。它应该要大于20,60-80是比力合理的区间,写压力大的时候请调大该参数
vm.dirty_expire_centisecs:这个参数会和参数vm.dirty_background_ratio一起来作用,一个表示大小比例,一个表示时间;即满足其中任何一个的条件都达到刷盘的条件
   如下为某次性能调优的设置:
touch /etc/sysctl.d/kafka-optimization.conf
echo vm.dirty_background_ratio=1 >> /etc/sysctl.d/kafka-optimization.conf
echo vm.dirty_ratio=80 >> /etc/sysctl.d/kafka-optimization.conf
echo vm.dirty_expire_centisecs=1000 >> /etc/sysctl.d/kafka-optimization.conf
sysctl --system 2、磁盘

         若使用云盘则忽略该优化,磁盘本身建议使用SSD和使用RAID,另外文件体系建议使用XFS格式,另外在设置磁盘挂载点的时候设置noatime(末了访问时间)参数,Kafka未使用该属性,可以将其禁掉,不影响 其他功能。
3、网络

         如有专门团队负责网络优化,请使用专业方案。一般情况下,体系内核没有针对快速的大流量网络传输进行优化。Kafka的网络设置与其他大部分Web服务器或网络应用程序的网络设置是一样的。
socket读写缓冲区:
net.core.wmem_default与net.core.rmem_default:合理值 131072 (128KB)
net.core.wmem_max与net.core.rmem_max : 合理值 2097152 (2MB)
tcp socket读写缓冲区:
net.ipv4.tcp_wmem与net.ipv4.tcp_rmem :合理值 4096 65536 2048000 (表示 最小值4KB,默认值64KB,最大值2MB)
注意:当吞吐量非常大时,也可以得当调高读写缓冲区的大小
   如下是某次性能调优的设置
touch /etc/sysctl.d/kafka-network.conf
echo net.core.wmem_default = 8388608 >> /etc/sysctl.d/kafka-network.conf
echo net.core.rmem_default = 8388608 >> /etc/sysctl.d/kafka-network.conf
echo net.core.wmem_max= 16777216 >> /etc/sysctl.d/kafka-network.conf
echo net.core.rmem_max= 16777216 >> /etc/sysctl.d/kafka-network.conf
echo net.ipv4.tcp_rmem = 4096 87380 6291456 >> /etc/sysctl.d/kafka-network.conf
echo net.ipv4.tcp_rmem = 4096 87380 6291456 >> /etc/sysctl.d/kafka-network.conf
sysctl --system 4、JVM

Java的垃圾接纳器的参数设置需要大量的观察和试错,不过G1垃圾接纳器只需要很少的设置就能完成这些设置。
MaxGCPauseMillis:每次垃圾接纳默认的停顿最大时间,默认是200ms
InitiatingHeapOccupancyPercent:堆内存使用率达到该值时会触发新一轮的垃圾接纳,默认是45
Kafka对堆内存的使用率非常高,容易产生垃圾对象,所以垃圾接纳的时间可以设置小点,堆内存接纳比列也可以设置小点。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 一次Kafka调优总结