LWN: 使用buffered I/O但是不用担心page cache被占满了!

一篇文章带你读懂 io_uring 的接口与实现 io_uring是 Linux 提供的一个异步 I/O接口。io_uring在 2019 年加入 Linux 内核,经过了两年的发展,现在已经变得非常强大。本文基于 Linux 5.12.10 介绍io_uring接口。 io_uring的实现主要在fs/io_uring.c中。 io_uring 的 用户态 API io_uring的实现仅仅使用了三个 syscall:io_uring_setup,io_uring_enter和io_uring_register。它们分别用于... 阅读详情

关注了就能看到更多这么棒的文章哦~

Buffered I/O without page-cache thrashing

By Jonathan Corbet
December 12, 2019

原文来自:https://lwn.net/Articles/806980/

ps. 建议读一下原文下面Axboe跟其他读者的讨论。

Linux提供了两种file I/O模式:buffered模式和direct模式。Buffered I/O会经过kernel的page cache,更加易用,针对那些会访问多次的数据来说能显著提高访问性能;Direct I/O则是把user-space的数据和存储设备之间进行直接搬运,在某些情况下操作系统的缓存(caching)并不需要的话,这种方式能更加快一些,不过用起来比较复杂,对于不注意的开发者来说容易碰到陷阱。现在,Jen Axboe提出了一个方案,可能可以得到direct I/O的大多数好处,而不会容易陷入那些陷阱。

Direct I/O比起buffered I/O的性能优势有几方面。首先它能完全避免把data在user space和page cache之间进行复制引入的消耗。这个消耗可能已经很大了,不过多数情况下这还不是最大的问题。最大的问题是对buffered I/O在page cache上的影响。

当一个进程需要访问一个或多个大文件进行访问的时候,这种大数据量的buffered I/O访问会很快就把page cache都完全用光,也就是说大量memory也会都被这些文件数据缓存都占用掉了。如果这个进程在这些I/O操作之后不再访问这些数据了,那么其实完全没有必要把这些数据保存在memory中。在kernel在做别的事情想要分配memory的时候,kernel就需要先回收(reclaim)一些内存page,这种操作对整个系统的性能都有影响,哪怕只是回收那些用作此次I/O缓存的page也会对系统性能有影响。

内存管理子系统在这种情况下会尽量采用比较优化的方式来处理,首先把buffered I/O导致进入cache的page都串到inactive list上去,如果短期内没有再次访问这些page的话,这些page就会被优先回收掉。不过,哪怕就是按照这种方式实现之后,还是会有不少额外损耗的。Axboe做了个简单的测试,得到如下结果:“测试用例很简单,就是对一个size是RAM size的10倍大小的数据集进行随机读操作。起初性能还不错,接下来page cache填满之后,性能就大跳水了。IO线程的CPU占用率直线上升,kswapd会占用一个CPU核心的100%的时间来努力满足内存需求。”

采用direct I/O可以避免这种问题,不过这样也会印发一些direct I/O特有的问题和挑战。Axboe的结论是,可以采用第三条路,能集合前两种方式的优点。

这个第三种方式就是针对preadv2()和pwritev2()系统调用增加一个新的flag,RWF_UNCACHED。使用这个flag的时候,根据受影响的文件page是否在page cache里面,而对发起的I/O操作进行两方面的改变。如果数据在page cache内,这个I/O操作正常进行,就当RWF_UNCACHED flag不存在一样,数据读写访问会直接使用page cache里的内容。如果这个page不在page cache内,就会先加到page cache中去,不过仅仅针对这一次I/O操作而已,当操作结束时就会把这些page从page cache中移除。

换句话说,这种情况下buffered I/O不会改变page cache的状态,本来在page cache里的内容仍会继续留在page cache内,但是不会新增内容到page cache中。这样进行的I/O操作可以得到buffered I/O的大多数好处,包括方便易用、可以快速访问cache(已经缓存)的数据,却不会让那些不需要进入cache的数据耗用memory资源。按Axboe的说法,结果很显著:“使用这种方式进行测试,读写访问可以一直很平稳,不会迫使kernel的kswapd挥汗如雨地努力工作。其实kswapd都没有出现过。”

