代码编织梦想

一 读文件过程

用户进程读取文件数据,有两种情形:

1 所需要的数据不在内存中,也即不在页面Cache中。这时就需要直接从磁盘上读取;

2 所需的数据已经在内存中,此时只需从页面Cache中找到具体位置,然后将数据拷贝到用户缓冲区。而不需要进行磁盘I/O操作。

1.1 数据读入页面Cache中

在不是DIRECT_IO的情况下,系统调用read执行到函数generic_file_buffered_read(文件mm/filemap.c中)下面通过流程图来解析generic_file_buffered_read()的源码:

 

请求页不在pagecache中的情况:

1)  首先通过find_get_page查找请求数据是否已经在页面Cache中,在Cache找不到, 就调用page_cache_sync_readahead将数据预读到内存中;

2)如果预读数据到内存页也失败,调用page_cache_alloc申请内存页,失败则返回为内存不足的错误码,如果申请成功则将page添加到LRU活跃链表中去;

3)如果添加过程中发现该申请页已经在LRU队列中,可能其他进程已经提前访问了该页,

通过find_get_page再次查找页位置;如果不在LRU队列中,则调用文件系统readpage成员函数将数据从磁盘读入到内存,通过copy_page_to_iter将数据从内存拷贝到用户缓存区域。

请求页在pagecache的情况:

1)  用page_cache_sync_readahead将数据预读到内存中,检查数据是否上传完毕;

2) 如果上传完毕则通过copy_page_to_iter将数据从内存拷贝到用户缓存区域;

3)数据未上传完毕则通过wait_on_page_locked_killable等待数据上传完毕,最后通过copy_page_to_iter将数据从内存拷贝到用户缓存区域。

注意:不管用户请求的数据是否已经在pagecache中,都会从页面pagecache中查找相应的页。也就是读文件的过程就是先从磁盘读数据到pagecache,再从pagecache拷贝到用户缓冲区中。

至此,分析了数据不在/在pagecache中的两种读情形,但Linux内核文件Cache机制,是主要提高性能,这样进程读取数据时,主要是已经在读pagecache中的数据,只有这样性能才会显著提升。

二 LRU回收机制和cache回收

在系统中cache回收遵循LRU的内存回收机制,在理解cache回收处理前先要理解LRU的回收

思想。

2.1 LRU的回收机制

LRU(least rencently used)算法是选择最近一次不活跃列表中最靠后的page,即删除最近没被光顾过的page。策略维护了两个list,active list 和 inactive list。在active list上的page被认为是hot的,不能释放。只有inactive list上的page可以被释放的。首次缓存的数据的page会被加入到inactive list中,已经在inactive list中的page如果再次被访问,就会移入active list中。两个链表都使用了LRU算法维护,新的page从尾部加入,移除时从头部移除,就像队列一样。如果active list中page的数量远大于inactive list,那么active list头部的页面会被移入inactive list中,从而位置两个表的平衡。

对应各种类型页的标志位

 每条LRU链表中的物理页按访问时间从大到小排序,链表首部的物理页的访问时间离当前最近,物理页从LRU链表的首部加入,页回收算法从不活动LRU链表的尾部取物理页回收,从活动LRU链表的尾部取物理页移动到不活动链表中。

2.2 页回收的触发

申请分配页的时候,页分配器首先尝试使用低水线分配页。如果使用低水线分配失败,说明内存轻微不足,页分配器将会唤醒所有符合分配条件的内存节点的页回收线程,异步回收,然后尝试使用低水线分配页。如果分配失败,说明内存严重不足,页分配器将会直接回收页。如果直接回收页失败,那么判断是否需要重新尝试回收页。

NUMA架构的处理器中,内存被划分为多个内存节点,访问一个内存的时间取决于处理器和内存节点的距离。

以麒麟v10系统为例,关于numa内存节点的优选顺序可以通过:

sysctl -a |grep vm.numa_zonelist_order 查看。默认为Node模式根据节点距离从小到大排序,这种配置保证了内存的访问效率。下图是某项目中dm数据库服务器系统numa zone内node0的NORMAL内存状态;

Free:节点内可用的内存数量;

Min:最低水线,free小于min,内存区域严重不足;

Low: 低水线;free小于low大于min,内存轻微不足;

High:高水线;free大于high,内存充足。

通过上图可知free已经小于最低水线,说明node0节点内存严重不足,同时会从备用的swap分区借用物理内存,这也是使用swap分区的原因,将类似于匿名页的数据保存在交换分区,如果交换分区的页被访问会再次读到内存中。图中也统计了anonpage,filepage的活跃非活跃页的占用数量。

 2.3 pagecahe回收

无论是页回收线程去回收内存还是直接回收内存的方式去回收内存都会调用shrink_node去回收LRU链表中的页,简单流程图如下:

 

所以对于pagecache回收而言,要满足以下条件:

  1. pagecache是否处于不活跃的状态,即没有PG_refrenced标志;
  2. 在非活动链表中,pagecache对应的refcount(访问数量)为0;
  3. pagecache没有设置内存锁。

如果不满足以上条件文件缓存依旧会占用物理内存,不会被内核主动回收。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_23868387/article/details/124692597

缓冲技术之三:linux下i/o操作buffer缓冲块使用流程_墨篙和小奶猫的博客-爱代码爱编程

