rocketMQ rocketMQ 高性能分析之ZeroCopy零拷贝技术

Posted guhualin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rocketMQ rocketMQ 高性能分析之ZeroCopy零拷贝技术相关的知识,希望对你有一定的参考价值。

高效原因

  1. CommitLog顺序写, 存储了MessagBody、message key、tag等信息
  2. ConsumeQueue随机读 + 操作系统的PageCache + 零拷贝技术ZeroCopy
    2.1 零拷贝技术
read(file, tmp_buf, len);
write(socket, tmp_buf, len);

例子:将一个File读取并发送出去(Linux有两个上下文,内核态,用户态)

  1. File文件的经历了4次copy
  1. 调用read,将文件拷贝到了kernel内核态
  2. CPU控制 kernel态的数据copy到用户态
  3. 调用write时,user态下的内容会copy到内核态的socket的buffer中
  4. 最后将内核态socket buffer的数据copy到网卡设备中传送
  1. 缺点:增加了上下文切换、浪费了2次无效拷贝(即步骤2和3)

2.2 ZeroCopy

请求kernel直接把disk的data传输给socket,而不是通过应用程序传输。Zero copy大大提高了应用程序的性能,减少不必要的内核缓冲区跟用户缓冲区间的拷贝,从而减少CPU的开销和减少了kernel和user模式的上下文切换,达到性能的提升
对应零拷贝技术有mmap及sendfile
2.2.1 mmap:小文件传输快
RocketMQ 选择这种方式,mmap+write 方式,小块数据传输,效果会比 sendfile 更好
2.2.2 sendfile:大文件传输比mmap快

2.3 Java中的TransferTo()实现了Zero-Copy
2.4 应用:Kafka、Netty、RocketMQ等都采用了零拷贝技术

以上是关于rocketMQ rocketMQ 高性能分析之ZeroCopy零拷贝技术的主要内容,如果未能解决你的问题,请参考以下文章

RocketMQ高手之路系列之十一:RocketMQ如何实现高性能读写

源码分析RocketMQ系列索引

RocketMQ事务消息实战

RocketMQ高性能之底层存储设计

RocketMQ源码分析之RocketMQ事务消息实现原下篇(事务提交或回滚)

RocketMQ源码分析之从官方示例窥探:RocketMQ事务消息实现基本思想