• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

RocketMQMMAP的零拷贝技术方案

武飞扬头像
摆烂的小趴菜
帮助1

本期我们来聊一聊RocketMQ的一些亮点元素,比如说RocketMQ的零拷贝方案,先来一张RocketMQ接受数据拷贝时的示意图:
学新通

       传统的消息中间件在进行数据接入和接出的时候,操作系统会先将数据读到内存中,然后应用在将数据读到应用层中,对数据进行处理。同样的,在进行持久化的过程中,也会将数据先写进文件缓冲区,然后再写入文件中去。

       为了提高性能,RocketMQ对持久化过程进行一个升级,专门开辟了一块MappedByteBuffer(磁盘映射区域),将用户空间的虚拟地址和内核空间的虚拟地址指向同一个物理内存地址,这样用户空间和内核空间共享同一个内存数据,就可以直接对磁盘进行操作了,从而省去了cpu拷贝进缓冲区的操作。节省了很大的资源开销。像这种创建磁盘映射的实现,我们称之为MMAP。而这种通过直接操作硬盘的行为实现性能缩减的技术,我们统称为零拷贝技术

       对于资源开销方面的问题,我们可以看到,流程中只有两种拷贝方式,DMA拷贝和CPU拷贝,由于两者性质的不同,效率自然也不一样。举个例子:如果说DMA拷贝需要2ms的话,那么CPU拷贝大约需要200ms,虽然看起来RocketMQ只做了一步拷贝过程的省略,但是资源开销却正正经经减少了将近一半。

       当然,零拷贝技术不仅仅是RocketMQ一家独有的技术,也不仅仅只有MMAP一种零拷贝技术。比如说市面上另一种零拷贝方案:Sendfile。
       Sendfile是通过直接操作磁盘上文件的方式进行零拷贝实现的,但是这种实现有一个弊端,就是只能获取到文件的描述信息,无法真正的在应用层获取到实际的数据,因此根本无法在应用层对数据进行进一步的处理,比如过滤等等。
       目前Kafka和Tomcat内部使用就是Sendfile这种零拷贝。

Ps:关于DMA
如果我们始终让CPU来进行各种数据传输工作,会特别浪费。一方面,我们的数据传输工作用不到多少CPU核新的“计算”功能。另一方面,CPU的运转速度也比I/O操作要快很多。所以,我们希望能够给CPU“减负”。
于是,工程师们就在主板上放上了DMAC这样一个协处理器芯片。通过这个芯片,CPU只需要告诉DMAC,我们要传输什么数据,从哪里来,到哪里去,就可以放心离开了。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiaeaba
系列文章
更多 icon
同类精品
更多 icon
继续加载