Linux文件系统预读(二)

Linux文件系统预读(一) 本博客主要阐述最新内核(linux-3.12)的文件系统预读及时的设计和实现,可能有理解不全面的地方,望各位能多多指教。 所谓的预读,值的是文件系统为应用程序一次读出比预期更多的文件内容,当然,这个细节对应用程序透明,应用程序可能的感觉唯一就是下次读的速度会更快,当然这是好事。 同步预读         让我们设想这样一种情境:进程P打开文件f,读offset从0开始size 阅读详情

        前一篇文章仔细描述了最简单的一种预读情况:单进程文件顺序读,且读大小不超过32页面,这里我们来看另外一种情境:单进程文件顺序读,读大小为256KB,看看预读逻辑如何处理这种情况,照例首先给出事例代码:

{
        ...
        f   = open("file", ....);
        ret = read(f, buf, 40 * 4096);
        ret = read(f, buf, 16 * 4096);
        ret = read(f, buf, 32 * 4096);
        ...
}
        事例代码中我们一共进行了三次读,顺序读,且读的大小不定,有超过最大预读量的,也有低于最大预读量的。

Read 1

        毫无疑问,由于第一次读肯定未在缓存命中,前一篇博客告诉我们需要进行一次同步预读,需要初始化预读窗口

initial_readahead:
	ra->start = offset;
	ra->size = get_init_ra_size(req_size, max);
	// ra->size 一定是>= req_size的,这个由get_init_ra_size保证
	// 如果req_size >= max,那么ra->async_size = ra_size
	ra->async_size = ra->size > req_size ? ra->size - req_size : ra->size;

readit:
	/*
	 * Will this read hit the readahead marker made by itself?
	 * If so, trigger the readahead marker hit now, and merge
	 * the resulted next readahead window into the current one.
	 */
	if (offset == ra->start && ra->size == ra->async_size) {
		ra->async_size = get_next_ra_size(ra, max);
		ra->size += ra->async_size;
	}

	return ra_submit(ra, mapping, filp);
}
        在初始化预读窗口中判断得出:ra->size=32 pages,即使应用程序要读的数量是40 pages,这样ra->async_size = ra->size=32 pages,在readit逻辑判断成立,因此会重设ra->async_size的值,根据计算应该是32 pages,而总的ra->size=初始值+ra->async_size=64 pages。形成的预读窗口为(0, 64, 32),如下图:

     
        由于应用程序本次访问的实际页面是PAGE0 ~PAGE40(由于同步预读会全部在缓存命中),因此在访问过程中会碰到page32,此时触发一次异步预读,并向前推进预读窗口:

/* 如果:
      ** 1. 顺序读(本次读偏移为上次读偏移 (ra->start) + 读大小(ra->size,包含预读量) - 
      **    上次预读大小(ra->async_size))
      ** 2. offset == (ra->start + ra->size)???
	 */
	if ((offset == (ra->start + ra->size - ra->async_size) ||
	     offset == (ra->start + ra->size))) {
	      // 设置本次读的
		ra->start += ra->size; 
		ra->size = get_next_ra_size(ra, max);
		ra->async_size = ra->size;
		goto readit;
	}
        更新后的当前预读窗口为(64, 32, 32),如下:

        因此,经过第一次读以后,该文件在内存中page cache状态如下图所示:

Read 2

        由于第二次读只需读出page40 ~ page55,直接在page cache中命中,也不会触发一次异步预读,预读窗口也不会更新,因此,该过程非常简单。本次读完以后,文件在内存page cache的状态如下:

Read3

        应用程序第三次读的范围为page56 ~ page87,由上图可知,这些均可以在page cache中命中,但是由于访问了PAGE64,因此会触发一次异步预读,且当前的预读窗口为(64, 32, 32),根据上面的算法更新预读窗口为(96, 32, 32),因此,本次预读完成以后,文件在page cache中的缓存状态如下:

总结

        我们可以将本情境与上篇博客中描述的情境对比,其实可以发现两者思想完全一致,只是由于应用程序读的粒度不同导致了预读的粒度更大,仅此而已。

