大厂真题-Kafka为什么这么快之零拷贝

一、零拷贝技术的背景

在传统的数据传输过程中,当需要将磁盘中的数据发送到远程服务器时,数据通常需要经过多次拷贝和上下文切换。具体来说,这些步骤包括:

四次拷贝

  1. 从硬盘到内核缓冲区
    • 当用户进程通过read()系统调用请求读取数据时,CPU会发起指令,利用DMA(Direct Memory Access,直接内存访问)控制器将数据从硬盘中拷贝到内核的读缓冲区(Page Cache)中。这一步骤是DMA完成的,不需要CPU的直接参与,但算作一次数据拷贝。
  2. 从内核缓冲区到用户缓冲区
    • 数据到达内核缓冲区后,CPU会介入,将数据从内核缓冲区拷贝到用户进程的缓冲区中。这是第二次数据拷贝,发生在内核态和用户态之间。
  3. 从用户缓冲区到内核Socket缓冲区
    • 当用户进程准备将数据发送出去时,它会通过write()系统调用将数据从用户缓冲区拷贝到内核的网络Socket缓冲区中。这是第三次数据拷贝,同样发生在内核态和用户态之间。
  4. 从内核Socket缓冲区到网卡
    • 最后,CPU会再次利用DMA控制器,将Socket缓冲区中的数据拷贝到网卡,以便通过网络发送。这是第四次数据拷贝,也是由DMA完成的,但算作一次拷贝操作。

四次上下文切换

在四次拷贝的过程中,还伴随着四次上下文切换:

  1. read()系统调用时
    • 用户进程从用户态切换到内核态,以便CPU能够处理read()请求。这一步用户请求是阻塞的
  2. read()系统调用完成后
    • CPU将数据从硬盘拷贝到内核缓冲区后,上下文从内核态切换回用户态,read()调用返回。
  3. write()系统调用时
    • 用户进程再次从用户态切换到内核态,以便CPU能够处理write()请求。
  4. write()系统调用完成后
    • CPU将数据从Socket缓冲区拷贝到网卡后,上下文从内核态切换回用户态,write()调用返回。
  1. 从磁盘读取数据到内核缓冲区。
  2. 将内核缓冲区中的数据拷贝到用户空间缓冲区。
  3. 应用程序通过write()方法将用户空间缓冲区中的数据拷贝到内核空间的Socket Buffer。
  4. 将Socket Buffer中的数据拷贝到网卡缓冲区(NIC Buffer)。
  5. 网卡缓冲区将数据传输到目标服务器。

图中的四个方框标出来的是这个过程中的四次拷贝,四个椭圆标记出来的是4次上下文切换 

在这个过程中,数据被拷贝了四次,并且存在两次不必要的拷贝(从内核空间到用户空间的拷贝),这导致了CPU资源的浪费和性能的下降。

二、Kafka中的零拷贝实现

