LWN:测量和改进buffered I/O!

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

Measuring and improving buffered I/O

By Jake Edge
June 5, 2024
LSFMM+BPF
Gemini-1.5-flash translation
https://lwn.net/Articles/976856/

Linux 上存在两种类型的文件 I/O:缓冲 I/O (buffered I/O) 和直接 I/O (direct I/O)。缓冲 I/O 通过页面缓存 (page cache) 进行,而直接 I/O 直接访问存储设备。在 Luis Chamberlain 的 2024 年 Linux 存储、文件系统、内存管理和 BPF 峰会(Linux Storage, Filesystem, Memory Management, and BPF Summit)的主题提案 (topic proposal) 中,指出缓冲 I/O 的性能比直接 I/O 糟糕得多,尤其是在一项特定的测试中。该提案引发了一场邮件列表讨论,并在第二天 Paul McKenney 关于 RCU 的会议 (RCU session) 中被提及;Chamberlain 主持了一个联合存储和文件系统会议来讨论这些结果,并着眼于提高缓冲 I/O 性能。

测试目标

他首先概述了测试的目标,即测量页面缓存的极限并找到提高页面缓存性能的方法。为了提高性能,需要对其进行衡量;具体来说就是需要一种方法来避免在工作过程中引入性能回归 (performance regressions)。他做了很多关于页面缓存的测试,但需要尝试区分正常和病态的使用案例 (use cases)。

基于他所做的测试,以及 Chris Mason 对“正常”测试用例的建议,他想知道是否可以尝试在六个硬盘的 RAID 0 配置中实现缓冲 I/O 和直接 I/O 吞吐量一致 (throughput parity)。Dave Chinner 说“绝对不行”;他认为在那种配置下不可能让两种 I/O 类型达到吞吐量一致性。Chamberlain 建议峰会将是一个很好的场所,可以找出正确的方法、测试和配置来尝试测量和改进页面缓存性能(从而改进缓冲 I/O 性能)。

他在主题提案中提出的病态测试用例是引起了最多关注的一个。在一个资源丰富的系统上,他报告直接 I/O 的写速度为 86GB/s,而缓冲 I/O 的写速度仅为 7GB/s。这是一个巨大的差距;他想知道这是否是可以接受的,或者是否应该被调查并可能被修复。

Chamberlain 说,邮件列表讨论中还有一些其他的结果。Matthew Wilcox 报告了一个 64 字节随机读取 (random reads) 问题引出了 Linus Torvalds 的补丁 (patch);Kent Overstreet 进行了一些初步测试,发现它带来了 25% 的性能提升。Torvalds 对推动补丁 (patch) 合入的兴趣不大,但 Chamberlain 说他正在进一步测试它,以确保它不会崩溃。

他描述了一些其他在邮件列表讨论中出现的项目,其中一些已通过补丁解决。但病态测试用例的结果似乎是出乎意料的;对此应该怎么做?

Ted Ts'o 说,这类讨论总是围绕着权衡 (tradeoffs) 展开;你会以牺牲一定程度的安全为代价,来换取微基准测试 (microbenchmark) 的性能提升。也可能存在或不存在实际关心微基准测试中所衡量操作的用户空间应用程序 (user-space applications)。例如,他在现实生活中从来没见过任何一个需要进行 64 字节随机读取的应用程序。

他继续说,需要付出努力来确定这些问题是否会对实际应用程序产生影响,还需要付出更多努力来确保正在考虑的任何更改都不会破坏其他应用程序并使情况变得更糟。关于是否值得花时间来调查任何特定问题,需要回答一个哲学问题。

他将正在讨论的问题看作跟 撕裂写入问题 (torn-write problem) 类似的情况。如果解决这个问题,它将对数据库性能带来明显而显而易见的益处;对于提供 64 字节 I/O 的高性能,这一点是否也成立,对他来说还不清楚。在没有实际使用场景的情况下,“值得吗?” 但 Wilcox 说,64 字节读取问题来自一个真正的(且大型的)使用 Linux 的客户。

Chamberlain 说,Ts'o 的观点是有效的,但他在这个会议中的目标并不是找出需要解决的领域;他希望提出一些从他的测试中产生的问题。

并非出乎意料

