零拷贝原理+kafka中的零拷贝

这篇具有很好参考价值的文章主要介绍了零拷贝原理+kafka中的零拷贝。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

kafka性能之零拷贝

kafka中的零拷贝并不是说完全避免了上下文切换与cpu拷贝的次数, 而是减少这种拷贝次数

传统IO

传统的一次IO流程

read: 数据从磁盘读取到内核缓冲区, 然后从内核缓冲区拷贝到用户缓冲区

write: 数据从用户缓冲区写入socket缓冲区, 然后写入网卡设备

  1. read之后, 也即向操作系统发出IO调用, 用户态切换到内核态
  2. DMA拷贝数据从硬盘到内核缓冲区
  3. CPU拷贝内核缓冲区数据到用户缓冲区, 内核态切换到用户态
  4. write之后, 也即发起IO调用, 用户态切换到内核态
  5. CPU拷贝用户缓冲区数据到socket缓冲区
  6. DMA拷贝socket缓冲区到网卡设备, 内核态切换到用户态

kafka 零拷贝技术,kafka,分布式

  • 上述过程可以看出有4次上下文切换, 4次拷贝. 其实这个地方可以优化, 我们把数据拷贝到用户缓冲区再从用户缓冲区拿出数据到socket纯属多此一举, 如果有一种操作直接可以把数据从内核缓冲区到socket缓冲区的话, 就能减少拷贝操作了

零拷贝mmp优化

mmp优化是基于虚拟内存实现的

虚拟内存是什么东西?简单来讲, 虚拟内存是由于主存不够大而出现的辅存(理论上来说, 主存想多大就多大, 实际上来说怎么可能, 主存越大价格越高, 追求性价比的情况下才出现的虚拟内存)

虚拟内存主要是干啥呢? 虚拟内存可以把内核空间和用户空间的虚拟地址映射到同一个地方, 这样用户对这个映射地址的操作, 内核空间也可以感知到, 那么内核和用户之间就可以减少拷贝了

当引入mmp机制后的IO操作

  1. mmp调用向操作系统发起IO, 用户态切换到内核态
  2. DMA拷贝数据从硬盘到内核缓冲区
  3. 内核态切换到用户态
  4. write之后, 也即发起IO调用, 用户态切换到内核态
  5. CPU拷贝内核缓冲区数据到socket缓冲区
  6. DMA拷贝socket缓冲区到网卡设备, 内核态切换到用户态

kafka 零拷贝技术,kafka,分布式

  • 上述操作可以看出, 我们进行了4次上下文切换, 3次拷贝, 好像还是不够优化, 我们虽然优化了拷贝次数, 但是上下文切换也很耗费时间的, 4次上下文切换能否可以优化呢?对于系统调用来说(read, write,mmp这类函数) 上下文切换是不可避免的, 想要优化就必然减少系统调用次数, 上述我们不可避免使用到了write函数,如果我们将read和write合并成一次系统调用, 在内核中实现磁盘和网课数据传输, 就能够减少上下文切换了, 也就是sendfile优化

  • 通过mmap,进程像读写硬盘一样读写内存(当然是虚拟机内存),也不必关心内存的大小有虚拟内存为我们兜底。

sendfile优化

当引入sendfile优化后的IO操作

  1. 用户进程发起sendfile进行IO,用户态切换至内核态
  2. DMA拷贝数据从硬盘到内核缓冲区
  3. CPU拷贝内核缓冲区到socket缓冲区
  4. DMA拷贝数据从socket缓冲区到网卡
  5. 内核态切换到用户态, sendfile函数返回

kafka 零拷贝技术,kafka,分布式

  • 上述操作发现, 我们只进行了2次上下文切换, 这下上下文切换好像是优化到极致了,但是依旧是3次拷贝, 如何继续优化拷贝次数? Linux 2.4 版本之后,对 sendfile 做了升级优化,引入了 SG-DMA技术,其实就是对DMA拷贝加入了 scatter/gather 操作,它可以直接从内核空间缓冲区中将数据读取到网卡,无需将内核空间缓冲区的数据再复制一份到 socket 缓冲区,从而省去了一次 CPU拷贝。

sendfile +DMA scatter/gather优化

当使用优化后的IO操作

  1. 用户进程发起sendfile进行IO,用户态切换至内核态
  2. DMA拷贝数据从硬盘到内核缓冲区
  3. CPU直接将文件描述符等信息(内核缓冲区的地址+偏移量)复制到socket缓冲区中
  4. DMA根据文件描述符拷贝内核区数据到网卡
  5. 内核态切换到用户态, sendfile函数返回

kafka 零拷贝技术,kafka,分布式

  • 至此, 我们通过两次上下文切换+两次拷贝完成零拷贝终极优化
  • 这里的两次拷贝不是cpu拷贝, 而是DMA拷贝, 零拷贝的意义也是在减少cpu拷贝, 使用mmp和sendfile实现的也叫做零拷贝, 只是不够那么零

Kafka是怎么使用零拷贝的

简单来说:

Kafka的两个过程

  1. Producer生产数据到broker ->数据持久化到磁盘 -> 使用了mmp
  2. Consumer从broker获取数据 ->磁盘文件发送到网卡 -> 使用了sendfile

kafka 零拷贝技术,kafka,分布式

mmap也有一个很明显的缺陷——不可靠,写到mmap中的数据并没有被真正的写到硬盘,操作系统会在程序主动调用flush的时候才把数据真正的写到硬盘。Kafka提供了一个参数——producer.type来控制是不是主动flush;如果Kafka写入到mmap之后就立即flush然后再返回Producer叫同步(sync);写入mmap之后立即返回Producer不调用flush叫异步(async)。