Linux文件系统预读(三) 前面两篇关于文件系统的预读我们通过实例阐述了应用程序的顺序读而触发操作系统对文件大小预取情况,本篇博客我们主要描述预读如何解决交织读的问题。所谓的交织读指的是多线程(进程)读同一个打开的文件描述符,单个线程的顺序读在操作系统看来可能会变成随机读。同样我们还是结合实例来分析。 事例代码 { ...... f = open("file", ......) 阅读详情

相关推荐

Linux 预读代码分析

一. 预读算法触发条件 预读触发也就是什么时候进行预读算法判别?下面代码2.6.32内核,分析代码可见预读算法触发条件为两种: 页面缺失(页缓存没有找到)和读取含预读标志的页面。 static void do_generic_file_read(struct file *filp, loff_t *ppos,                 read_descriptor_t *desc,

971

在使用固态硬盘的Windows10/11上,有必要启用“超级预读取”功能吗?

(Prefetch):这是一种算法,通过将相关文件的特定信息保存在Windows目录下的Prefetch文件夹中,加快系统启动速度和应用程序加载速度。然而,现在随着固态硬盘的普及,预读取对性能的影响已经不再显著。以前的机械硬盘可能会受到这个问题的影响,但现在的固态硬盘读写速度非常快,不会受到碎片文件的影响。:现在已经全面进入固态硬盘时代,不必担心频繁的硬盘写操作会降低固态硬盘的寿命。(Superfetch):与预读取不同,超级预读取根据用户的使用习惯,将经常使用的程序和文件预加载到空闲的物理内存中。

qq_40508523的博客 6569

嵌入式Linux中NAND闪存预读效率分析

本文研究了Linux预读机制在嵌入式系统NAND闪存上的效率,针对JFFS2和YAFFS2文件系统,从响应时间和能耗角度评估其影响。实验表明,在顺序和随机读取模式下禁用预读可使性能与能效提升最高达70%,主要因预读导致额外I/O开销且无法掩盖同步闪存访问延迟。

7up55的博客 642

开机预读快还是不预读快_WIN 7下的超级预读比VISTA要好,改进不少!推荐开启超级预读!...

预读技术是微软vista和windows7默认开启的程序,原意是增加程序运行和开机速度,但事与愿违,该技术已经变成与UAC几乎一样的垃圾,普通用户建议关闭,原因有:1、程序本身额外增加系统负担,启用就多运行至少一个进程2、在C:\windows\prefech\下面保存大量小文件,很容易产生磁盘碎片,也占用系统盘空间3、Prefecher技术于开机后不久大量读取硬盘数据到可用物理内存,有时候多大2...

weixin_35586996的博客 1866

DeepSeek提示词实战:从零到百的AI角色扮演指南(附100+场景模板)

本文提供了一份详尽的DeepSeek提示词实战指南,重点讲解AI角色扮演的核心技巧。通过“角色扮演四要素法”和五大核心场景模板,帮助用户从零开始掌握如何设计高质量提示词,有效提升AI输出的深度与精度,并附赠100+实用场景模板供参考。

weixin_29305337的博客 582

Innovus时钟树综合CTS实战:从原理到signoff的完整指南

时钟树综合(CTS)是数字后端实现中保障同步电路时序收敛的核心环节,其本质是在物理层面构建低偏斜、可控延迟的全局时钟分发网络。它基于静态时序分析(STA)原理,通过平衡clock skew、insertion delay、transition time与功耗面积等多维约束,对抗工艺电压温度(PVT)变异带来的时序不确定性。技术价值在于支撑GHz级高频芯片的setup/hold签核,广泛应用于CPU、GPU、AI加速器等复杂SoC的Innovus后端流程。本文聚焦CTS在Innovus工具链中的工程落地,覆盖

weixin_28523493的博客 224

[转]Linux内核的文件预读(readahead)

编者按:Linux文件预读算法磁盘I/O性能的发展远远滞后于CPU和内存,因而成为现代计算机系统的一个主要瓶颈。预读可以有效的减少磁盘的寻道次数和应用程序的I/O等待时间,是改进磁盘读I/O性能的重要优化手段之一。本文作者是中国科学技术大学自动化系的博士生,他在1998年开始学习Linux,为了优化服务器的性能,他开始尝试改进Linux kernel,并最终重写了内核的文件预读部分,这些改进被收录到Linux Kernel 2.6.23及其后续版本中。从寄存器、L1/L2高速缓存、内存、闪存,到磁盘/光盘/

6440

HP SPP download

是一个全面的系统软件和固件更新解决方案,以单个ISO映像的形式提供。该解决方案使用智能更新管理器(SUM)作为部署工具。

极致,细节 9861

关于superfetch

啥是superfetch 这是微软在Windows Vista中推出的项新技术。据微软官方宣称,该技术采用了新算法,它能够有效的提高硬盘的工作效率。它不仅拥有Windows XP预取技术的全部优点,还能够对程序的运行状况做一个实时监测。还可以根据用户的使用习惯,自动预先将存放在硬盘的交换文件转换到内存页面中去,能够使得用户经常运行的程序在启动时的速度得到进一步的加快,因此这玩意儿也叫超级预读。 superfetch服务主要是帮助程序建立缓存的服务,可以在开机启动时优化初始化速度。如果关闭superfetc

将心_的博客 6820

Shader Graph实战:5分钟搞定Flow Map水体流动效果(含UV偏移避坑指南)

本文详细解析了如何使用Unity的Shader Graph工具快速实现Flow Map水体流动效果,涵盖基础原理、核心节点搭建、高级技巧及性能优化。特别针对UV偏移问题提供避坑指南,帮助开发者轻松打造专业级动态水面效果,适合游戏场景增强视觉表现。

weixin_29250403的博客 246

机器学习ROC曲线中的阈值thresholds

在ROC曲线上的不同点对应于不同的阈值。根据任务的具体要求,可以选择合适的阈值,以达到平衡召回率和误报率,或者根据具体应用场景调整模型的工作点。,表示样本属于正例的概率。这个概率值可以被截断为二元分类的决策,通过选择一个阈值来决定样本是被分类为正例还是负例。通过改变阈值,可以得到不同的真正例率(TPR)和假正例率(FPR),从而绘制出ROC曲线。总体来说,ROC曲线提供了模型在不同阈值下的性能综合情况,帮助分析模型的分类能力。通常来说,随着阈值的增加,TPR会减小,而FPR会增加。ROC曲线的绘制涉及。

行子的博客 3656

文件的预读操作分析

<!--v/:* {behavior:url(#default#VML);}o/:* {behavior:url(#default#VML);}w/:* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);}--> Normal 0 7.8 磅

changtao381的专栏 4041

非易失存储器读写

24C256、IIC_SCL、IIC_SDA

CT_1104的专栏 2986

文件系统预读机制的代码分析

(14)或者,还有一个分支,还可以进入函数blk_mq_delay_run_hw_queues,启动kblockd_workqueue,回调函数是blk_mq_run_work_fn,这个读取是在kworker的上下文中,是一个异步的IO过程,代码路径在本文后面介绍。(10)调用blk_mq_attempt_bio_merge合并bio,同时调用blk_mq_bio_to_request将bio转换为request,调用blk_add_rq_to_plug将request添加到tsk->plug中。

chensong_2000的博客 1161

NVIDIA AI 学习与认证指南:从入门到精通

NVIDIA的AI学习与认证体系,凭借其先进的技术背景、丰富的课程资源以及强大的行业认可度,已成为AI学习者和从业者的宝贵资源。通过深入学习NVIDIA的课程和获得认证,学习者可以快速掌握最前沿的AI技术,提升自己的职业竞争力。从基础课程到专业认证,NVIDIA为不同层次的学习者提供了量身定制的学习资源,帮助他们掌握AI的核心技能,提升职业竞争力。是其中的一个亮点,它结合了信息检索与生成式AI的能力,使AI可以从外部知识库中实时提取信息,生成更具深度和准确性的内容。,帮助学习者快速掌握该领域的核心技术。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1881

【微服务】Spring Aop原理深入解析

spring原理深度解析

congge 1万+

Linux readahead文件预读

​ Linux read/mmap 时将文件从磁盘读区到内存当中,read读取文件操作必然会带来IO如果能直接从内存当中读取文件这样就能有效的解决IO及延迟问题。page cache的诞生就是解决这个问题,文件读取后将文件对应的物理page 添加到redix tree当中管理后续在做同样的读取操作时就直接从page cache当中直接读取文件。这个机制本质上来讲与硬件架构的cache原理上是想通的,理解cache机制有助于理解page cache。

谨以此记录下自己的每一点、每一滴、每一步,以督促自己,不忘目标,不忘理想。 1530

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Linux内核的文件预读机制详细详解

Linux文件预读算法磁盘I/O性能的发展远远滞后于CPU和内存,因而成为现代计算机系统的一个主要瓶颈。预读可以有效的减少磁盘的寻道次数和应用程序的I/O等待时间,是改进磁盘读I/O性能的重要优化手段之一。本文作者是中国科学技术大学自动化系的博士生,他在1998年开始学习Linux,为了优化服务器的性能,他开始尝试改进Linux kernel,并最终重写了内核的文件预读部分,这些改进被收录到Lin...

kunyus的博客 4479

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

linux文件读取中的Readahead预读机制

Readahead预读机制 由于内存的速度比磁盘速度快很多,如果每一次访问文件数据都要从磁盘读取一次数据,就会导致非常严重的时延。因此Linux为了提高性能,通过page cache机制,将多个用户数据缓存在内存当中,从而避免多次再磁盘读取。Readahead预读机制正是将用户数据缓存到内存的方法之一。 Readahead机制的介绍 Readahead预读机制是Linux针对顺序读的性能优化机制。它的核心思想是当用户访问连续多个page的时候,一次性将多个连续的页从磁盘读取到内存中,从而避免多次与磁盘

jinking01的专栏 7441

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

图解|Linux文件预读原理

原文连接:https://zhuanlan.zhihu.com/p/41307290概述本文主要阐述内核(linux-3.12)的文件系统预读设计和实现。所谓预读,是指文件系统为应用程序一次读出比预期更多的文件内容并缓存在page cache中,这样下一次读请求到来时部分页面直接从page cache读取即可。当然,这个细节对应用程序透明,应用程序可能的感觉就是下次读的速度会更快,当然这是好事。文...

关注微信公众号【开源Linux】,后台回复『10T』,领取10T学习资源大放送,涵盖Linux、虚拟化、容器、云计算、网络、Python、Go等书籍和视频 213

Linux内核的文件预读(readahead)

编者按:Linux文件预读算法磁盘I/O性能的发展远远滞后于CPU和内存,因而成为现代计算机系统的一个主要瓶颈。预读可以有效的减少磁盘的寻 道次数和应用程序的I/O等待时间,是改进磁盘读I/O性能的重要优化手段之一。本文作者是中国科学技术大学自动化系的博士生,他在1998年开始学习 Linux,为了优化服务器的性能,他开始尝试改进Linux kernel,并最终重写了内核的文件预读部分,这些改进被...

夏天Alex 2768

Linux 读文件 - readahead预读算法

根据ondemand_readahead中initial_readahead label处逻辑看,ra->size是由get_init_ra_size函数计算,该函数第一个参数是应用read的数据页(每个数据页4K)的数量,该场景每次读取4K bytes,相当于调用get_init_ra_size(1,32)返回4。这里async readahead就是指generic_file_buffered_read函数中的:page_cache_async_readahead函数调用。: 开始预读的数据页索引,

GetnextWindow的专栏 1557

Linux 文件预读

Linux文件预读算法磁盘I/O性能的发展远远滞后于CPU和内存,因而成为现代计算机系统的一个主要瓶颈。预读可以有效的减少磁盘的寻道次数和应用程序的I/O等待时间,是改进磁盘读I/O性能的重要优化手段之一。本文作者是中国科学技术大学自动化系的博士生,他在1998年开始学习Linux,为了优化服务器的性能,他开始尝试改进Linux kernel,并最终重写了内核的文件预读部分,这些改进被收录到Linux Kernel 2.6.23及其后续版本中。 从寄存器、L1/L2高速缓存、内存、闪存,到磁盘/光盘/磁带

赶路人儿 729

Linux文件系统预读的情景分析

本文系转发,分析Linux文件系统同步和异步的预读机制,有图有真相,比较形象。预读可以提高CPU和硬盘工作的并行度,减小APP延迟。主要阐述内核(linux-3.12)的文件系统预读及时的设计和实现,可能有理解不全面的地方,望各位能多多指教。        所谓预读,是指文件系统为应用程序一次读出比预期更多的文件内容并缓存在page cache中,这样下一次读请求到来时部分页面直接从page ca

Linux阅码场 1382

文件的预读

为了优化读取文件的时间延迟,文件系统(FS)在去磁盘读取文件时会有一个read_ahead的动作。主要思路是:当FS发现用户读取文件是按照文件的顺序读取,FS就假定用户在下一次读取时大概率会读取下一个block。所以FS在把当前的block读取到内存后,会发送读取下一个block的命令,然后将当前block数据返回给用户。这样用户在处理数据的时候,磁盘IO也在并行的执行(如果是DMA的方式,磁盘IO在完成之后,会通过中断的方式告诉FS)

qq_41104683的博客 534
上一篇: nginx调试
下一篇: Linux文件系统预读(三)
kai_ding
博客等级 码龄14年 173粉丝 53原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值