Chinner 说,病态测试中的数据并不出乎意料。问题的一部分是缓冲 I/O 每个文件系统只有一个回写线程 (writeback thread),因此 I/O 无法比该线程更快。回写线程是 CPU 绑定的;“不是页面缓存很慢,而是清理页面缓存很慢”,他说。有一些技巧可以绕过这种限制,但需要研究的是如何把清理页面缓存的工作并行化。这可能是使用多个回写线程、使用直写 (writethrough) 或者其他机制;页面缓存的架构对于清理部分来说很难扩展。直写则意味着写入到页面缓存的同时也立即写入到存储设备。

Chamberlain 想知道房间里的人是否普遍同意 Chinner 的观点。Wilcox 说他并不反对,但如何进行扩展是一个有趣的问题。例如,一个需要在多个地方进行回写的单个大型文件,比处理多个需要回写的小型或中型文件更难扩展。

Chinner 说,回写中的大部分 CPU 时间都花在了扫描页面缓存以寻找需要写入的页面上,这与文件的大小没有太大关系。也有一些文件系统特定的考虑因素,但纯覆盖工作负载 (overwrite workload) 将具有更高的回写速率,因为所需的扫描量更少;此时它会遇到 LRU 锁的争用 (contention)。在这个组合中添加更多线程将毫无帮助,甚至可能使情况更糟。

Chinner 经常运行的一个工作负载模拟了一个带有大量文件的 untar 操作,每个文件都被创建、写入 4KB 并被关闭。XFS 在一个通常可以处理 7-8GB/s 的设备上卡在约 50K 个文件/s(约 200MB/s)左右的速度;这里限制就是因为只有单个回写线程。如果他在关闭文件时执行 flush,模拟直写机制,速率将大幅提高(达到 600K 个文件/s 或 2.4GB/s)。这个工作负载的回写问题可以很容易地并行化,但并非总是如此。关键问题是如何尽可能高效地将数据从页面缓存中取出并发送到磁盘。

Jan Kara 说,添加更多回写线程将很困难,因为在各个层级上都假设只有一个回写线程。他和 Chinner 讨论了如何做到这一点,尽管听起来会有很多工作要做。Ts'o 说,可能的原因是 SSD 速度非常快,因此优化这类事物的需求减少了。在 untar 和构建工作负载上获得 20% 的收益,这已经运行得很快了,并不那么吸引人。

Ts'o 说,可能有一些机会在某些类型的设备上简单地关闭回写,因为直写在这类高性能 SSD 上的性能要好得多。Chamberlain 想知道切换到直写是否有助于解决缓冲 I/O 的原子写入 (atomic-write) 问题;Chinner 说有可能。就这样,会议时间到了,尽管有人谈到在峰会后面的 BoF 会议中继续讨论。

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

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

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

5fc12b98a6bc01f52129b8636750b780.jpeg