这个新增的flag看起来可以对很多workload带来显著改善。特别是对那些已知只需要使用一次的数据,或者当应用程序会在user space自己维护缓存(caching)的情况下,都会很喜欢RWF_UNCACHED flag。

这个新方案的实现并不复杂,整个patch set 海包括了对io_uring的支持,总共也只牵涉到200行代码而已。当然,正如Dave Chinner指出,这里还缺少一些改动:所有的测试基础架构(testing infrastructure)都需要确保RWF_UNCACHED的行为要严格按预期进行,不能损坏数据。Chinner也指出了在write实现里面的一些性能问题,建议整个I/O操作应该一起进行flush,而不是用Axboe实现的逐个page进行flush的。Axboe已经贴出了修改后的patch,至于完成test case以及完善文档描述的工作会在后面进行。

如果RWF_UNCACHED能在真实的workload中也证明自己的价值,那么很多人可能都会觉得自己多年以前就该想到这种方法。这个世界就是这样的,解决问题并不难,难的地方在于先搞清楚要解决的是具体什么问题,当然,还有包括写test case和文档。。。

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注LWN深度文章以及开源社区的各种新近言论~

webkitgtk-2.4.9-3.el7.nux.x86_64.rar centos 7安装部署kettle时,可能会出现 no libwebkitgtk-1.0 detected, some features will be unavailable的问题,且yum install libwebkitgtk找不到资源,用户下载安装包后,可以通过命令rpm -ivh 文件名称 来安装webkitgtk。本人亲测有效,特意分享给大家 立即下载

相关推荐

SAP SD核心流程解析:从销售订单到财务结算的实战指南

本文深入解析SAP SD模块从销售订单到财务结算的核心流程,重点剖析了销售订单中的行项目类别如何作为流程的“总开关”,决定了后续交货、开票及财务集成的走向。文章结合实战案例,详细拆解了正常销售、退货、第三方销售、寄售等典型流程的配置要点与国内化适配方案,并阐述了SD与财务模块集成的关键连接点,为顾问和用户提供了一份全面的实战指南。

weixin_29250403的博客 426

LWN:buffer write 时不被“撕裂”!

在去年的 Linux 存储、文件系统、内存管理和 BPF 峰会 (LSFMM+BPF) 上,曾就原子写入 (atomic writes)进行过一次讨论,并随之发布了补丁,以在块层 (block layer) 中支持该特性,以及在 XFS 上支持直接 I/O (direct I/O)。他说,一切都只有 99.9% 的时间有效。他看到的一个问题是,开发人员一直在使用“原子”这个术语,因为这是 SCSI 和 NVMe 使用的术语,但随后人们希望 1MB 的原子写入能够工作,但这根本不是数据库开发人员所关心的。

Linux News搬运工 1633

基于Python大数据的智能交通分析系统

该系统能够实时监测交通状况,分析交通流量,预测交通趋势,为交通管理部门提供决策支持,帮助缓解交通拥堵,提高交通运行效率,减少交通事故发生率,改善市民出行体验。它能够为交通管理部门提供决策支持,帮助缓解交通拥堵,提高交通运行效率,减少交通事故发生率,改善市民出行体验,促进交通产业的健康发展。数据采集层:通过传感器、GPS设备、交通摄像头等数据源,实时采集交通数据,如车辆速度、位置、道路拥堵情况等。数据分析层:运用统计学方法、机器学习算法等,对处理后的数据进行深入分析,挖掘交通规律,预测交通趋势。

qq3828614760的博客 2969

Unbuffered I/O

Unbuffered I/O在概念上是相对于Buffered I/O(标准I/O),他的读写函数read,write都会触发系统的内核调用。Unbuffered I/O并不是说不使用Cache机制,一般来说Unix系统都会在内核中使用Buffer Cache 或者 Page Cache。当我们使用write来写数据到磁盘文件时,这些数据一般会被copy到内核的cache中排列起来,在之后某个时刻写

AlwaysBeCoding的专栏 1423

PaddleOCR GPU部署:从环境配置到避坑实战指南