0. Linux下缓冲池技术的简单介绍 Linux文件系统中,存在着著名的三大缓冲技术用以提升读写操作效率: inode缓冲区、dentry缓冲区、块缓冲。其中所谓的块缓冲便是我们前面一直在讨论的缓冲池技术,常用

阅读 netmap: a novel framework for fast packet i/o 文章总结_xzplinks的博客-爱代码爱编程

Abstract and Introduction netmap:一个新型的框架,使得现在的操作系统可以在不需要特定硬件或针对应用进行改变的前提下,每秒钟通过1..10 Gbit/s的link处理百万级的packet。 减少或移除了三处packet处理过程中的cost: 每个packet的动态内存分配——通过预分配资源进行处理系统调用的开

mmap 与 cache 的回收-爱代码爱编程

http://luodw.cc/2016/08/13/linux-cache/ 进程的内存申请与分配 我们在终端启动一个程序时,终端进程调用exec函数将可执行文件载入内存,此时代码段,数据段,bbs段,stack段都通过mmap函数映射到内存空间,堆则要根据是否有在堆上申请内存来决定是否映射;exec执行之后,此时并未真正开始执行进程,而是将cpu控

Java I/O体系——从原理到应用到高性能优化,这一篇全说清楚了-爱代码爱编程

本文介绍操作系统I/O工作原理,Java I/O设计,基本使用,开源项目中实现高性能I/O常见方法和实现,彻底搞懂高性能I/O之道 基础概念 在介绍I/O原理之前,先重温几个基础概念: 1.操作系统与内核   操作系统:管理计算机硬件与软件资源的系统软件 内核:操作系统的核心软件,负责管理系统的进程、内存、设备驱动程序、文件和网络系统等等,

Java I/O体系原理-爱代码爱编程

基础概念 在介绍I/O原理之前,先重温几个基础概念: (1) 操作系统与内核 操作系统:管理计算机硬件与软件资源的系统软件内核:操作系统的核心软件,负责管理系统的进程、内存、设备驱动程序、文件和网络系统等等,为应用程序提供对计算机硬件的安全访问服务 2 内核空间和用户空间 为了避免用户进程直接操作内核,保证内核安全,操作系统将内存寻址空间划分为两部分

Linux下系统 I/O 性能分析的套路-爱代码爱编程

如何快速分析定位 I/O 性能问题 1. 文件系统 I/O性能指标 首先,想到是存储空间的使用情况,包括容量、使用量、以及剩余空间等。我们通常也称这些为磁盘空间的用量,但是这只是文件系统向外展示的空间使用,而非在磁盘空间的真实用量,因为文件系统的元数据也会占用磁盘空间。而且,如果你配置了RAID,从文件系统看到的使用量跟实际磁盘的占用空间,也会因为RA

Android 技术分享 (I/O知识分享)-爱代码爱编程

序  在去年公司内部组织的技术分享 ,有幸参与其中 ,准备的话题是 I/O相关的一些东西 。   NO.1 在工作中发现很多小伙伴对 I/O 的认识比较模糊,认为 I/O 就是调用 read() 和 write() 这样的操作。其实对于应用层开发来说,我们在跟I/O打交道中最多的也就是这些由虚拟文件系统提供的API 。 NO.2 看这张

Linux内核File cache机制(上篇)-爱代码爱编程

一、什么是File cache? 1.  File cache概述 Linux File cache机制,每次动笔想写到该知识点的时候,我心里总会犹豫迟疑,众所周知内存管理是Linux系统的比较难啃的子系统之一,而内核文件缓存机制是内存管理框架中难度较大的知识点。其中包括文件缓存预读取流程、写流程、回收流程等,希望我们这次将其一探究竟。 讨论L

linux下的缓存机制&&清理buffer/cache/swap的方法-爱代码爱编程

linux下的缓存机制&&清理buffer/cache/swap的方法 一、缓存机制介绍 在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。 缓存机制优点:减少系统调用次数,

Page Cache 与 Kafka 那些事儿-爱代码爱编程

Kafka 整体架构 Kafka是大数据领域无处不在的消息中间件,目前广泛使用在企业内部的实时数据管道,并帮助企业构建自己的流计算应用程序。 Kafka虽然是基于磁盘做的数据存储,但却具有高性能、高吞吐、低延时的特点,其吞吐量动辄几万、几十上百万。 Kafka为什么速度快、吞吐量大? Kafk

linux强刷cache,linux I/O stack cache 强制刷新-爱代码爱编程

linux 存储子系统作为最为复杂的子系统之一,拥有很深的模块栈(如图),其中很多模块又有自己的缓存功能(如下图)。实际应用中,用户下发的数据停留在哪个缓存中,是否已经写入磁盘,这些操作对用户来说是个黑盒。如何确保数据已经写入磁盘,可以安全的复位或掉电设备,是用户比较关心的话题。 linux IO cache stack中,除了上图中的page

innodb之buffer_pool-爱代码爱编程

参考资料:   参考视频https://www.bilibili.com/video/BV1Pv411h7Ep?p=4&spm_id_from=pageDriver  参考文章https://blog.csdn.net/Tomwildboar/article/details/121525187 1.背景知识: buffer pool

day_12 redis-爱代码爱编程

01-mysql存在的问题(掌握) 现象 现象特征 第一,用户比较多,海量用户第二,高并发 原因分析 性能瓶颈:磁盘IO性能低下扩展瓶颈:数据关系复杂,扩展性差,不便于大规模集群 解决方案 减少读