RocketMQ选择了mmap + write这种零拷贝方式,适用于业务级消息这种小块文件的数据持久化和传输;而Kafka采用的是sendfile这种零拷贝方式,适用于系统日志消息这种高吞吐量的大块文件的数据持久化和传输。但是值得注意的一点是,Kafka的索引文件使用的是mmap+write方式,数据文件使用的是sendfile方式。

这里有一篇详细一点的文章, 网上讲kafka中如何实现零拷贝的好像比较少, 大部分围绕着零拷贝是什么展开的, 找了半天觉得这个比较好,感兴趣的可以戳这个大佬的链接文章来源地址https://www.toymoban.com/news/detail-845879.html

到了这里,关于零拷贝原理+kafka中的零拷贝的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【分布式技术专题】「分布式技术架构」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)

    Tomcat的总体结构从外到内进行分布,最大范围的服务容器是Server组件,Service服务组件(可以有多个同时存在),Connector(连接器)、Container(容器服务),其他组件:Jasper(Jasper解析)、Naming(命名服务)、Session(会话管理)、Logging(日志管理)、JMX(Java 管理器扩展服务

    2024年01月24日
    浏览(28)
  • 【分布式技术专题】RocketMQ延迟消息实现原理和源码分析

    痛点背景 业务场景 假设有这么一个需求,用户下单后如果30分钟未支付,则该订单需要被关闭。你会怎么做? 之前方案 最简单的做法,可以服务端启动个定时器,隔个几秒扫描数据库中待支付的订单,如果(当前时间-订单创建时间)30分钟,则关闭订单。 方案评估 优点:是实

    2024年02月13日
    浏览(35)
  • 【软件开发/设计】分布式架构中的组件(如Kafka、MongoDB和Nginx)如何进行容器化部署

    容器化部署是将应用程序及其依赖打包成一个容器镜像,然后在任何支持容器的环境中运行这个镜像的过程。在分布式架构中,像Nginx、MongoDB、Kafka这样的组件通过容器化可以更易于部署、扩展和管理。以下是这些组件容器化部署的一般步骤和原理: 容器化部署的一般步骤

    2024年02月04日
    浏览(33)
  • 分布式技术原理与实战45讲--05 第05讲:共识问题:区块链如何确认记账权?

    本课时我们主要讲解“共识问题:区块链如何确认记账权?” 区块链可以说是最近几年最热的技术领域之一,区块链起源于中本聪的比特币,作为比特币的底层技术,本质上是一个去中心化的数据库,其特点是 去中心化、 公开透明,作为分布式账本技术,每个节点都可以参

    2024年02月03日
    浏览(31)
  • 《大数据技术原理与应用(第3版)》期末复习——第三章分布式文件系统HDFS习题

    分布式文件系统的结构 1、 名称节点 (“主节点”): 负责文件和目录的创建、删除和重命名等,同时管理着数据节点和文件块之间的映射关系。 2、 数据节点 (“从节点”): 负责数据的存储和读取。在存储时,由名称节点分配存储位置,然后由客户端把数据直接写入相应

    2024年02月12日
    浏览(34)
  • 【程序猿包邮送书:第四期】《分布式统一大数据虚拟文件系统——Alluxio原理、技术与实践》

    🌹欢迎来到 爱书不爱输的程序猿 的博客, 本博客致力于知识分享,与更多的人进行学习交流 🚩🚩🚩 点击直达福利 当今,我们的世界已经进入一个数据时代。随着互联网、物联网、5G、大数据、人工智能、自动驾驶、元宇宙等信息技术的快速发展,人们在产生、收集、存储

    2024年02月09日
    浏览(29)
  • 大数据技术原理与应用 概念、存储、处理、分析和应用(林子雨)——第三章 分布式文件系统HDFS

    大数据要解决数据存储问题,所以有了分布式文件系统(DFS),但可能不符合当时的一些应用需求,于是谷歌公司开发了GFS(Google file System)。GFS是闭源的,而HDFS是对GFS的开源实现。 1.GFS和DFS有什么区别? GFS(Google File System)和DFS(Distributed File System)都是分布式文件系统,

    2024年02月03日
    浏览(55)
  • kafka的零拷贝

    传统的数据文件拷贝过程如下图所示,大概可以分成四个过程: 磁盘----》read buffer-----》application buffer-------》socket buffer---------》网卡-------》发送给消费者 在正式介绍零拷贝结束(Zero-Copy)之前,我们先简单介绍一下DMA(Direct Memory Access)技术。DMA,又称之为直接内存访问,

    2024年02月11日
    浏览(30)
  • 【大数据工具】Kafka伪分布式、分布式安装和Kafka-manager工具安装与使用

    Kafka 安装包下载地址:https://archive.apache.org/dist/kafka/ 1. Kafka 伪分布式安装 1. 上传并解压 Kafka 安装包 使用 FileZilla 或其他文件传输工具上传 Kafka 安装包: kafka_2.11-0.10.0.0.tgz 解压安装包 2. 编辑配置文件 3. 拷贝并修改配置文件 分别修改 server2.properties、server3.properties 4. 创建日志

    2024年02月14日
    浏览(31)
  • 分布式消息服务kafka

    什么是消息中间件? 消息中间件是分布式系统中重要的组件,本质就是一个具有接收消息、存储消息、分发消息的队列,应用程序通过读写队列消息来通信。 例如:在淘宝购物时,订单系统处理完订单后,把订单消息发送到消息中间件中,由消息中间件将订单消息分发到下

    2024年02月01日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包