文章目录

一、kafka参数

1.1 实例规模

  • 机器台数:至少3台,推荐5台。

1.2 实例参数

  • 经验:一定要多核心。多核减轻了线程上下文切换的开销,提升的性能可不止核心数那么多倍。
  • CPU和内存:标配2核8G,如果经费有限内存可以适量小一点
  • 网络带宽:10Gbps
  • 磁盘:kafka根据业务需要,一般50GB SSD

1.3 是否启用TLS加密

通常不需要,kafka一般是内网服务器使用,不会暴露公网,因此不用TLS,避免TLS加解密带来的CPU开销,加快消息收发速度。

1.4 监控和运维

(1)监控组件:

  • Prometheus:目前十分火的监控中间件,尤其是有K8S+Grafana可视化使用,效果非常好
  • OpenFalcon:小米开源的一款监控中间件,能够满足监控需求,而且免费。

(2)监控参数:

  • 主机基本参数:CPU、内存、磁盘,必看。
  • topic队列大小
  • topic消费堆积情况

1.5 kafka版本

推荐使用2.x稳定版,目前用到的是2.2.1。

例如AWS的MSK,提供了1.1.1、2.2.1、2.3.1(19年12月末),说明这几个版本都是比较稳定的。

1.6 Java版本

kafka依赖Java,2.2.x官方推荐1.8以上,主机的Java版本可以是1.8.162

1.7 操作系统级优化

(1)禁用atime

atime全称是access time,记录文件最后被访问的时间,记录atime需要操作的系统访问inode资源,而禁掉atime可以避免inode访问时间的写入操作,减少文件系统的写操作数。  

【永久修改启动配置】

vi /etc/fstab
# 默认是:LABEL=cloudimg-rootfs / ext4 defaults,discard 0 0,增加noatime参数
LABEL=cloudimg-rootfs / ext4 defaults,discard,noatime 0 0

顺便可以了解两个数字的含义: 

  • 倒数第二个数字表示是否对文件系统备份,0表示不备份; 
  • 倒数第一个数字表示开机是否检查文件系统,0表示不检查。

更多内容参考《挂载文件系统选项nodiratime、noatime》

【修改后临时重新挂载】

mount -o remount /
或者
mount -o noatime -o nodiratime -o remount /

【验证是否成功】

标志为:read文件,atime、mtime、ctime不会变化;write文件,atime不会变化,仅mtime和ctime变化。

$ touch a.txt
$ stat a.txt
$ cat a.txt
$ stat a.txt
$ vi a.txt
$ stat a.txt

(2)文件系统使用ext4

虽然官方推荐用xfs,次要推荐ext4,但还是先用普通的常见的ext4比较好,附录中的《极客时间……》也描述到“建议至少选择ext4或XFS”,以后可以考虑使用ZFS等更高级的文件系统。

(3)vm.swappiness设置得更低一些,例如10

vm.swappiness建议在1~10之间,以防止Linux的OOM Killer开启随意杀掉进程。vm.swappiness含义为虚拟内存使用程度,0~100,默认60,越大越偏好用磁盘,越小越偏好用内存。

【查看当前值,一般默认都是60】

$ cat /proc/sys/vm/swappiness

【临时修改】

$ sudo sysctl vm.swappiness=10
$ cat /proc/sys/vm/swappiness

【保存配置以便重启后也生效】

在/etc/sysctl.conf末尾增加一行:
vm.swappiness=10

(4)打开文件描述符限制,例如1048756

kafka会打开很多日志文件,用到文件句柄,因此要调大,约为分区数 * (分区总大小/日志段大小)*3,通用的推荐为100000,这里设置为更高的1000000,用ulimit去配置进程级的文件句柄数量即可。参考file-max和ulimit -n的区别

【修改系统全局允许分配的最大文件句柄数(立刻生效)】

$ sudo sysctl -w fs.file-max=2097152
$ sudo sysctl -w fs.nr_open=2097152
$ sudo echo 2097152 > /proc/sys/fs/nr_open

【允许当前会话/进程打开文件句柄数】

ulimit -n 1048576

【配置写进文件 /etc/sysctl.conf】

fs.file-max=1048576

【设置服务最大文件句柄数 /etc/systemd/system.conf】

DefaultLimitNOFILE=1048576

【持久化设置允许用户/进程打开文件句柄数 /etc/security/limits.conf】

*      soft   nofile      1048576
*      hard   nofile      1048576

