Kafka的零拷贝

 传统的IO模型

如果要把磁盘中的某个文件发送到远程服务器需要经历以下几个步骤

(1) 从磁盘中读取文件的内容,然后拷贝到内核缓冲区

(2) CPU把内核缓冲区的数据赋值到用户空间的缓冲区

(3) 在用户程序中调用write方法,把用户缓冲区的数据拷贝到内核下面的Socket Buffer中

(4) 把内核下面的Socket Buffer中的数据赋值到网卡的缓冲区

(5) 网卡的缓冲区把数据传输到目标服务器上

我们可以看到这个过程中经历了四次拷贝

我们所说的零拷贝并不是没有拷贝(数据赋值),去掉的两次浪费的拷贝分别是

1.从内核空间赋值到用户空间的拷贝 

2.从用户空间再次复制到内核空间的拷贝

由于用户空间和内核空间的切换会带来CPU的上下文切换,对于CPU的性能也会造成影响

零拷贝就是把这两次多余的拷贝省略掉,应用程序可以直接把磁盘中的数据从内核中直接传输给Socket,而不再需要经过应用程序所在的用户空间,所以零拷贝不是没有拷贝,而是对于用户空间来说,不再需要进行数据拷贝,这只是较少了不必要的拷贝次数而已

零拷贝的原理

 在程序中实现零拷贝的方式:

1. 在Linux中,零拷贝技术依赖于底层的sendfile方法实现

2. 在Java中,FileChannel.transferTo()方法的底层调用就是sendfile方法

3. MMAP文件映射机制

mmap(即 memory-mapped file)是一种内存映射文件的机制,它可以让程序将一个文件映射到进程的地址空间,从而实现文件和内存的无缝转换。

具体来说,使用mmap将一个文件映射到进程的地址空间后,该文件就可以像普通的内存一样被读写,甚至可以在多个进程之间共享,而不需要进行繁琐的文件读写操作。在使用mmap时,操作系统会自动将文件的某些部分或者整个文件的内容映射到内存中,而这些映射的内存区域可以被当作普通的内存指针来访问,从而实现对文件内容的访问。

mmap的一些主要应用场景包括:

实现零拷贝(zero-copy)网络传输:可以将网络数据直接映射到进程的地址空间,避免了数据拷贝的开销。
实现高性能的数据库和搜索引擎:将大规模的数据文件映射到内存中,可以大大提升数据的访问速度。
实现内存共享和进程间通信:多个进程可以映射同一个文件到它们各自的地址空间,从而实现进程间共享数据的目的。
————————————————
版权声明:本文为CSDN博主「鱼跃鹰飞」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Chang_Yafei/article/details/129505855

Kafka采用sendfile的方式去完成拷贝的过程

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【普通人维护windows的方法,不中毒,不弹窗,不卡顿】

前言 IT人也是普通人,我就说说普通人维护电脑的方法。 我的电脑配置 给大家看看,配置一般,运行软件和游戏,可以保持基本流程 日常维护措施 我不太喜欢设定一些非主流的配置,下了一个360卫士,360其他的套餐可以不用下…

Python开发环境Spyder介绍

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 Spyder简介 Spyder (前身是 Pydee) 是一个强大的交互式 Python 语言开发环境, 提供高级的代码编辑、交互测试、调试等特性,支持包括 Windows、Linux 和 OS X 系统。 👇 &#x1f44…

备忘录模式——撤销功能的实现

1、简介 1.1、概述 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤。当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。当前很多软件都提供了撤销(Undo)操作&#xf…

Google Search Central (Google搜索支持的结构化数据标记)SEO开发设置

Google会根据结构化数据了解网页上的椰蓉,从而优化SEO排名。搜索引擎优化 (SEO) 是提高网站网页在搜索引擎上的曝光度以吸引更多相关流量的过程。 应用场景 海外独立站新闻网站所有需要SEO排名的网站基本都试用当然众多关于SEO的方法这只是其中一点,合理…

如何用断言帮助检测错误

Java中的断言通过测试我们认为是正确的代码来帮助检测错误。 使用assert关键字进行断言。 其语法为: assert condition; 这里condition是一个布尔表达式,我们假定在程序执行时为真。 启用断言 默认情况下,断言在运行时被禁用并被忽略。…

PHP语言基础知识(超详细)

文章目录 前言第一章 PHP语言学习介绍 1.1 PHP部署安装环境1.2 PHP代码工具选择 第二章 PHP代码基本语法 2.1 PHP函数知识介绍2.2 PHP常量变量介绍 2.2.1 PHP变量知识:2.2.2 PHP常量知识: 2.3 PHP注释信息介绍2.4 PHP数据类型介绍 2.4.1 整形数据类型2.4…

