Kafka 的高性能
家用电脑的性能与配置的关系——价格更昂贵的服务器会有更好的性能
Kafka 使用普通服务器就能实现 TB 级别的传输性能
Kafka 被广泛运用于大数据处理,流式计算,各类日志监控等需要处理海量数据的场景
从以下三方面进行分析
20230716154231.jpg分析Kafka 的高性能会涉及操作系统的一些知识,如果文件系统,PageCache 等
磁盘顺序读写
Kafka 文件在磁盘上如何实现高性能的读写呢?
Kafka 对磁盘的应用,得益于消息队列的存储特性
消息队列对外提供的主要方法是生产和消费,不涉及到 CRUD
写入磁盘时,使用顺序追加的方式来避免低效的磁盘寻址
磁盘有机械硬盘和固态硬盘
- 机械硬盘——成本低,容量大,但每次读写都会寻址,在写入数据
- SSD 固态硬盘—— 性能很高,有着非常低的寻道时间和存取时间,但成本的特别高
Kafka 采用 append 的方式进行顺序写入
提高在机械硬盘上读写的速度
在 Linux 系统中,把数据写入文件系统后,数据存放在操作系统的 page cache 里
写到磁盘的过程 叫做 Flush
刷盘的方式:
- 依靠操作系统进行管理,定时刷盘
- 同步刷盘,比如调用 fsync 等系统函数
Kafka 可以配置一步刷盘,不开启同步刷盘
异步刷盘不需要等写入磁盘后返回消息投递的 ACK
提高了消息发送的吞吐量,降低了请求的延时
批量操作优化
Redis —— 实现了 pipeline 管道批量操作
Kafka 的批量包括批量写入,批量发布等
在消息投递时会将消息缓存起来,然后批量发送
消息端在消息消息时,批量进行拉取,提高了消息的处理速度
Kafka 的数据传输可以配置压缩协议,比如 Gzip 和 Snappy 压缩协议
进行数据压缩时,可以减少网络传输的数据大小,优化网络IO,提升传输速率等
Sendfile 零拷贝
零拷贝是什么?
用户进程进行系统调用——由用户态切换到内核态,待内核处理完之后,再返回用户态
传统的IO流程?:
1、把数据拷贝到内核缓冲区
2、从内核缓冲拷贝到用户空间
3、应用程序处理完成以后,再拷贝回内核缓冲区
Kafka 依赖 Linux 内核提供的 Sendfile 系统调用
数据在内核缓存区完成输入和输出,不需要拷贝到用户空间处理
Kafka 把所有的消息存放在单独的文件里,在消息投递时直接通过 Sendfile 方法发送文件
MMAP技术(也是零拷贝技术)
Kafka 节点运行需要 JVM 的支持,但是 Kafka 并不直接依赖 JVM 堆内存
Kafka 使用 Memory Mapped Files 完成内存映射
Memory Mappend Files 直接对内存地址的操作
调用文件的 read 操作——把数据先读取到内核空间中,然后再复制到用户空间
MMAP将文件直接映射到用户态的内存空间,省去用户空间到内核空间复制的开销
网友评论