Kafka为什么比RocketMQ快
假设,我们有一个Web服务,前端向后端请求数据列表A,那么根据我们实现的方法,会有如下表现
传统IO模型(read() & write())
- 通过cpu发起io请求,通过read()方法读取数据,此时用户态切换为内核空间;
- DMA对硬盘发起IO请求
- 硬盘将请求的数据,写回内核空间的paheCache
- 完成写操作后,DMA发送完成信号
- CPU将数据从内核空间拷贝到用户缓冲区
- read()结果到用户空间,此时上下文切换到用户空间,read操作结束
- 等待CPU调度发起IO请求,通过write()方法写数据,此时用户态切换为内核空间;
- CPU将数据从内核空间拷贝到socket缓冲区
- DMA通知网卡发起IO请求
- DMA将数据从socket写入网卡
- 写入网卡完成,通知写完成信息
- 内核空间转为用户空间,write写完成
4次上下文切换,2次cpu拷贝,2次DMA拷贝;
mmap + write
- 发起mmap()调用,建立用户缓冲区和pageCache的地址映射;
- DMA对硬盘发起IO请求;
- DMA从硬盘中把数据拷贝到pageCache中;
- DMA拷贝完成后发送完成信息;
- mmap()调用完成,内核态切换为用户态;
- 等待cpu调度,通过cpu发起io请求,通过write()方法写数据,此时用户态切换为内核态;
- cpu把数据从用户缓冲区拷贝到socket缓冲区;
- DMA通知网卡设备要发起IO请求;
- DMA开始进行数据拷贝;
- DMA拷贝完成,通知写完成信息;
- write()方法调用完成,内核态切换为用户态。
4次上下文切换,一次cpu拷贝,节省了一次从pageCache拷贝到用户缓冲区的cpu拷贝过程
sendFile
- 发起sendfile()调用,用户态切换为内核态;
- DMA对硬盘发起IO请求;
- DMA从硬盘中把数据拷贝到pageCache中;
- DMA拷贝完成后发送完成信息;
- cpu从pageCache拷贝到socket缓冲区;
- DMA通知网卡设备要发起IO请求;
- DMA开始进行数据拷贝;
- DMA拷贝完成,通知写完成信息;
- sendfile()调用完成,内核态切换为用户态。
2次上下文切换,1次cpu拷贝;
Kafka vs. RocketMQ
Kafka - QPS:17w
RocketMQ - QPS:12w
Kafka:sendFile
RocketMQ:mmap
888

被折叠的 条评论
为什么被折叠?