Kafka在设计和实现时充分利用了零拷贝技术,以提高数据传输的效率和系统的吞吐量。Kafka中的零拷贝主要通过sendfile系统调用来实现,这个过程在Linux系统中尤为高效。

  1. sendfile系统调用
    • 当Kafka需要发送数据时,它会使用sendfile系统调用,该调用允许数据直接从文件描述符(磁盘文件)传输到另一个文件描述符(通常是套接字),而无需将数据读入用户空间缓冲区。
    • sendfile通过DMA(Direct Memory Access)技术,将数据直接从磁盘读取到内核的读取缓冲区,然后通过DMA引擎将数据从内核缓冲区传输到网卡设备,而无需经过用户空间。
  2. 减少拷贝次数和上下文切换
    • 在使用零拷贝的情况下,数据只经历两次拷贝:一次是从磁盘到内核缓冲区,另一次是从内核缓冲区到网卡缓冲区。
    • 同时,由于减少了用户空间和内核空间之间的切换,CPU的上下文切换次数也显著减少,这进一步提高了性能。
  3. FileChannel.transferTo()方法
    • 在Java中,Kafka可能通过FileChannel.transferTo()方法的底层实现来利用sendfile系统调用。该方法允许直接将字节从文件通道传输到另一个可写字节通道,而无需将数据读入用户空间缓冲区。
  4. Mmap技术

         前面三条说的都是sendFile相关的,Kafka还用到了另外一种零拷贝技术MMapmmap是一种内存映射文件的方法,它可以将文件映射到进程的地址空间中,使进程能够直接访问和操作文件内容,而无需进行显式的拷贝操作。这种技术对于提高文件访问速度和减少内存使用非常有效。
    • 在Kafka服务端(Broker),mmap主要用于读操作。当客户端(这里是Consumer)向Kafka服务端发送请求时,服务端会利用mmap技术直接读取请求数据,并将其内容发送给消费者。这种读取方式避免了不必要的内存拷贝,从而提高了数据传输效率。此外,mmap还可以减少内存的使用,因为它只映射文件的一部分到内存中,而不是将整个文件加载到内存中。

    • Mmap是一种内存映射文件的方法,它可以将文件映射到进程的地址空间中,使进程能够直接访问和操作文件内容,而无需进行显式的拷贝操作。这种技术对于提高文件访问速度和减少内存使用非常有效。

三、零拷贝的优势

  1. 提高数据传输效率:通过减少数据拷贝次数和CPU上下文切换,零拷贝技术显著提高了数据传输的效率。
  2. 降低延迟:减少了数据传输的中间环节,降低了数据传输的延迟。
  3. 提高吞吐量:优化了数据传输过程,使得Kafka能够处理更多的并发请求,提高了系统的吞吐量。
  4. 减少资源消耗:降低了CPU和内存的资源消耗,提高了系统的整体性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147911.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【HTML5】html5开篇基础(2)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…

Python中requests模块(爬虫)基本使用

Python的requests模块是一个非常流行的HTTP库,用于发送HTTP/1.1请求。 一、模块导入 1、requests模块的下载: 使用包管理器下载,在cmd窗口,或者在项目的虚拟环境目录下: pip3 install -i https://pypi.tuna.tsingh…

DC-DC选型

Buck、Boost、Buck-boost 同步非同步 隔离与非隔离 电源效率 模式选择 选型 总结

【机器学习】TensorFlow编程基础

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 TensorFlow编程基础张量(Tensor)计算图(Computational Graph)会话(Session)基本…

数据包签名校验的Web安全测试实践

01 测试场景 在金融类的Web安全测试中,经常可以见到Web请求和响应数据包加密和签名保护,由于参数不可见,不能重放请求包,这类应用通常不能直接进行有效的安全测试,爬虫也爬不到数据。 02 解决思路 对于这类应用&am…

STaR: Bootstrapping Reasoning With Reasoning

STaR: Bootstrapping Reasoning With Reasoning 基本信息 博客贡献人 燕青 作者 Eric Zelikman, Yuhuai Wu, Jesse Mu, et al. from Stanford University and Google Research 标签 Large Language Model, Chain-of-thought, Fine-tuning 摘要 生成逐步的“思维链”逻…

揭秘!高校如何逆袭,在算法与科技竞技场中脱颖而出?

目录 揭秘!高校如何逆袭,在算法与科技竞技场中脱颖而出? 一、算法秘境:深度挖掘,教学相长 二、跨界融合:场景为王,合作共赢 企业和高校之间在:场景,算法,数据,算力的优势,高校优势不明显,仅仅在算法方面存在一些优势但并不明显。高校怎样做 揭秘!高校如何逆袭…

2024最新盘点:国内外主流的10款流程管理系统!

本文将盘点十款流程管理系统,为企业选型提供参考! 想象一下,在一个企业中,各个部门的工作流程混乱,审批环节繁琐,信息传递不及时。这时,流程管理系统就如同一位高效的指挥官,将企业的…

软件测试干了5年,都白忙活了。。。