Vault数据备份恢复-MySQL

前言 Vault提供了可靠的功能来保护数据库和其他关键数据。 对于MySQL数据库,Vault提供了一个易于使用的解决方案,可以自动创建和管理定期备份,并支持从备份中快速恢复数据。本文将介绍Vault后端存储MySQL的备份恢复,包括如何设置Vault、如何进行数据备份和还原、如何保护…

day49-Springboot

Springboot 1. Springboot简介 1.1 简介:Springboot来简化Spring应用开发的一个框架,约定大于配置 1.2 优点: 可以快速的构建独立运行的Spring项目; 框架内有Servlet容器,无需依赖外部,所以不需要达成w…

二十三种设计模式第二十四篇--访问者模式(完结撒花)

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。 通过这种方式,元素的执行算法可以随着访问者改变而改变。 这种类型的设计模式属于行为型模式。根据模式,元素对象已接…

如何监控制造业精密空调?看这技能就够了!

在半导体制造、电子元件生产、光学设备制造等领域,精密空调监控是关键的保障,因为微小的温度或湿度变化、微生物或颗粒物污染都可能对产品质量和性能造成巨大影响。 精密空调监控系统作为一种高度智能化的解决方案,能够实时监测和调节生产环境…

SQL注入之sqlmap

SQL注入之sqlmap 6.1 SQL注入之sqlmap安装 sqlmap简介: sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是MS-SQL,MYSQL,ORACLE和POSTGRESQL。SQLMAP采用四种独特的SQL注…

新手入门Jenkins自动化部署入门详细教程

1. 背景 在实际开发中,我们经常要一边开发一边测试,当然这里说的测试并不是程序员对自己代码的单元测试,而是同组程序员将代码提交后,由测试人员测试; 或者前后端分离后,经常会修改接口,然后重新…

【Python】Python 实现猜单词游戏——挑战你的智力和运气!

文章目录 前言学到什么?导入 random 模块定义生命次数定义神秘单词并进行随机选择定义 clue(猜测进度) 列表,用问号 ? 初始化定义心形符号的 Unicode 编码初始化 guessed_word_correctly 变量定义更新猜测进度函数 update_clue主循环&#…

使用上 Spring 的事件机制

本文主要是简单的讲述了Spring的事件机制,基本概念,讲述了事件机制的三要素事件、事件发布、事件监听器。如何实现一个事件机制,应用的场景,搭配Async注解实现异步的操作等等。希望对大家有所帮助。 Spring的事件机制的基本概念 …

邪恶版ChatGPT来了!

「邪恶版」ChatGPT 出现:每月 60 欧元,毫无道德限制,专为“网络罪犯”而生。 WormGPT 并不是一个人工智能聊天机器人,它的开发目的不是为了有趣地提供无脊椎动物的人工智能帮助,就像专注于猫科动物的CatGPT一样。相反&…

Ansible —— playbook 剧本

Ansible —— playbook 剧本 一、playbook的概述1.playbook简介2.什么是Ansible playbook剧本?3.Ansible playbook剧本的特点4.如何使用Ansible playbook剧本?5.playbooks 本身由以下各部分组成 二、playbook示例1.运行playbook2.定义、引用变量3.指定远…

JAVA 反编译工具

Releases deathmarine/Luyten GitHub 安装exe 打开拖入文件即可

九耶|阁瑞钛伦特:产品经理面试题—产品经理在工作中是如何划分需求优先级的?

产品经理在工作中划分需求优先级是为了指导产品团队的开发和发布流程。以下是产品经理在划分需求优先级时通常考虑的因素: 业务目标:产品经理会与企业领导层或业务方合作,了解公司的战略目标和销售策略。然后,他们会根据这些目标评…

图像 检测 - YOLOv3: An Incremental Improvement (arXiv 2018)

YOLOv3: An Incremental Improvement - 增量改进(arXiv 2018) 摘要1. 引言2. 处理2.1 边界框预测2.2 类别预测2.3 跨规模预测2.4 特征提取器2.5 训练 3. 我们的做法4. 我们尝试过但没有成功的事情5. 这一切意味着什么References 声明:此翻译仅…

Netty:从ByteBuf中读出数据

介绍 Netty的ByteBuf数据位置索引是0开始的。 可以用ByteBuf的getByte(int index)方法从指定位置读出一字节,这个操作不会改变ByteBuf的readerIndex 或者 writerIndex 的位置。如果index小于0,或者index 1大于ByteBuf的容量,就会抛出IndexO…