Linux文件系统预读(一)

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

        本博客主要阐述最新内核(linux-3.12)的文件系统预读及时的设计和实现,可能有理解不全面的地方,望各位能多多指教。

        所谓预读,是指文件系统为应用程序一次读出比预期更多的文件内容并缓存在page cache中,这样下一次读请求到来时部分页面直接从page cache读取即可。当然,这个细节对应用程序透明,应用程序可能的感觉唯一就是下次读的速度会更快,当然这是好事。

        由于应用程序的访问行为存在多样性加上作者对预读的把握不是非常深入,因此,难免存在不是非常精确的地方,望多赐教。我们会通过设置几个情境来分析预读的逻辑。

情境1

// 事例代码

{
        ...
        f   = open("file", ....);
        ret = read(f, buf, 4096);
        ret = read(f, buf, 2 * 4096);
        ret = read(f, buf, 4 * 4096);
        ...
}

        该场景非常简单:打开文件,共进行三次读(且是顺序读),那让我们看看操作系统是如何对文件进行预读的。

Read 1

        第一次进入内核读处理流程时,在page cache中查找该offset对应的页面是否缓存,因为首次读,缓存未命中,触发一次同步预读:

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

相关推荐

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

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

7up55的博客 639

Linux readahead文件预读

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

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

linux内核图解(详细图片示例)

使用图形的方式描述linux内核工作原理。是学习内核不错的资料

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的专栏 1535

文件的预读

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

qq_41104683的博客 533

linux 预读机制 (linux4.14)

文件般是顺序访问的,访问[A, B]范围的数据后,接下来很可能访问[B+1, B+N]数据。由于访问磁盘、flash等存储器件比较耗时,在访问 [A, B]的时候,如果提前把[B+1, B+N]数据从存储器件读到ram中,那么后继需要用[B+1, B+N]数据时,就不需要耗时的disk io从存储器件读数据了,从而提高性能。

geshifei的博客 1867

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

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

kunyus的博客 4458

《性能之巅第2版》阅读笔记()--file-system监测

System Performance, file system performance tools

大吉 1651

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

(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的博客 1158

Linux文件系统预读()

篇文章仔细描述了最简单的预读情况:单进程文件顺序读,且读大小不超过32页面,这里我们来看另外种情境:单进程文件顺序读,读大小为256KB,看看预读逻辑如何处理这种情况,照例首先给出事例代码: { ... f = open("file", ....); ret = read(f, buf, 40 * 4096); ret

kai_ding的专栏 2074

page cache之文件预读readahead内核源码详解

提起linux内核的文件预读机制,很多小伙伴肯定是听说过的,为什么预读机制可以提高性能?怎么让初学者快速理解预读机制呢?实践下来觉得还是用示意图举例最简单。本文首先根据实际读文件的测试数据,用示意图讲解讲解预读机制,然后讲解相关内核源码。内核源码基于3.10.96,详细源码注释见https://github.com/dongzhiyan-stack/kernel-code-comment。 1 文件预读示意图讲解 测试命令很简单cat test >/dev/null,test文件之前没有...

dongzhiyan_hjp 3492

linux文件读中的Readahead预读机制

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

jinking01的专栏 7360

Linux内核的文件预读(readahead)

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

夏天Alex 2741

图解|Linux文件预读原理

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

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

Linux 文件预读

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

赶路人儿 724

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

为什么需要文件预读机制? 算法磁盘I/O性能的发展远远滞后于CPU和内存,因而成为现代计算机系统的个主要瓶颈。预读可以有效的减少磁盘的寻道次数和应用程序的I/O等待时间,是改进磁盘读I/O性能的重要优化手段之。 从寄存器、L1/L2高速缓存、内存、闪存,到磁盘/光盘/磁带/存储网络,计算机的各级存储器硬件组成了个金字塔结构。越是底层存储容量越大。然而访问速度也越慢,具体表现为更小的带宽和更大的延迟。因而这很自然的便成为个金字塔形的逐层缓存结构。由此产生了三类基本的缓存管理和优化问题:

私房菜 1536

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

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

Linux阅码场 1378
上一篇: linux内核文件一致性之被动一致性
下一篇: Linux I/O模型思考
kai_ding
博客等级 码龄14年 173粉丝 53原创
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值