Kafka 零拷贝总结

今天看了些视频 感觉kafka 零拷贝和之前自己理解的有些出入

所以来总结一下

先说如果没有零拷贝 数据是怎么从磁盘发送到网卡的?

操作系统分内核态与用户态,从磁盘io读取数据这个操作要通过系统调用 从用户态切换到内核态进行,

所以

1.read()命令 发起系统调用 DMA把数据从磁盘拷贝到内核态的内核缓冲区 然后cpu把数据从内核态拷贝到用户态

2.write()命令 cpu把数据从用户态拷贝到内核态的socket缓冲区,然后用dma发送给网卡

这个过程中 一共发生两次系统调用 四次拷贝

kafka的零拷贝有mmap 和 sendfile两种方式

**mmap:**相当于把内核空间的缓冲区映射到用户空间 拷贝的只是这种映射关系,并不真的拷贝数据

使用mmap获取映射,再用send 发送数据(从内核缓冲区到socket缓冲区)

整个过程发送 两次系统调用和两次拷贝 只发生一次cpu拷贝

sendfile 真正的零拷贝,只有一次系统调用 共用一个内核缓冲区,减少了内核缓冲区到socket缓冲区的拷贝,整个过程只有一次系统调用和一次拷贝 且完全消除cpu拷贝(若是此时数据在pagecache里 甚至可以再减少一次磁盘DMA拷贝的过程)

是最快的方式

那为什么rabbitmq不也使用sendfile的拷贝方式 而是选择了mmap呢?

rabbitmq 有一些功能如死信队列的投递要用到时间发送的内容

而sendfile只会返回成功发送的字节数 所以rmq只能用mmap

相关推荐
旺仔Sec8 分钟前
HBase 分布式集群部署实战:从解压到启动的完整指南
数据库·分布式·hbase
晚霞的不甘17 小时前
CANN-MoE模型推理加速实战
人工智能·分布式·python
武子康20 小时前
Java-221 RocketMQ 消息存储核心原理:CommitLog、ConsumerQueue、IndexFile 与消息过滤机制
java·大数据·分布式·消息队列·rabbitmq·rocketmq·java-rocketmq
或与且与或非1 天前
rabbitmq选举集群搭建
分布式·rabbitmq·ruby
无心水1 天前
【分布式利器:金融级】金融级分布式架构开源框架全景解读
人工智能·分布式·金融·架构·开源·wpf·金融级框架
Swift社区1 天前
分布式能力在鸿蒙 PC 上到底怎么用?
分布式·华为·harmonyos
Devin~Y1 天前
大厂Java面试实战:Spring Boot微服务、Redis缓存、Kafka消息队列与Spring AI RAG
java·spring boot·redis·kafka·mybatis·spring mvc·hikaricp
无心水1 天前
【分布式利器:SOAF】蚂蚁开源的金融级微服务全家桶:SOFAStack 核心架构与实战选型对比
人工智能·分布式·微服务·金融·架构·开源·分布式利器
深蓝电商API1 天前
分布式电商爬虫架构:Scrapy-Redis+消息队列的集群部署
分布式·爬虫·架构
阿正的梦工坊1 天前
RabbitMQ 消息队列详解:从原理到实战
分布式·rabbitmq