本文详细介绍了PaddleOCR GPU部署的全过程,从环境配置到避坑实战指南。通过分析常见的部署失败原因,提供硬件兼容性自查、软件环境精配方案以及路径配置的解决方案,帮助用户高效完成GPU加速的OCR任务部署,避免90%的常见错误。

weixin_30839881的博客 417

EPS+ArcGIS+CASS三剑客:等高线裁剪的完整工作流与避坑指南

本文详细介绍了EPS、ArcGIS和CASS三款软件在等高线裁剪中的协同工作流程与避坑指南。通过发挥各软件优势,解决数据完整性、拓扑准确性和流程可靠性等核心挑战,提升40%以上的工作效率。特别适合大型测绘项目中复杂地形的处理,涵盖数据准备、核心处理到后期优化的全流程。

weixin_30352645的博客 618

unbuffered I/O. buffered I/O

1. buffered I/O, 即标准I/O首先,要明确,unbuffered I/O只是相对于buffered I/O,即标准I/O来说的.而不是说unbuffered I/O读写磁盘时不用缓冲.实际上,内核是存在高速缓冲区来进行真正的磁盘读写的,不过这里要讨论的buffer跟内核中的缓冲区无关.buffered I/O的目的是什么呢?很简单,buffered I/O的目的就是为了提高效率.请

SE_craftsman的专栏 1556

鱼鹰优化算法(OOA)详解:从猛禽捕食智能到优化算法实现

鱼鹰优化算法(Osprey Optimization Algorithm, OOA)是2023年提出的一种新型元启发式优化算法,灵感来源于鱼鹰(一种中型猛禽)高效的捕食策略。算法模拟了鱼鹰从空中识别水下鱼类位置并俯冲捕食,然后将捕获的鱼带至安全位置享用的全过程,以此抽象出全局探索和局部开发两个核心阶段。OOA算法具有参数少、结构简单、收敛速度快、全局寻优能力强等特点。自提出以来,已在函数优化、机器学习参数调优(如CatBoost模型)、路径规划等多个领域展现出良好性能,为解决复杂优化问题提供了新的有效工具。

qq_42212808的博客 273

Linux阅码场 - Linux内核月报(2020年09月)

关于Linux内核月报Linux阅码场Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向。限于篇幅,只会对...

宋宝华 3655

图形推理2-四大类六提示

图形推理笔记2

小y的学习笔记 6739

2025华为OD机试真题目录汇总 B+C+D+E卷(570道)(Python语言)

本文是华为OD机试真题(Python 语言)专栏的目录贴(持续更新中…)华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。所有OD和正式员工一样对待,没有差别,部门平时开会、评审等活动都是一起参加的,是同薪同酬,都是由华为的HR直接定的薪资,看的是我们技术能力。华为是大企业,能到华为上班也是有能力的,每个部门都有好多职位,是金子,在哪都会发光。

KJ.JK 18万+

Linux中Cache内存占用过高解决办法

在Linux系统中,我们经常用free命令来查看系统内存的使用状态。在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: 这里的默认显示单位是kb,我的服务器是128G内存,所以数字显得比较大。这个命令几乎是每一个使用过Linux的人必会的命令,但越是这样的命令,似乎真正明白的人越少(我是说比例越少)。一般情况下,对此命令输出的理解可以分这几个层次: 不了解

c123m的专栏 1万+

AEJoy —— 最受欢迎的 5 个 Ae 表达方式

NOTE] 原文作者我意识到表达式可能令人生畏,有些人宁愿复制粘贴有用的代码,而不愿学习这门语言。对此我完全理解。因此,我想与您分享我的。这些是我几乎在每个项目中都会使用的表达式,我认为它们极大地提升了工作流程。

ShaderJoy 的兴趣技术杂货铺 363

linux buffer cache 怎么设置,linux page buffer cache深入理解

linux page buffer cache深入理解发布时间:2012-11-14 10:02:43 作者:佚名 我要评论Page cache和buffer cache一直以来是两个比较容易混淆的概念,在我工作的这一段时间,page cache和buffer cache的概念曾经困扰过我,如果能够了解到这两个cache的本质,那么我们在分析io问题的时候可能会更加得心应手Page ca...

