优化漏斗
- 层级越靠上,其调优的效果越明显
os 层
挂载文件系统时禁掉atime更新
- atime 的全称是 access time,记录的是文件最后被访问的时间。记录 atime 需要操作系统访问 inode 资源,而禁掉 atime 可以避免 inode 访问时间的写入操作,减少文件系统的写操作数
mount -o noatime
选择ext4或XFS文件系统
swap空间的设置
- 将 swappiness 设置成一个很小的值,比如 1~10 之间,以防止 Linux 的 OOM Killer 开启随意杀掉进程
- 执行
sudo sysctl vm.swappiness=N
来临时设置该值 - 如果要永久生效,可以修改
/etc/sysctl.conf
文件,增加vm.swappiness=N
,然后重启机器即可
- 参数设置
ulimit -n
- 如果设置得太小,你会碰到 Too Many File Open 这类的错误
vm.max_map_count
- 如果设置太小,在一个主题数超多的 Broker 机器上,你会碰到 OutOfMemoryError:Map failed 的严重错误
- 修改
/etc/sysctl.conf
文件,增加vm.max_map_count=655360
,保存之后,执行sysctl -p
命令使它生效
- 页缓存大小
- 给 Kafka 预留的页缓存越大越好,最小值至少要容纳一个日志段的大小,也就是 Broker 端参数
log.segment.bytes
的值。该参数的默认值是 1GB - 至少能保证 Kafka 可以将整个日志段全部放入页缓存,这样,消费者程序在消费时能直接命中页缓存,从而避免物理磁盘 I/O 操作
- 给 Kafka 预留的页缓存越大越好,最小值至少要容纳一个日志段的大小,也就是 Broker 端参数
jvm 层
- 堆设置
- 6-8g
- GC收集器
- g1
- 大对象设置大点
-XX:+G1HeapRegionSize=N
- N/2 就视为 大对象
框架层(broker)
- 保持服务器端和客户端版本一致
- 避免丢失特性,比如 Zero Copy
应用层
- 不要频繁地创建 Producer 和 Consumer 对象实例。构造这些对象的开销很大,尽量复用它们。
- 用完及时关闭。这些对象底层会创建很多物理资源,如 Socket 连接、ByteBuffer 缓冲区等。不及时关闭的话,势必造成资源泄露。
- 合理利用多线程来改善性能。Kafka 的 Java Producer 是线程安全的,你可以放心地在多个线程中共享同一个实例;而 Java Consumer 虽不是线程安全的,但是可以多线程加快效率
性能指标调优
调优吞吐量(量大)
Producer
num.replica.fetchers
表示的是 Follower 副本用多少个线程来拉取消息,默认使用 1 个线程- 在实际生产环境中,配置了
acks=all
的 Producer 程序吞吐量被拖累的首要因素,就是副本同步性能 - 多核服务器可以设置高一点可以加快 Follower 副本的同步速度
- 在实际生产环境中,配置了
- 在 Producer 端,如果要改善吞吐量,通常的标配是增加消息批次的大小以及批次缓存时间,即
batch.size
和linger.ms
- 压缩算法也配置上,以减少网络 I/O 传输量,从而间接提升吞吐量
- 在多个线程中共享一个 Producer 实例,就可能会碰到缓冲区不够用的情形。倘若频繁地遭遇
TimeoutException:Failed to allocate memory within the configured max blocking time
这样的异常,那么就必须显式地增加buffer.memory参数值,确保缓冲区总是有空间可以申请的
- Consumer
- 多线程处理方案
fetch.min.bytes
参数值。默认是 1 字节,表示只要 Kafka Broker 端积攒了 1 字节的数据
调优延时(快)
- 在 Broker 端,我们依然要增加
num.replica.fetchers
值以加快 Follower 副本的拉取速度,减少整个消息处理的延时 - 在 Producer 端
- 我们希望消息尽快地被发送出去,因此不要有过多停留,所以必须设置
linger.ms=0
- 同时不要启用压缩
- 不要设置
acks=all
。Follower 副本同步往往是降低 Producer 端吞吐量和增加延时的首要原因。
- 我们希望消息尽快地被发送出去,因此不要有过多停留,所以必须设置
- Consumer 端
- 保持
fetch.min.bytes=1
即可,也就是说,只要 Broker 端有能返回的数据,立即令其返回给 Consumer,缩短 Consumer 消费延时
- 保持