关于page Cache和memory mappped Files 和zero copy

简介: 关于page Cache和memory mappped Files 和zero copy

背景


由于前段时间在学习mysql相关的知识,其中涉及到了wal redo log以及磁盘的问题,在此记录一下。


Page Cache


page Cache 是现代操作系统为了弥补硬盘写入速度的不足,而引入内存作为文件系统的缓存,它会把当前系统的所有剩余的内存作为page cache。

page Cache是在内核中的,也就是说是在内核态的,page cache在磁盘的读写过程中都有用到,在读磁盘的过程,系统会把磁盘内容读取到page cache中,而在写磁盘的过程中,是先会写到page Cache中,由操作系统选择合适的时机再写入磁盘,比如在系统内存不足的时候。其实写磁盘的过程是涉及到用户态和内核态的转换的,我们采用网上的一张图来解释一下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nozG2CiG-1619671859574)(https://www.0xffffff.org/images/41/linux-io.png)]

对于一般的io,我们关注Buffered IO这条线,

对于写: 用户通过文件系统的api调用,之后会写入到page Cache,这个时候就会涉及到用户态向内核态的转换,这个时候就必须将用户的buffer的文件copy到内核的的page Cache中,这就浪费了cpu的时间。系统在合适的时间进行磁盘的写操作。

对于读: 用户通过文件系统的api调用,会读取page cache的内容,如果这个时候要读取的内容不在page Cache中,系统就会把磁盘的内容读取到page Cache中,之后copy page cache的内容到用户buffer,这里涉及到内核态向用户态的转换。


对于mmap也就是memory mapped files,内核会将程序的虚拟内存映射到page Cache中,也就是图中的mmap这条线,从图中可以看出少了file System这么一步,也就是在该文件的操作,可以直接反应到page Cache中,就不会进行内核态与用户态之间的切换,极大的提高了速度的读取效率。


对于Direct io,我们看图上的Direct io这条线,这个机制更狠,直接让用户和磁盘对接,这种的话,对于写操作就会直接映射buffer到磁盘,以DMA的方式进行传输,这种减少了复制内容到page Cache的这步操作。


这些操作,在java中都有体现,如MappedByteBuffer类和DirectByteBuffer类


zero copy


zero copy是在网络传输中用到的,是调用系统api sendfile来实现的,一般的的socket的流程如下(参考网上的图片):

image.png

同时参考网上的说明:


操作系统从磁盘读取数据,并写入到内核空间的page cache中。

应用程序从内核空间读取数据,并复制到用户空间中。

应用程序将用户空间中的数据写回到内核空间的socket缓冲中去。

操作系统将socket缓冲中的数据复制到网卡缓冲中,并经过网卡发送出去。

可以看到这种传统发送数据的方式经过了四次数据复制和两次系统调用,效率很差。那么使用sendfile系统调用后是什么情况呢?

image.png

  1. 使用sendfile可以直接从page cache复制数据到网卡缓冲,避免了不必要的系统调用和数据复制,非常高效。

这些操作,在java中也有体现,如FileChannel.transferTo()和FileChannel.transferFrom()操作

相关文章
|
人工智能
AI背景颜色变成白色了怎么恢复灰色?
一些刚开始使用AI来做平面设计的朋友,有时候会突然工作界面变成白色,而设置里看了是灰色,然后怎样都调不回来了。贴吧里一篇文章介绍用CTRL+SHIFT+H,实际上这是隐藏画板的快捷键并没有解决问题。
AI背景颜色变成白色了怎么恢复灰色?
|
6月前
|
并行计算 PyTorch 算法框架/工具
Triton入门教程:安装与编写和运行简单Triton内核
Triton是一款开源GPU编程语言与编译器,专为AI和深度学习领域设计,提供高性能GPU代码开发的高效途径。它支持通过Python编写自定义GPU内核,性能接近专家级CUDA代码,但无需掌握底层CUDA知识。本文全面介绍了Triton的核心功能、安装方法、基础应用、高级优化策略,以及与CUDA和PyTorch的技术对比。此外,还探讨了其在实际项目中的应用场景,如加速Transformer模型训练和实现高效的量化计算内核。Triton简化了GPU编程流程,降低了开发门槛,同时保持高性能表现,成为连接高级框架与底层硬件的重要工具。
587 3
Triton入门教程:安装与编写和运行简单Triton内核
|
10月前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
缓存 Java 测试技术
总结|性能优化思路及常用工具及手段
性能优化是降低成本的手段之一,每年大促前业务平台都会组织核心链路上的应用做性能优化,一方面提升系统性能,另外一方面对腐化的代码进行清理。本文结合业务平台性能优化的经验,探讨一下性能优化的思路及常用工具及手段。
76553 1
|
NoSQL Redis 索引
RedisTemplate.opsForList()用法简介并举例
RedisTemplate.opsForList()用法简介并举例
2855 2
|
弹性计算 网络虚拟化 Perl
全景剖析阿里云容器网络数据链路(五)—— Terway ENI-Trunking
本文是[全景剖析容器网络数据链路]第五部分部分,主要介绍Kubernetes Terway ENI-Trunking模式下,数据面链路的转转发链路。
1062 7
全景剖析阿里云容器网络数据链路(五)—— Terway ENI-Trunking
|
弹性计算 编解码 Cloud Native
全景剖析阿里云容器网络数据链路(二)—— Terway ENI
本文是[全景剖析容器网络数据链路]第二部分,主要介绍Kubernetes Terway ENI模式下,数据面链路的转转发链路。
1002 7
全景剖析阿里云容器网络数据链路(二)—— Terway ENI
|
弹性计算 Kubernetes Cloud Native
全景剖析阿里云容器网络数据链路(一)—— Flannel
本文是[全景剖析容器网络数据链路]第一部分,主要介绍Kubernetes Flannel模式下,数据面链路的转转发链路
1351 8
全景剖析阿里云容器网络数据链路(一)—— Flannel
|
druid
druid连接池泄露
druid连接池泄露
248 0