打开链接下载源码: https://pan.quark.cn/s/c43e5bd27521 标题中的“AMD and Nvidia GOP update 1.9.6.rar”表示这是一个包含了AMD与Nvidia显卡的GOP(Graphics Output Protocol)驱动程序升级至1.9.6版本的压缩文件。该更新主要针对显卡在UEFI(统一可扩展固件接口)环境下的图形输出性能进行优化,并致力于提升系统的稳定性。在描述中提及“显卡附加UEFI引导工具,最新版”,表明此次更新内含了一个专为UEFI BIOS环境设计的显卡引导工具,或许表现为一个自启动脚本或程序,例如GOPupd.bat。通过这一工具,用户能够在UEFI模式下对显卡进行精确的配置初始化,从而保障操作系统能够最大化地发挥显卡的效能。必需的组件包括“colorama-0.4.3”,这是一个在Windows平台上用于管理颜色控制序列的Python模块,可能在更新过程中用于生成彩色命令行显示,以增强用户交互的直观性。此外,“Visual C++Redistributable”是微软提供的运行时支持库,旨在确保基于C++编译的应用程序能够正常运行,此处可能用于更新工具或相关依赖模块。标签“uefi bios”突显了该更新与UEFI BIOS系统的紧密关联,暗示其将作用于计算机的启动序列及硬件初始化过程。压缩包内的文件清单如下: 1. GOPupd.bat - 很有可能是负责执行GPU UEFI引导更新的核心脚本。 2. #Nvidia_ROM_Info.bat #AMD_ROM_Info.bat - 这两个文档可能用于采集Nvidia与AMD显卡的ROM数据,以辅助识别显卡型号并执行适配性验证。 3....
代码下载地址: https://pan.quark.cn/s/a2e2c95e6128 意法半导体(STMicroelectronics)研发的STM32H750是一款性能优越的微控制器,属于STM32H7系列,拥有卓越的处理性能以及多元化的外设接口。在此项工作中,我们将研究如何借助STM32H750达成串口空闲中断(IDLE interrupt)的运用、借助DMA完成UART(通用异步收发传输器)的数据传输,并且探究如何运用STM32CubeMX配置并构建MDK5(Keil uVision5)项目。串口空闲中断是串口通信中的一个核心功能,当串口在一段时间内没有进行数据交换时,会引发该中断。这种功能在需要实时监测串口状态的应用场合中非常有价值,比如,在等待特定指令或需要降低能耗的情况下。在STM32H750中,设定串口空闲中断通常包含以下几个环节: 1. 串口设置:在STM32CubeMX中选定相应的UART接口,并激活中断功能。 2. 中断优先级设定:按照应用需求设定中断优先级。 3. 中断服务函数注册:在程序代码中定义中断服务函数以应对中断事件。 4. 启用串口空闲中断:在初始化代码中激活串口的IDLE位,使能中断。 DMA(Direct Memory Access)传输是一种高效的数据传输机制,它允许外设直接与内存进行交互,无需CPU的介入,从而减轻了CPU的工作负担。在STM32H750中,我们可以运用DMA配合UART来接收数据: 1. DMA配置:在STM32CubeMX中为UART选择合适的DMA通道,并设定传输特性。 2. UART配置:将UART设置为DMA模式,并指定接收缓冲区的地址。 3. 中断配置:开启DMA传输完成中断,以便在数据接收完...
源码直接下载地址: https://pan.quark.cn/s/d64de7ee3e36 STM32CubeIDE是由STMicroelectronics(意法半导体)开发的一款集成开发环境,其核心功能是针对STM32系列微控制器进行优化,并集成了包括源代码编写、编译执行、调试检测以及项目参数设置在内的完整开发工具集。该开发平台依托于Eclipse系统框架构建,旨在为编程人员营造一个便捷且生产力高的工作场景。1.9.0版本属于其产品线中的一个成熟版本,通常包含了若干性能增强措施以及新特性的集成。在嵌入式系统的构建过程中,代码的自动完成机制是一项关键的辅助技术,它能够显著提升工作速率并降低操作失误。专门为这一目的设计的STM32CubeIDE 1.9.0自动代码补全组件,能够有效满足开发者的相关需求。通过将压缩文件中的内容部署到STM32CubeIDE安装路径下的`plugins`子目录中,该插件即可被系统自动检测并激活,从而在代码编写阶段,系统能够基于上下文信息智能地预判并展示潜在的函数名称、变量定义或常量值,进而辅助开发者迅速完成输入任务。基于ARM Cortex-M架构的STM32系列微控制器,在物联网装置、工业自动化系统、个人消费类电子设备等领域具有广泛的部署。在这些应用场景中,单片机扮演着核心角色,而STM32凭借卓越的处理性能、多样化的外部接口配置以及出色的能源控制能力,已成为众多开发者的首选方案。STM32CubeIDE所提供的自动代码补全功能,对于初入行业的开发者而言尤为适宜,因为它能够实时呈现API函数的相关信息,涵盖函数标识符、参数的数据类型与数目,乃至函数的返回类型,从而协助开发者精准地运用STM32的固件库。不仅如此,即便对于已经熟练掌握ST...
内容概要:本文系统阐述了物理信息神经网络(PINNs)在求解布洛赫-托雷(Bloch-Torrey)方程中的实际应用,结合PyTorch框架提供了完整的Python代码实现案例。该方法通过将物理方程的先验知识嵌入神经网络的损失函数中,实现了无需大量标注数据即可高精度求解复杂的偏微分方程,特别适用于科学计算与工程仿真领域。文章不仅展示了PINNs在特定物理模型中的建模流程与实现细节,还强调了科研过程中逻辑严谨性、善用工具与创新思维的重要性,倡导读者循序渐进地学习,避免因过度纠结技术细节而迷失方向。配套的完整代码与资料可通过指定网盘链接或关注公众号“荔枝科研社”获取。; 适合人群:具备扎实数学基础与Python编程能力,从事科研工作或攻读研究生及以上学位的研究人员,尤其适合专注于物理建模、数值仿真、深度学习与科学计算交叉领域的学习者与开发者。; 使用场景及目标:①掌握PINNs求解经典物理方程(如Bloch-Torrey方程)的整体建模思路与代码实现流程;②深入理解如何将物理守恒律与微分算子作为软约束或硬约束融入神经网络训练过程,从而提升模型的泛化性与物理一致性;③为开展相关课题研究、撰写学术论文、复现前沿研究成果或进行跨学科创新提供可靠的技术参考与代码支持。; 阅读建议:建议读者结合所提供的代码实例,逐行调试并可视化训练过程,重点关注损失函数的设计、物理残差项的构建以及网络超参数的调优策略。同时,推荐关注公众号“荔枝科研社”以获取完整资源包,便于进行更深层次的实践拓展与科研创新。
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 EtherCAT(Ethernet for Control Automation Technology)是一种专为自动化技术打造的实时工业以太网通信协议。该协议于2003年由Beckhoff Automation公司发布,凭借其卓越的高速传输能力、极低的延迟以及精准的时间同步性能,在自动化行业中获得了广泛的部署应用。本文将详细剖析EtherCAT协议的工作原理、系统架构、核心优势以及相关的编程操作实践。 EtherCAT协议虽然基于标准的TCP/IP协议栈,但通过独特的数据传输方案,实现了设备间数据包的高效快速传送。其核心思想在于“分布式时钟”技术,这一机制保证了所有参与设备能够达到微秒级的时间同步精度,这对于需要精确协调的自动化操作而言至关重要。协议的运作模式遵循主从结构,其中主站负责整体的数据调度交换任务,而从站则承担具体的控制功能。 1. ** EtherCAT协议结构**: 构成EtherCAT网络的基本单元是由一个主站以及多个从站组成,这些从站可以涵盖多种类型的现场设备,例如可编程逻辑控制器(PLC)、各类传感器或执行机构。主站通过在以太网帧中封装控制指令来驱动网络,这些指令信息在从站之间实现无缝传递,每个从站仅处理与其功能相关的数据,并在数据流转过程中进行必要的更新,从而达成高效的数据交互。 2. ** 数据传输**: EtherCAT运用了“反向通道”机制,使得数据在以太网帧的有效载荷区域内进行双向流动。主站发出的指令帧内包含了完整的工作周期数据,从站根据需求提取相关数据,并在返回的响应帧中反馈其状态信息,这种设计显著缩短了通信的延迟时间。 3. ** 时间...
打开链接下载源码: https://pan.quark.cn/s/1a3eab4afa50 《MCGS调试助手V2.52.0——达成高效智能工业自动化调试》 MCGS(Monitor and Control Graphic System)调试助手是一款针对工业自动化领域研发的卓越工具,其最新版本V2.52.0致力于增强用户在系统集成、设备调试环节中的效能与便捷性。该软件在工业控制系统的构建、调试、运行监测等方面扮演着核心角色,为工程师们呈现了一站式的解决策略。 MCGS调试助手的主要特性涵盖: 1. **图形化界面构建**:MCGS集成丰富的图形资源库可定制组件,使用户能够便捷地设计出直观的监控界面,从而提升操作人员的工作效能系统的可视化水平。 2. **即时数据获取**:该软件能够与多种PLC、仪表、传感器等硬件设备进行数据交互,完成即时数据的采集与处理,为决策提供精准的数据支持。 3. **逻辑编程支持**:软件兼容梯形图、指令表等多种编程模式,用户可依据实际需求编写控制程序,达成复杂工艺流程的自动化管理。 4. **警示与事件处理**:具备全面的警示功能,能够记录并展示设备运行期间的异常现象,有利于问题的诊断故障的纠正。 5. **远程监测与故障诊断**:借助网络连接,MCGS调试助手支持用户对设备进行远程的监控与管理,从而减少维护开支,尤其是在广泛分布或难以到达的工业环境中。 6. **数据存储与分析**:系统拥有强大的历史数据存储检索能力,支持生成数据报告,有助于进行生产数据的评估改进。 7. **设备互联与物联网整合**:搭配提供的物联网程序补丁升级包,例如U盘方案包,能够轻松实现设备的网络连接,契合工业4.0的发展方向。 在提供的两个U盘方案...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值