Page Cache

page cache 是 Linux内核实现的磁盘缓存,主要用来减少对磁盘的I/O操作,把磁盘访问变成物理内存访问

无论通过标准I/O还是mmap,首先都是读入page cache,page cache 内核地址映射到page的物理地址。如果是标准I/O就拷贝到用户地址,如果是mmap,则将用户地址映射到相同的page物理地址。
不过mmap只建立了地址映射,所以当进程发起对映射空间访问时会引发缺页异常,从而引发磁盘文件到物理内存的拷贝。

以下参考链接[2]
标准I/O过程:
假设一个名为render的Linux程序,它打开文件scene.dat并一次读取512个字节,将文件内容存储到堆分配的块中。第一次读是这样的:

在读取了12KB以后,render的堆以及相关的页帧情况如下,上面的是page cache,下面的是用户地址空间对应的物理内存:
mmap 而mmap则直接将render进程的用户地址空间直接指向了page cache。
page cache 刷盘 page cache修改之后会变成脏页。
脏页有两种刷盘的方式:

  1. 异步刷盘,脏页太多或者存在太久都会导致page cache回写磁盘,Linux中可以通过 sysctl -a | grep dirty 查看相关的控制参数。
  2. 调用fsync、msync等。

RocketMQ消息存储

RocketMQ文件映射关系
下图来自Apache RocketMQ 中国开发者钉钉群陈厚道老师的PPT

RocketMQ中每个文件对应一个MappedFile,MappedFile由MappedFileQueue管理。

RocketMQ消息存储的两种方式
下图来自Apache RocketMQ 中国开发者钉钉群刘春龙老师的PPT

TransientStorePool主要功能是池化管理多个DirectByteBuffer对象,可以向其借与还Buffer提供给MappedFile使用。
使用DirectByteBuffer的原因可以看一下另一篇文章《Java直接内存原理》。
写数据
先讲一下上图的第二种的方式:

  • appendMessage直接写到借来的writeBuffer中,调用commit方法时再通过FileChannel#write()方法写数据

第一种方式(默认方式):

  • 通过FileChannel#map获得的MappedByteBuffer直接写数据

由上面的Page Cache可知两种方式操作的是同一块物理内存(MappedByteBuffer和FileChannel没有直接关系,即使FileChannel#close(),MappedByteBuffer还是可以操作文件)。
读数据
读数据只有一种方式,直接通过MappedByteBuffer读取。
关于刷盘
调用flush会将Page Cache中的数据刷到磁盘。

另外,关于两种方式,胡宗棠老师的见解。

个人想法

  1. DirectByteBuffer的方式如果掉电会丢失更多的数据。
  2. mmap + pagecache的方式数据更新更及时,毕竟读数据都是从mmap 读的。

[1]《Linux内核设计与实现》
[2] manybutfinite.com/post/page-c…
[3] www.quora.com/Linux-Kerne…

RocketMQ消息存储学习相关推荐

  1. RocketMQ 1.学习资料 2.面试题 3.知识点

    前言 这篇文章分三方面来介绍RocketMQ 1.学习资料 2.面试题 3.知识点 学习资料 官方 官方文档 rocketmq.apache.org/docs/simple- 官方github git ...

  2. rocketmq消息存储原理_RocketMQ到底快在哪里?深入探索RocketMQ消息存储和查询原理...

    RocketMQ 作为一款优秀的分布式消息中间件,可以为业务方提供高性能低延迟的稳定可靠的消息服务.其核心优势是可靠的消费存储.消息发送的高性能和低延迟.强大的消息堆积能力和消息处理能力. 从存储方式 ...

  3. RocketMQ消息存储的整体结构

    RocketMQ的消息存储采用的是混合型的存储结构,也就是Broker单个实例下的所有队列公用一个日志数据文件CommitLog.这个是和Kafka又一个不同之处. 为什么不采用kafka的设计,针对 ...

  4. RocketMQ消息存储原理

    消息存储 CommitLog 1.消息内容和元数据都会存在CommitLog日志文件中2.消息内容不是定长的3.单个文件大小默认1G 文件名长度为20位 左边补零 剩余为起始偏移量 比如第一个文件名是 ...

  5. RocketMQ消息存储结构分析及相对于Kafka的优势

    在RocketMQ中,消息存储是由CommitLog和ConsumerQueue配合完成 消息存储结构 首先我们先来看下整体的消息存储结构 基本过程: 生产者在生产消息的时候是将消息存储在Commit ...

  6. RocketMQ消息存储、刷盘、负载均衡

    消息存储 消息存储是RocketMQ中最为复杂和最为重要的一部分. 消息存储总体架构 消息存储架构图: minOffset:当前队列的最小消息偏移量,如果消费时指定从最早消费,就是从该偏移量消费. m ...

  7. RocketMQ消息存储之刷盘机制(原理篇)

    一.前言 RocketMQ的刷盘机制是一种确保消息可靠性的机制,简单来说就是Broker收到消息后,将消息存储到磁盘上.这样可以解决几个问题: 存储空间问题.内存空间有限,存入磁盘可以维护更多消息. ...

  8. rocketmq存储消息mysql_再说rocketmq消息存储

    两篇精彩的文章: rocketmq通过netty获取到消息请求后,直接掉处理模块,比如:SendMessageProcessor 这个处理类主要负责处理客户端发送消息的请求. 这个类实现了com.al ...

  9. RocketMQ 消息存储机制分析

  10. RocketMQ学习笔记(二)

    第六章 RocketMQ生产者核心配置和核心知识讲解 第1集 消息队列RocketMQ4.X生产者核心配置讲解 简介:消息队列RocketMQ4.X核心配置讲解 生产者常见核心配置 compressM ...

最新文章

  1. python3运算符和表达式实验报告_对Python3 * 和 ** 运算符详解
  2. 第二、三章:信息系统项目管理基础与立项管理-章节真题
  3. 如何计算两个日期之间相差的天数?
  4. php框架之laravel
  5. java和cnc_Java程序员的目标,你都达到了多少条?
  6. python字典与顺序有关吗_python – 为什么在字典和集合中的顺序是任意的?
  7. Windows GDI和GDI+编程实例剖析(1)
  8. JavaNIO - Scatter Gather
  9. 雕刻机控制软件破解笔记
  10. 网站在线监控工具Uptime Kuma
  11. [索尼]笔记本电脑驱动程序安装顺序?
  12. 2021年程序员平均工资
  13. 动作游戏的打击感和音效的关系
  14. iOS - 手机摇一摇
  15. 如何关闭迅雷极速版的升级提示
  16. canvas示例样式_使用js canvas和atari vcs trivia制作基本html游戏的快速示例
  17. java基础巩固-宇宙第一AiYWM:为了维持生计,单例模式阅读总结【单例模式不同写法、在JDK中的应用】~整起
  18. 使用PyTorch中的预训练模型进行图像分类
  19. 信源编码技术作业1:使用Audacity绘制并分析清音、浊音、爆破音的频谱图
  20. vue 项目中的打包配置

热门文章

  1. 谷歌身份验证器插件以及基于utools的otp快捷使用
  2. 前端模板引擎 -- Freemarker
  3. 如何用matlab画一个球
  4. Openjudge1.5答案
  5. redis 通道 java_【java】netty4,服务端向客户端主动发消息怎么把channel存储到redis缓存中?...
  6. 怎样做一个软件注册程序
  7. 运行时 Entry name .... .. collided
  8. Can总线基本关注事项(仲裁、电气、阻抗计算、负载率)
  9. win10系统oracle删除用户,win10 清除个人数据库
  10. IPSec:IKEv2协议详解