(5)vm.max_map_count增加为655360

max_map_count如果太小,当kafka主题数量很多的时候,会碰到OutOfMemoryError:Map failed的严重错误。

【通过如下命令可以查看和验证修改】

sysctl -a |grep xxx

【写入永久配置:/etc/sysctl.conf】

vm.max_map_count=655360

【立刻生效】

sysctl -p

(6)vm.dirty_background_ratio设置为5

vm.dirty_background_ratio:脏页刷盘,尽可能快地异步地将脏页刷盘,设置为5(脏页达到内存5%就异步刷盘)

【同前面进行设置】

vm.dirty_background_ratio=5 # 默认是10

(7)网络socket读写缓冲区net.core.rmem_default、net.core.wmem_default设置为262144(256KB)

【写入永久配置:/etc/sysctl.conf】

net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.core.optmem_max=16777216

【立刻生效】

sysctl -p

(8)TCP协议栈读写缓冲区net.ipv4.tcp_rmem、net.ipv4.tcp_wmem设置为2097152(2MB)

注意这里的net.ipv4.tcp_rmem的数字含义:最小值、默认值、最大值 

net.ipv4.tcp_mem=16777216 16777216 16777216
net.ipv4.tcp_rmem=1024 2097152 16777216
net.ipv4.tcp_wmem=1024 2097152 16777216

立刻生效】

sysctl -p

1.8 JVM层优化

(1)JVM堆大小:调整为内存的一半,例如内存8G,则调整为4G

通常这个值应该通过关注GC log来调整,特别是Full GC之后堆上存活对象的总大小,然后把堆大小设置为该值的1.5~2倍。可以通过jmap -histo:live <pid>手动触发Full GC。但是一般为了简单,设置为一半是经验值。

(2)垃圾收集器:JDK8默认G1,不用调整

需要注意大对象问题(Large Object),反映到GC报错就是“too many humongous allocations”,大对象指的是超过Region大小一半的对象,例如区域大小2MB,那么超过1MB的都是大对象。处理方法除了增加堆大小外,还可以适当增加Region大小,启动参数中加入 -XX:=G1HeapRegionSize=N。kafka消息体特别大才会出现这种情况,如果业务消息都很小,那么一般不会出现这类异常。

1.9 框架层优化

尽量保证客户端版本和Kafka版本一致,请使用2.2.1版本的Producer和Consumer

1.10 应用层优化

(1)使用习惯

  • 不要频繁创建Producer和Consumer:例如可以使用Spring kafka,交给Spring托管
  • 用完及时关闭
  • 合理利用多线程来改善性能

(2)吞吐量调优

【producer】

  • batch.size:建议从默认的16KB增加到512KB或1MB
  • compression.type:建议不要设置。这里和吞吐量是矛盾的,如果要求吞吐量大,那么就应该压缩,然而压缩消耗的性能太多,除非每条消息都很大,那么可以使用lz4或zstd来压缩,否则建议不要去为了那么点吞吐量去设置。
  • ack:建议0,实际通常为了方便也设置为0, 看具体业务对消息丢失的忍受度。
  • retries:建议2。这里也是矛盾的,如果要求吞吐量大,则应该设置为0不要重试,但是消息容易丢,还是设置2比较好。
  • buffer.memory:根据具体业务自行调整。

【consumer】

  • 多consumer同时消费
  • fetch.min.bytes:建议增加到1KB或更大

(3)延时调优

【producer】

  • linger.ms:设置为0或1,立刻提交
  • compression.type:none
  • acks:建议1 ,实际通常为了方便设置为0,看具体业务对消息丢失的忍受度。比如可重复操作的消息,丢了就让用户重试就好了。

【consumer】

  • fetch.min.bytes:1KB 

