Kafka为什么比RocketMQ快

Kafka为什么比RocketMQ快

假设,我们有一个Web服务,前端向后端请求数据列表A,那么根据我们实现的方法,会有如下表现

传统IO模型(read() & write())

  1. 通过cpu发起io请求,通过read()方法读取数据,此时用户态切换为内核空间;
  2. DMA对硬盘发起IO请求
  3. 硬盘将请求的数据,写回内核空间的paheCache
  4. 完成写操作后,DMA发送完成信号
  5. CPU将数据从内核空间拷贝到用户缓冲区
  6. read()结果到用户空间,此时上下文切换到用户空间,read操作结束
  7. 等待CPU调度发起IO请求,通过write()方法写数据,此时用户态切换为内核空间;
  8. CPU将数据从内核空间拷贝到socket缓冲区
  9. DMA通知网卡发起IO请求
  10. DMA将数据从socket写入网卡
  11. 写入网卡完成,通知写完成信息
  12. 内核空间转为用户空间,write写完成
    4次上下文切换,2次cpu拷贝,2次DMA拷贝;

mmap + write

  1. 发起mmap()调用,建立用户缓冲区和pageCache的地址映射;
  2. DMA对硬盘发起IO请求;
  3. DMA从硬盘中把数据拷贝到pageCache中;
  4. DMA拷贝完成后发送完成信息;
  5. mmap()调用完成,内核态切换为用户态;
  6. 等待cpu调度,通过cpu发起io请求,通过write()方法写数据,此时用户态切换为内核态;
  7. cpu把数据从用户缓冲区拷贝到socket缓冲区;
  8. DMA通知网卡设备要发起IO请求;
  9. DMA开始进行数据拷贝;
  10. DMA拷贝完成,通知写完成信息;
  11. write()方法调用完成,内核态切换为用户态。
    4次上下文切换,一次cpu拷贝,节省了一次从pageCache拷贝到用户缓冲区的cpu拷贝过程

sendFile

  1. 发起sendfile()调用,用户态切换为内核态;
  2. DMA对硬盘发起IO请求;
  3. DMA从硬盘中把数据拷贝到pageCache中;
  4. DMA拷贝完成后发送完成信息;
  5. cpu从pageCache拷贝到socket缓冲区;
  6. DMA通知网卡设备要发起IO请求;
  7. DMA开始进行数据拷贝;
  8. DMA拷贝完成,通知写完成信息;
  9. sendfile()调用完成,内核态切换为用户态。
    2次上下文切换,1次cpu拷贝;

Kafka vs. RocketMQ

Kafka - QPS:17w
RocketMQ - QPS:12w

Kafka:sendFile
RocketMQ:mmap

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值