当前位置: 首页 > news >正文

消息中间件之RocketMQ为什么写文件这么快?

RocketMQ的存储涉及中,很大一部分是基于Kafka的涉及进行优化的。

PageCache

现代操作系统内核被设计为按照Page读取文件,每个Page默认4KB,
因为程序一般符合局部性原理,所以操作系统在读取一段文件内容时,会将该段内容和附件的文件内容都读取到内核Page中(预读),下次读取的内容如果命中PageCache就可以直接返回内容,不用再次读取磁盘

PageCache机制也不是完全无缺点的,当遇到操作系统进行脏回写、内存回收、内存交换等情况,就会引起较大的消息读写延迟。对于这些情况,RocketMQ采用了多种优化技术,比如内存预分配、文件预热、
mlock系统调用等,以保证再最大限度地发徽PageCache机制的优点的同时,尽可能地减少消息读写延迟。所以在生产环境部署RocketMQ的时候,尽量采用SSD独享磁盘,这样就可以最大限度地保证读写性能
在这里插入图片描述

Virtual Memory(虚拟内存)

为了保证每个程序有足够地运行空间和编程空间,可以将一些暂时不用的内存数据保存到交换区(其实是磁盘)中,这样就可以运行更多的程序,这种"内存"被称为虚拟内存(因为不是真的存在)
操作系统的可分配内存大小=虚拟内存大小+物理内存大小

零拷贝和Java文件映射

在这里插入图片描述
从文件读取流程可以看到,读取到内核态的数据会经历两次拷贝,第一次从内核态内存拷贝到用户态内存,第二次从用户态内存拷贝到Java进程的某个变量地址,这样Java变量才能读取数据。
为了提高读写文件的效率,IBM实现了零拷贝技术,它是世界上最早实现该技术的公司,后来各个厂商(如甲骨文等)也纷纷实现了该技术。
java.nio.MappedByteBuffer.java文件中实现了零拷贝技术,即Java进程映射到内核态内存,原来内核态内存与用户态内存的互相拷贝过程就消失了。在消息系统中,用户关心的往往都是最新的数据,理论上,基本的操作都在PageCache中,PageCache的操作速度和内存基本持平,所以速度非常快。当然,也存在读取历史消息而历史消息不再PageCache
中的情况,比如在流处理和批处理中,经常将消费重置到历史消息位点,以重新计算全部结果。这种情况只是在第一次拉取消息时会读取磁盘,以后可以利用磁盘预读,几乎可以做到不再直接读取磁盘,其性能与利用PageCache相比,只在第一次有差异

相关文章:

  • R语言【raster】——projectRaster():映射一个Raster对象
  • Laravel02 路由基本概念和用法 给视图传递请求参数
  • Docker Image(镜像)
  • sentinel的资源数据指标是如何采集
  • Vue3 + Ts (使用lodash)
  • electron学习和新建窗口
  • 强化学习入门(Matlab2021b)-创建环境【2】
  • [TCP] TCP/IP 基础知识词典(2)
  • Putty中运行matlab文件
  • 短剧小程序系统,重塑视频观看体验的科技革命
  • 【Linux】用户与用户组,用户账号系统文件
  • 全球游戏市场回暖,Flat Ads推动海外获客增长
  • gin源码实战 day2
  • 【GPTs分享】每日GPTs分享之Canva
  • 【Git】:标签功能
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 《深入 React 技术栈》
  • css属性的继承、初识值、计算值、当前值、应用值
  • ES6语法详解(一)
  • HTTP中的ETag在移动客户端的应用
  • JavaScript新鲜事·第5期
  • MySQL的数据类型
  • React的组件模式
  • SpiderData 2019年2月23日 DApp数据排行榜
  • TypeScript实现数据结构(一)栈,队列,链表
  • 安卓应用性能调试和优化经验分享
  • 简单基于spring的redis配置(单机和集群模式)
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 三分钟教你同步 Visual Studio Code 设置
  • 温故知新之javascript面向对象
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 学习Vue.js的五个小例子
  • 转载:[译] 内容加速黑科技趣谈
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #宝哥教你#查看jquery绑定的事件函数
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (ZT)薛涌:谈贫说富
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (十) 初识 Docker file
  • (一一四)第九章编程练习
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET学习教程二——.net基础定义+VS常用设置
  • .net中生成excel后调整宽度
  • @WebService和@WebMethod注解的用法
  • [1181]linux两台服务器之间传输文件和文件夹