Kafka的高性能设计思想

Kafka通过磁盘顺序写提高写入性能,利用PageCache提升I/O效率,避免JVMGC影响。同时,采用零拷贝技术减少数据在内核和用户空间之间的复制,优化网络传输。这种设计使得在生产者和消费者处理速率接近时,大部分操作在内存中完成,极大地提升了数据处理速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 磁盘顺序写

Kafka在数据写入到磁盘时,采用的是顺序写方式(因为磁盘随机写方式的性能很差),即将数据追加到文件的末尾。这种方式极大的降低了寻址时间,提高性能。

2.页面缓存(PageCache)

PageCache是操作系统级别的缓存,它把尽可能多的空闲内存当作磁盘缓存来使用,从而进一步提高I/O效率。另外,当其他进程申请内存时,回收PageCache的代价也很小。

由于PageCache时操作系统级别的缓存,所以不会收到JVM的GC影响。

生产者把消息发送到Kafka之后,消息会先写入到PageCache中,之后再由内存中的处理线程采用同步或异步的方式将PageCache中的数据写入到磁盘中。

消费者会优先从PageCache中获取消息处理,获取不到时才会去磁盘获取。

如果生产者跟消费者的处理速率接近,那么大概率是只会再PageCache中读写数据,磁盘的访问会很少。这样在内存中处理数据的话速度会很快。

3.零拷贝

传统的网络I/O过程如下:

  1. 操作系统把数据从磁盘中读到内核区的 Read Buffer 中。

  2. 用户进程把数据从内核区的Read Bufler 中复制到用户区的 Applcation Buifer 中。

  3. 用户区的 Appicatlon Buter 把数据写入Socket通道,数据被复制到内核区的Socket Buffer 中。

  4. 操作系统把数据从内核区的 Socket Buffer 发送到网卡中。

    可以看出,同一份数据在操作系统内核区的 Read Butter 与用戶区的 Application Buffer 之同需要复制两次。为了进行这两次复制,发生了好几次上下文切换,一会儿是应用程序在执行,一会是操作系统在执行。所以,用这种方式读取数据是比较消耗性能的。
    为了解決这个问题,Kafa 在读取数据时使用了零拷贝技木:直授把数据从内核区的 ReadBufer 复制到 Socket Buffer 中,然后发送到网卡中。这样避免了任操作系统内核区的Read Buffer 和用户区的Application Buffer 之间来回复制数据的弊端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VI仔爱学习

让我看看是谁在学习

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值