1.11 kakfa服务器重点参数

  • zookeeper.connect:zookeeper地址。
  • auto.create.topics.enable:允许自动创建topic,默认为true,但生产应该设置为false。
  • broker.id:节点ID,默认会设置为ZK已经存在的最大节点ID+1。对于已知的集群,最好自己设置一下,便于后续排查是哪个节点挂掉了。
  • compression.type:指定topic的数据压缩算法,默认为producer,也就是根据producer的设置进行设置。支持的算法有gzip、snappy、lz4、zstd、uncompressed、producer。保持默认。
  • delete.topic.enable:是否允许删除toipc,默认为true。保持默认。
  • log.dir:指定数据存储的位置,默认为/tmp/kafka-logs。/tmp卷通常用于存放临时数据,kafka的日志最好存到日志目录下,故可以指定/var/log/kafka-logs,也可以保持默认。
  • log.flush.interval.messages:数据刷盘间隔,默认为null。保持默认。这里单独列出来是因为,官方不建议配置flush相关参数主动刷盘,可靠性应当用replica参数来保证,而不是影响性能的刷盘。
  • log.retention.bytes:日志最大大小(超过就会删除),默认不限制,最好限制一下,当然也要尽量大一些。例如配置5GB日志大小,避免频繁删除日志带来开销。
  • log.retention.hours:日志保留时间,默认7天。根据业务需要调整,需要考虑故障恢复时间,避免kafka宕机了几个小时没有恢复,结果日志早都删完了,造成丢消息。可以设置为24小时。
  • log.segment.bytes:单个日志文件大小,默认1G。此值越大越好,预留一个日志段大小,能保证kafka将整个日志段全部放入页缓存,消费者消费能够直接命中页缓存,从而避免磁盘I/O带来的开销。需要考虑单条消息大小来进行配置,例如可以设置为104857600(100M)
  • message.max.bytes:最大消息大小,默认为16KB,可以调整为131072(128KB)
  • num.partitions:每个主题的默认分区数,默认为1。可以设置得更大一点,如8、12。
  • default.replication.factor:默认备份数量,一般和broker数量保持一致,如3。
  • retention.bytes:每个partition的大小,默认-1没有大小限制,只有时间限制。需要考虑生产者写入速度,不同topic最好根据生产速度来配置partition大小。例如1073741824(1GB)。
  • log.cleanup.policy:旧日志处理策略,可以delete或compact,默认delete。处于节省磁盘空间的考虑可以配置删除策略,保持默认。

二、zookeeper参数

2.1 实例规模  

  • 机器台数:至少3台,推荐5台。

2.2 实例参数

  • 经验:一定要多核心。不建议用单核主机,这样不能开启swap,可能会有性能问题。
  • CPU和内存:高配2核4G,标配2核2G。
  • 网络带宽:10Gbps
  • 磁盘:kafka根据业务需要,一般10GB SSD

2.3 默认最大节点存储数据

1MB,保持默认。

2.4 日志和持久化数据

配置为回滚和自动清理。

2.5 是否和业务复用

是。

2.6 zookeeper版本

3.4.x有bug,推荐3.5以上,例如3.5.5

2.7 LInux调参

暂时不需要太多linux调参

2.8 zookeeper重点参数

  • tickTime:客户端维持心跳时间(毫秒),默认2000ms。可以设置为3000

  • dataDir:快照目录。设置为自己的目录。

  • dataLogDir:事务日志目录,单独挂载。设置为自己的目录。

  • initLimit:Leader与Learner连接read阻塞心跳次数,默认5次。保持默认。

  • syncLimit:Learner与Leader同步read阻塞心跳次数,默认2次。保持默认。

  • autopurge.purgeInterval:自动清理快照和日志的间隔(小时),默认为0,不清理。一定要清理,否则会越来越多需要手动清理,推荐设置为3。

  • autopurge.snapRetainCount:快照保留的数量,默认3份,必须开启清理功能此参数才会生效。可以设置为5。standaloneEnabled:单节点模式启动,默认为true。设置为false。

  • reconfigEnabled:是否允许重新配置,默认为false。3.5.3+新参数,为了避免某一台zookeeper被入侵后可以修改整个集群的配置。但是都入侵到内网了,也没有安全性可言了,所以应该设置为true,方便正常修改配置操作可以在集群间自动同步。

  • dynamicConfigFile:动态配置文件目录,默认不能动态配置,开启后可以动态修改配置,且自动同步到集群其他节点。通常用于配置服务器、组等动态修改的数据。参考zookeeper官方文档去配置。

三、参考资料

《CSDN:kafka性能调优》

《CSDN:设置Linux打开文件句柄/proc/sys/fs/file-max和ulimit -n的区别》

《kafka2.2.x官方文档》

《kafka调优参数设置》

《KAFKA 调优》

《zookeeper3.5.5官方文档》

《极客时间:调优kafka,你做到了吗?》胡夕20190829

《挂载文件系统选项nodiratime、noatime》


转载请注明出处http://www.bewindoweb.com/287.html | 三颗豆子
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。
你可能还会喜欢
具体问题具体杠