0


一次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写回到磁盘上,从而使磁盘上的数据和内存中缓存的数据一致。

当满足以下两个条件之一将触发脏数据刷新到磁盘操作:

  1. 数据存在的时间超过了dirty_expire_centisecs(默认300厘秒,即30秒)时间;
  2. 脏数据所占内存 > 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对堆内存的使用率非常高,容易产生垃圾对象,所以垃圾回收的时间可以设置小点,堆内存回收比列也可以设置小点。

标签: kafka linq 分布式

本文转载自: https://blog.csdn.net/youyou263/article/details/143952755
版权归原作者 码农在失业 所有, 如有侵权,请联系我们删除。

“一次Kafka调优总结”的评论:

还没有评论