You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

32 lines
1.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

![[Pasted image 20231122155709.png]]
消费者读取数据流程:
1. 消费者发送请求给kafka服务
2. kafka服务去os cache缓存读取数据缓存没有就去磁盘读取数据
3. 从磁盘读取了数据到os cache缓存中
4. os cache复制数据到kafka应用程序中
5. kafka将数据复制发送到socket cache中
6. socket cache通过网卡传输给消费者
## 传统IO
![[Pasted image 20231122160218.png]]
伪代码:
```text
buffer = File.read
Socket.send(buffer)
```
1、第一次将磁盘文件读取到操作系统内核缓冲区
2、第二次将内核缓冲区的数据copy到application应用程序的buffer
3、第三步将application应用程序buffer中的数据copy到socket网络发送缓冲区(属于操作系统内核的缓冲区)
4、第四次将socket buffer的数据copy到网卡由网卡进行网络传输。
传统方式读取磁盘文件并进行网络发送经过的四次数据copy是非常繁琐的。实际IO读写需要进行IO中断需要CPU响应中断(带来上下文切换)尽管后来引入DMA来接管CPU的中断请求但四次copy是存在“不必要的拷贝”的。
重新思考传统IO方式会注意到实际上并不需要第二个和第三个数据副本。应用程序除了缓存数据并将其传输回套接字缓冲区之外什么都不做。相反数据可以直接从读缓冲区传输到套接字缓冲区。显然第二次和第三次数据copy 其实在这种场景下没有什么帮助反而带来开销,这也正是零拷贝出现的意义。
## kafka零拷贝IO
1.消费者发送请求给kafka服务
2.kafka服务去os cache缓存读取数据缓存没有就去磁盘读取数据
3.从磁盘读取了数据到socket缓存中
4.socket直接将数据发送给网卡
5.通过网卡将数据传输给消费者