weixin_42299310的博客 346

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

解决buff/cache占用过大

场景: 我们常用的内存型占用较大的服务或者数据库,经过一定的时间,会将系统中的buff/cache占满,导致性能急剧下降,甚至频繁使用swap区进行数据交换。从而导致io也到达瓶颈。 查看buff/cache情况: # free -h total used free shared buff/cache available Mem: 32G 8.9G 8.2G 24

han0373的博客 2万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Linux的cached和pagecache清除 解决缓存、内存不足、测试结果影响问题

最近做的一个NLP文本处理组件的项目中用到了apache的Lucene,在后来的性能测试过程中,关键词、相似文章推荐功能的性能指标应该随着文章数量(索引规模)的增大而下降,但是在拿到的测试数据中,却正好相反。非常费解。后来才悟道是Linux下缓存了一定的Lucene index,导致后读取的反而比之前读取的更快,影响了测试的准确度(或者说是因为没有控制好测试的变量,忽略了缓存对索引读写的影响)。

pengo_c的专栏 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

打开一个文件报“I/O error”

故障现象:打开一个文件报“I/O error”,复制到桌面可以正常打开。环境:Windows XP SP3,同时该该文件用专门的软件打开的;DELL 台式机解决步骤: 1.根据提示有“I/O error”的错误,以为是硬盘故障,所以先把原来的文件系统从FAT32转换到NTFS(convert X: /fs:ntfs);2.使用系统自带工具修复硬盘分区和坏道; 3...

weixin_33995481的博客 3321

linux添加一个系统调用(syscall)

添加系统调用函数头文件 在include/linux/syscalls.h文件中的#endif前添加自己的系统调用函数声明,内容如下: asmlinkage long sys_test(void); 添加系统调用实现源码 随便找一个文件,我们在这个文件中添加系统调用的源码SYSCALL_DEFINE0(test) ,内容如下: SYSCALL_DEFINE0(test) { ...

小小城御园的博客 5151

linux page cache 大小,linux pagecache与内存占用

一、概念介绍linux系统中通常使用free命令来查看内存使用情况,free命令主要是从/proc/meminfo文件中读取的内存数据然后进行简单处理进行展示,根据查看free命令的手册了解到各个字段的含义。total:系统总内存大小(分物理内存mem、交换分区swap)used:已使用的内存(total - free - buffers - cache)free:未使用的内存shared:通常情...

weixin_30947859的博客 987

Centos7安装opencv3

一,安装ffmpeg 1.安装epel扩展源及其他扩展源 # 安装epel扩展源 yum -y install epel-release # 添加扩展源 yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm yum localinst...

formaever的专栏 525

Linux的page cache使用情况/命中率查看和操控


 
 
 
 
 
 
 这里总结几个Linux文件缓存(page cache)使用情况、命中率查看的工具。perf-tool...

Linux阅码场 2806

LWN:ION变了个形,就要打入Linux内部了!

点击上方蓝色字关注我们~Destaging IONJuly 9, 2019This article was contributed by Marta Rybczyńska...

Linux News搬运工 2078

Linux中的Page Cache

CPU如果要访问外部磁盘上的文件,需要首先将这些文件的内容拷贝到内存中,由于硬件的限制,从磁盘到内存的数据传输速度是很慢的,如果现在物理内存有空余,干嘛不用这些空闲内存来缓存一些磁盘的文件内容呢,这部分用作缓存磁盘文件的内存就叫做page cache。 用户进程启动read()系统调用后,内核会首先查看page cache里有没有用户要读取的文件内容,如果有(cache hit),那就直接读取,没有的话(cache miss)再启动I/O操作从磁盘上读取,然后放到page cache中,下次再访问...

934

Linux Kernel —— 学习经典书籍及网络资源推荐

http://blog.youkuaiyun.com/l_nan/article/details/37907751

jisuanji198509的博客 362
上一篇: LWN回顾: facebook利用transparent huge page来优化代码执行性能
下一篇: LWN: 2019年LWN年终总结!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值