Kafka综合运用:怎么在实践中保证Kafka_高性能?
如何选择压缩算法?
选择压缩算法主要考虑压缩比和压缩速率。
- 压缩比是为了节省网络宽带和磁盘存储空间
- 压缩速率影响吞吐量
- 压缩比越高,压缩速率越低。压缩比越低,压缩速率越高
选择压缩算法需要结合实际场景判断,要以性能测试为准,不能仅依赖原理分析
操作系统交换区
操作系统交换区就是swap分区,物理内存不足时,会把物理内存一部分页淘汰放在磁盘上,就是放到swap分区
触发这种交换性能会显著下降。交换越多,下降越快
优化措施
优化生产者
优化生产者可以从三个方面考虑:优化acks、优化批次、启用压缩
优化acks
-
如果追求性能,就应该把acks设置为0
- 如果我们的业务没有严格的消息不丢的要求,完全可以设置为0,可以极大限度的提高性能
-
acks也可以设置为1,但是性能比0差一点
优化批次
优化批次对生产者来说发送消息的速率更快
优化批次对kafka来说,同样数量的消息,批次越大,性能越好
-
当发送者遇到瓶颈后,可以尝试调大批次的参数来提高发送性能。和批次有关的参数有两个
- linger.ms:凑够一个批次的最大等待时间
- batch.size:一个批次最大多少字节
-
在broker的阈值内,调整这两个参数可以提高发送性能
-
批次也不是越大越好
- 批次太大,生产者丢失数据的可能就大
- 批次大小到了一个地步后,性能瓶颈就成了broker处理能力,再调大批次也没用
- 最好的策略还是通过压测来确定批次大小
- 发送者阻塞也可能是缓冲池太小,要调大缓冲池
发送者阻塞要仔细分析,如果是发送速率的问题,调大发送缓冲区治标不治本。如果发送速率没问题,确实是缓冲池太小,就可以调大缓冲池。实践中,其实很难区别两种情况,可以考虑先调大批次,再调整缓冲池
启用压缩
kafka默认不启用压缩,如果开启压缩提高吞吐量,优化措施很简单
- 为了进一步提高kafka吞吐量,我开启了kafka压缩功能,使用了LZ4压缩算法
经过测试LZ4吞吐量最好
优化broker
优化broker可以从五个方面考虑:优化swap、网络读写缓冲区、磁盘IO、主从同步、JVM
优化swap
- kafka非常依赖内存,可以尽量调小参数来优化内存
-
为什么不直接禁用swap?
- 以防万一。物理内存有限,直接禁用可能遇到内存不足。
优化网络读写缓冲区
-
kafka是网络IO频繁的应用,调整网络有关的读写缓冲区,也能优化性能
- 尽量调大读写缓冲区,可以根据broker的硬件资源来确定
优化磁盘IO
-
kafka是磁盘IO密集的应用。可以从两个方向优化磁盘IO
- 使用XFS作为文件系统,XFS比EXT4更适合kafka,XFS性能更好,kafka使用XFS比EXT4性能高5%左右
- 禁用atime,atime是文件最后访问时间,kafka用不上
优化主从同步
-
主从同步的优化其实就是参数都调大
- 调整分区同步数据线程数量,加快同步速率,但是会给主分区和网络带宽带来压力
- 调整同步批次最小最大字节数,越大吞吐量越高,尽量都调大
- 调整分区等待时间,在一批次中同步尽可能多的数据
-
调大一定地步后,瓶颈可能成了分区来不及处理,所以也是在一定限度下调大
优化JVM
- kafka运行在Java上,理论上说优化Java性能的措施也可以优化kafka,但是我不会Java,所以不多做赘述,可以自己查询JVM的优化,比如优化GC