本科非计算机专业,在深圳做了5年软件测试工作,从一开始一脸懵的点点点,到现在会自动化测试了,浅谈一下从事软件测试的一点点心得体会,仅供参考交流。如果你本科且非计算机专业的话可以试下(但就目前环境建议…

使用Fiddler Classic抓包工具批量下载音频资料

1. 通过F12开发者工具,下载音频文件 浏览器打开音频列表->F12快捷键->网络->媒体,播放一个音频文件,右边媒体下生成一个音频文件,右击“在新标签页中打开”,可以下载这个音频文件。 2.通过Fiddler Classic抓…

简单题100. 相同的树 (python)20240922

问题描述: python: # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right rightclass Solution(object)…

浅谈EXT2文件系统----inode table

Inode table概述 在 EXT2 文件系统中,inode 表(Inode Table)是一个非常重要的结构,用于存储文件和目录的元数据。每个文件和目录都由一个 inode(索引节点)来表示,inode 中包含了关于该文件或目…

中兴交换机三层配置

中兴交换机三层配置 目的:将1-10端口划分到3001vlan,11-20端口划分到3002vlan中去 客户端客户端IPvlan网关主机A88.88.1.1203001192.168.1.254主机B192.168.100.1303002192.168.100.254 1、通过Console线登录设备 **********************************…

CCPQT:2024年10月珠海学术会议

第三届计算、通信、感知与量子技术国际会议(CCPQT 2024) The 3rd International Conference on Computing, Communication, Perception and Quantum Technology 会议地点:中国珠海 会议时间:2024年10月25日-27日 主办单位&…

D盘格式化了,数据怎么恢复?

在日常使用电脑的过程中,我们有时可能会遇到一些意外情况,比如不小心格式化了D盘,导致重要数据丢失。面对这种情况,很多人可能会感到手足无措,不知道该如何恢复丢失的数据。其实,只要掌握正确的方法&#x…

精益生产管理咨询公司哪家好?这份攻略请拿好

面对市场上琳琅满目的精益生产管理咨询公司,企业往往难以抉择:精益生产管理咨询公司哪家好?本文,天行健咨询将从专业性、实战经验、定制化服务、持续支持等多个维度,深入探讨如何评估并选择一家优秀的精益生产管理咨询…

24 C 语言常用的字符串处理函数详解:strlen、strcat、strcpy、strcmp、strchr、strrchr、strstr、strtok

目录 1 strlen 1.1 函数原型 1.2 功能说明 1.3 案例演示 1.4 注意事项 2 strcat 2.1 函数原型 2.2 功能说明 2.3 案例演示 2.4 注意事项 3 strcpy 3.1 函数原型 3.2 功能说明 3.3 案例演示 3.4 注意事项 4 strcmp 4.1 函数原型 4.2 功能说明 4.3 案例演示 …

2021 电子设计大赛-周期信号波形识别及参数测量装置( j 题)-SZPT领跑团队-凌云

目录 一、团队介绍 二、队伍介绍 三、题目要求 四、设计摘要 五、题目分析 1.基本要求 2.发挥部分 六、总体设计框图 七、硬件电路组成 (1)挡位检测 (2)挡位选择 (3)电压抬升电路 (…

商标管理软件如何实现高效商标申请与管理?

在数字化时代,商标管理正逐步向智能化、自动化转型。企业对于商标管理软件的需求不再仅仅局限于内部流程的优化,更希望这些软件能够与外部系统无缝对接,实现一键递交官方的高效体验。启服云商标管理软件凭借其强大的技术实力和丰富的行业经验…

Python之一些列表的练习题

1.比较和对比字符串、列表和元组。例如,它们可以容纳哪类内容以及在数据结构上可以做哪些操作。 1. 内容类型:- 字符串: 只能包含字符(文本)。- 列表: 可以包含任意类型的数据,如数字、字符串、其他列表等。- 元组: 可以包含任意类型的数据,与列表类似。3. 操作:(1…