type
status
date
slug
summary
tags
category
icon
password
Property
May 9, 2023 05:56 AM
本文主要介绍了Kafka的消息零拷贝问题
 
在正式进入这个Kafka零拷贝问题之前,我们先来看看Kafka是如何一步一步将消息从接受到存储在本地的。

🤔 Kafka是如何接收并存储消息的?

 
(1)生产者发送消息:
当 Kafka 生产者向 Kafka 集群发送消息时,生产者首先将消息写入内存缓冲区,然后通过 Socket 将缓冲区中的数据传输到网络。如果不使用零拷贝技术,那么在传输之前,必须先将数据从应用程序缓冲区复制到内核缓冲区。通过使用零拷贝技术,可以直接将应用程序缓冲区的数据传输到网络,避免了数据复制所带来的开销,提高了发送消息的效率。这一步也就是网络数据持久化到磁盘 (Producer 到 Broker)。
 
(2)消费者读取消息:
当 Kafka 消费者从 Kafka 集群读取消息时,Kafka 会将消息存储在磁盘上,并且按照特定的格式进行编码。如果使用传统方法将这些消息传输到消费者端,则需要将消息从磁盘读取到内存中,并将其解码为可供应用程序使用的形式。但是,通过使用零拷贝技术,可以直接将消息从磁盘传输到网络,同时减少了解码所需的开销,提高了读取消息的效率。这一步也就是磁盘文件通过网络发送(Broker 到 Consumer)。

🤔 所以说什么是零拷贝呢?

 
零拷贝并不是不需要拷贝,通常是指在IO读写过程中减少不必要的拷贝次数。
传统的Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。我们都知道,传统意义上无论一个 CPU 是否具有内存映射 I/O,它都需要寻址设备控制器以便与它们交换数据。CPU 可以从 I/O 控制器每次请求一个字节的数据,但是这么做会浪费 CPU 时间,所以经常会用到一种称为直接内存访问(Direct Memory Access) 的方案,简称DMA,如下图所示。
 
这样做最大的好处是可以减少磁盘 I/O 的操作,因为如果所请求的数据已经存放在操作系统的高速缓冲存储器中,那么就不需要再进行实际的物理磁盘 I/O 操作。但是数据传输过程中的数据拷贝操作却导致了极大的 CPU 开销,限制了操作系统有效进行数据传输操作的能力。
 
notion image
 
有时候应用程序不需要在数据传输的过程中访问数据,那么数据从Linux 的页缓存拷贝到用户进程的缓冲区中就可以完全避免,零拷贝零拷贝技术可以获得较好的性能。Linux 中提供类似的系统调用主要有 mmap(),sendfile() 以及 splice(),如下图流程所示
 
notion image
 

🤔 所以说Kafka的零拷贝问题有哪些比较重要的注意事项?

 
(1)零拷贝的对象:
零拷贝其本质就是避免了数据在内核空间和用户空间之间的复制,因此可以减少 CPU 上下文切换的次数,从而提高数据传输效率。但是,当数据太小,甚至比缓冲区还小时,这种优势就会被抵消。并且零拷贝技术本身避免了数据的重复复制,对于较小的数据块,内存的利用率并不会得到很大的提高。使用零拷贝技术可以减少数据从应用程序到内核的传输次数,这意味着可以减少系统调用的次数。但是,当需要发送大量的小数据块时,系统调用次数的优势就会变得微不足道。因此从这三个方面来看,零拷贝技术只适用于生产者发送大大块数据。对于较小的数据块,由于没有足够的优势,使用零拷贝技术可能不如使用传统的复制方式更高效。
 
(2)零拷贝技术的优化:
上文中提到了,生产者将大块消息数据通过NIC读取然后通过DMA转移到HD中,此过程中,虽然没有直接依赖NIC性能,但是如果合理的调整TCP参数,更合理的利用网络贷款降低网络延时,降低拥塞与延迟,进一步提升网络性能,可以简介加速数据传输,提高零拷贝技术的效率。
 
(3)Kafka的零拷贝技术支持范围:
Kafka零拷贝并不支持所有的操作系统和文件系统,例如Windows操作系统下的NTFS文件系统就不支持零拷贝技术。
 
(4)Kafka性能问题:
Kafka主要牵扯到两类硬件,一类是磁盘,一类是内存。磁盘主要是在生产者生产数据之后,需要将数据存储在分区中,这时候磁盘性能会影响生产者生产数据的延迟,磁盘性能越高,延时越低。而对于内存来说Kafka本身并不直接需要太多JVM内存,但是由于Kafka需要使用大量的内存作为缓存,所以一般生产环境建议不要将Kafka与其他重要应用程序部署在同一台服务器上,以避免两者共享内存导致性能降低。
 
致谢:
💡
有关Kafka的零拷贝技术的问题,欢迎您在底部评论区留言,一起交流~
 
 
Kafka自学笔记(三):关于Kafka消息顺序问题Kafka自学笔记(五):关于消息生产与消费失败常见问题
fntp
fntp
多一点兴趣,少一点功利
公告
type
status
date
slug
summary
tags
category
icon
password
Property
Sep 5, 2023 06:04 AM
📝 博客只为了记录我的学习生涯
😎 我的学习目标是成为一名极客
🤖 我热爱开源当然我也拥抱开源
💌 我期待能收到你的Email留言
📧 我的邮箱:stickpoint@163.com
欢迎交流~