LWN:如何处理硬件出错导致的错误page-cache page?

页高速缓存(page cache学习) 最近要接触相关领域,学习一下共勉!!本文档使用linux为linux-4.4.4版本 磁盘高速缓存:是一种软件机制,它允许系统把通常存放在磁盘上的一些数据保留在RAM中,以便对那些数据的进一步访问不用再访问磁盘而能尽快得到满足。 一种对完整的数据页进行操作的磁盘高速缓存。 几乎所有的文件读和写操作都依赖于页高速缓存。只有在O_DIRECT标志被置位而进程打开文件的情况下才会出现例外:此时,IO数... 阅读详情

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

How to cope with hardware-poisoned page-cache pages

By Jonathan Corbet
May 5, 2022
LSFMM
DeepL assisted translation
https://lwn.net/Articles/893565/

"hardware poisoning" 是一种检测和处理运行系统中出现内存错误的机制。当某一段内存区域内内容不再正确时,它就是 "中毒(poisoned)" 了,对这个区域的后续访问将产生错误。内核对 hardware poisoning 的支持已超过十年,但这并不意味着它就不需要改进了。在 2022 年的 Linux 存储、文件系统、内存管理和 BPF 峰会上,Yang Shi 讨论了当 hardware poisoning 影响到 page cache 所有的内存时该如何处理的问题。

page cache 中存放着后备存储中的文件的一部分 page 的副本。如果 page cache page 产生错误不再能准确地反映文件中的数据,就不应该再被使用了。如果该 page 在从后备存储中读取后就没有被修改过,那么解决方法很简单,直接丢弃然后将数据重新读入能正常工作的内存区域。但是,如果该 page 是 dirty 状态的(被 CPU 写入过),情况就更难处理了。Shi 说,目前该 page 会被从 page cache 中删除,其中的数据都会丢失。除非进程将受影响的 page 映射到了他们的地址空间,否则进程就不会收到通知。

Shi 说,这种行为会导致数据默默地就丢失了。随后对该 page 的访问将产生不正确的数据,而用户却不知道这里出现了问题。这就导致了一些很难 debug 的问题。

822e7f51c85d61454d858bf2160d13c9.png

为了解决这个问题,他继续说,内核应该把中毒的 page 保留在 page cache 中,而不是丢弃掉。需要把这个问题告知拥有该 page 的文件系统,并且不能尝试将该 page 写回后备存储里。有些操作,如 truncate 或 hole-punching 可以继续允许正常使用,因为相关结果应该是正确的。但如果以其他方式访问该 page 的话必须返回一个错误。

有几种方法可以实现这种行为。一种是在每个访问 page cache 的 page 的路径上检查 hardware-poison flag,这将需要修改大量的代码。另一种方法是,在 cache 中查找 page 时返回 NULL。这样做的好处是,调用者已经能够处理 NULL 的返回值,所以应该不会感到意外,只是返回的错误代码会是 ENOMEM,这可能会让人感到吃惊或误解。最后,page cache 的查找(lookup)动作可以改为返回 EIO,这能更好地表明真正的问题来自哪里。不过,这个改动会有更大的影响,因为调用者没有准备好处理这种返回状态。

Matthew Wilcox 跳出来说,只有第一个选择才是真正可行的方案。poison 问题是按 page 来追踪的,但更高层级的接口正在被转换为 folio,其中可以包含多个 page。一个 folio 中未被破坏的部分应该仍然可以被访问到,所以 page cache 的 lookup 机制需要能保持正常工作。Dan Williams 说,在 DAX 代码中(实现 persistent memory 中的文件的 direct access),他所采取的方法是将错误告知文件系统,并仍然从 page cache 中删除掉该 page。他说,这样就可能给用户返回错误了;这可能也是处理普通内存设备中的错误的一个好方法。

Ted Ts'o 同意 Williams 的观点,他说,如果关于一个损坏的 page 的信息只存在于内存中,那么系统 crash 的时候就会导致这些信息都丢失了,这也会导致相应的数据损坏无人知道。他说,这里提出的解决方案做了大量的工作,只在下一次重启发生之前返回 EIO。还需要文件系统这边做更多工作来维护这些信息,但最终来看可能是更好的方法。他说,有一种方法可以使其更容易,那就是不用关心逐个追踪损坏的 page;相反,可以给文件标记一下它其中有的地方已经损坏了。

Shi 认为,在大型数据中心环境中,内存故障并不是特别罕见的现象,而且他的两种方法任何一种都比什么都不做要好。另外,他说,用户很可能关心文件中的哪一个 page 被损坏了,所以仅仅把文件作为一个整体来标记可能是不够的。

Kent Overstreet 说,除了向用户返回出现问题的标志信息外,这项工作的重点是要避免向磁盘写回垃圾数据。然后,如果系统崩溃,"石板就被擦拭干净了",损坏的内存不再存在。他说,crash 其实可能是最好的情况。Wilcox 回答说,这种 "最好的情况" 也仍然会导致数据损失。

Josef Bacik 说,存储损坏了的数据,对他来说是最有意义的;具体实现方法主要是在通用的文件系统代码中。当被告知有问题时,文件系统代码应该标记出受到影响的 page,拒绝从这些 page 返回任何数据,并注意避免将它们写入后备存储。但他建议,每个文件有一个标志可能就足够了。开发人员(包括用户空间的和内核空间的)全部都不擅长处理错误场景,所以这个机制应该保持简单,特别是在最开始的时候。开发人员可以在以后 "尝试更加花哨的方法",如果看起来确实有必要的话。

David Hildenbrand 反对说,每个文件一个标志的话可能会阻碍虚拟机从存储在单一文件中的镜像来运行。这种情况一个错误就会阻止整个文件的使用了,基本上就会导致虚拟机被 kill。能追踪单个 page 的话可能更适合于这种使用情况。但 Bacik 重申,社区人员一定会写出错误的代码,所以应该先做尽量简单的案例。

随着时间的推移,Wilcox 指出,文件系统可以处理向一个损坏的 page 写入的情况,如果整个 page 都被覆盖的话。在这种情况下,损坏的数据就消失了,而文件又一次处于用户预期的状态了。不过,Goldwyn Rodrigues 指出,对于 copy-on-write 的文件系统来说,情况并不那么简单,它们可能仍然有损坏的 page 在那里。Bacik 说,这种情况正是他反对花哨的解决方案的原因。

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

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

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

bac4ac98c6dc607f12308c5efad94d16.png

Linux系统 mmap 存储映射 括号中表示预期行为,括号外部的表示在LINUX系统中的实际行为,比如组合SHARED/EXEC的读行为,对于一个可执行的共享地址来说,没有给与PROT_READ属性,预期当然不可读,但是由于CPU执行上面的代码,必须要进行读操作,而实际的硬件架构和及并没有区分执行读和其它方式的读,所以,实际上对于这样的内存,仍然是可读的。从上图中可以看到,这段匿名区域(可能是MMAP区域,现在的MALLOC都用MMAP实现)地址是向下增长的,像栈一样,就像前面提到的第二种情况,这是在哪里控制的呢? 阅读详情

相关推荐

Linux内存管理 内存检测技术(slub_debug/kmemleak/kasan)

https://www.cnblogs.com/arnoldlu/p/8568090.html Linux常见的内存访问错误有: 越界访问(out of bounds) 访问已经释放的内存(use after free) 重复释放 内存泄露(memory leak) 栈溢出(stack overflow) 不同的工具有不同的侧重点,本章主要从slub_debug、kmemleak、kasan三个工具介绍。 kmemleak侧重于内存泄露问题发现。 slub_debug和kasan有一定的重复,部分slub_

xwb1040885790的博客 1370

谁是DBA圈里最大的背锅侠?

上周六的早上,公司某个基地的MES数据库异常重启,结果因为夜里儿子发烧晚上没睡好,电话完全没听到,直到7点儿子醒来叫我起床​。节点2 lmon进程检测到cgs的缓慢触发bug19496214,导致集群reconfiguration,节点2重启,重启后又因为触发Bug 18336452 导致节点2的db启动失败,直到手动startup​。从时间线上看,整个应用宕机的时间应该是6:30-6:35,其他时间都至少有一个节点live,但是6:35-7:20​这段时间为什么系统不可用​呢?因为我没有接听到​电话吗?

xiaofan23z的专栏 1440

DPABINet保姆级教程:零代码完成脑网络分析与图论计算

本文提供DPABINet的零代码脑网络分析全流程指南。该工具通过图形化界面集成时间序列提取、连接矩阵构建、图论指标计算及统计分析,大幅降低技术门槛。重点解析了阈值选择、二值化与小世界属性计算等关键步骤,帮助研究者快速掌握脑网络分析与图论计算,提升科研效率与可重复性。

j2k3l4的博客 668

RAC 主机内存条故障导致的一个节点重启

今天业务反馈有一台主机登入不上去,环境是RAC,只有一个节点重启了,另外一个节点正常。我同事比我先处理一段时间,导致了ocssd.log里面的日志没有拿下来(ohasd.log,ocssd.log这些日志产生的日志量比较大,不像DB的alter日志,当ocssd.log日志是会覆盖的,假设你9:00集群宕机的,当你10:00再去看日志会发现里面日志没有9:00日志了,都是最近的日志,这也是我为什么...

小楼一夜听春雨,深巷明朝卖杏花 2860

MT 103 Single Customer Credit Transfer单笔客户转账

MT 103 Single Customer Credit Transfer单笔客户转账 MT103电文能通过三种方式交换,依赖电文使用的业务场景。 (1)   核心MT103电文是一个通用电文,发送和接收此电文不需要在电文用户组(MUG)注册。允许使用所有MT103电文域来交换单客户转账,除了77T域(信封内容)。MT103电文如果是根据预先约定的双边/多边规则的格式,则可以直通处理。 (

shuytu 1万+

Solidworks转URDF避坑实录:从履带机器人到ROS仿真的完整配置流程

本文详细介绍了将Solidworks履带机器人模型转换为URDF格式并配置ROS仿真的完整流程,重点解析了坐标系设置、复杂关节定义、插件配置等关键步骤中的常见问题与解决方案,帮助开发者高效实现履带机器人在RVIZ和Gazebo中的精确仿真。

weixin_30693683的博客 456

Linux内核学习笔记(八)Page Cache与Page回写

综述 Page cache是通过将磁盘中的数据缓存到内存中,从而减少磁盘I/O操作,从而提高性能。此外,还要确保在page cache中的数据更改时能够被同步到磁盘上,后者被称为page回写(page writeback)。一个inode对应一个page cache对象,一个page cache对象包含多个物理page。 对磁盘的数据进行缓存从而提高性能主要是基于两个因素:第一,磁盘访问的速度...

胡LiuJia@BLOG 2万+

从零开始:用这些公开数据集搞定电力AI项目(含鸟巢、绝缘子、负荷预测等33个实战资源)

本文系统梳理了电力AI领域33个精选公开数据集,涵盖目标检测、负荷预测等关键场景,如鸟巢检测、绝缘子缺陷识别等。通过实战案例解析数据预处理、模型选型及性能优化策略,帮助工程师快速构建端到端解决方案,解决电力AI项目中的数据获取与处理难题。

weixin_42522552的博客 216

内存管理(四):缺页中断处理(读奔跑吧linux内核笔记)

一:缺页中断处理 在调用malloc后只建立了虚拟地址空间,没有分配内存对应的物理内存,当进程访问没有建立映射关系的虚拟内存时,会产生缺页中断(考虑的问题比较多:匿名页面,KSM页面,pagecache页面,写时复制,私有映射,共享映射)。 缺页异常处理依赖于处理器的体系架构,因此缺页异常底层的处理流程在内核代码中的特定结构部分。 __vectors_start是中断异常处理的起点,具体到缺...

zuodenghuakai的博客 3277

ABB机器人姿态与四元数(笔记)

通常使用机器人作业时,机器人的法兰轴(5轴)往往是垂直与作业平面的,此时需要将机器人的姿态调整(示教)到垂直于工作平面的状态,然后记录当前的姿态,作为之后作业的参考标准姿态。不同机器人表示控件姿态的方式不一样,但也无外乎3中:旋转矩阵、欧拉角和四元数。 ABB机器人使用的是四元数(可转欧拉角)作为机器人控件姿态的表示方式。这里主要是记录在不通过示教的方式下,如何定义四元数,使机器人达到垂直于工作平面的姿态。 5轴竖直向下(常用):此时,各轴角度为 [0,0,0,0,9...

Zythonista的博客 1万+

统一大型语言模型和知识图谱:路线图

大型语言模型(LLM),如ChatGPT和GPT4,由于其涌现能力和泛化性,正在自然语言处理和人工智能领域掀起新的浪潮。然而,LLM是黑箱模型,通常无法捕捉和获取事实知识。相反,知识图谱(KGs),例如维基百科和华普,是显式存储丰富事实知识的结构化知识模型。KGs可以通过为推理和可解释性提供外部知识来增强LLM。同时,KGs很难从本质上构建和演化,这对KGs中现有的生成新事实和表示未知知识的方法提出了挑战。因此,将LLM和KGs统一在一起并同时利用它们的优势是相辅相成的。

qq_32907491的博客 2841

Linux内存管理 (11)page引用计数

专题:Linux内存管理专题 关键词:struct page、_count、_mapcount、PG_locked/PG_referenced/PG_active/PG_dirty等。   Linux的内存管理是以页展开的,struct page非常重要,同时其维护成本也非常高。 这里主要介绍struct page中_count/_mapcount和flags参数。  flags是页面标志位集合,...

weixin_33724046的博客 448

【大模型】DeepSeek 高级提示词技巧使用详解

DeepSeek 高级提示词技巧使用详解

congge 1万+

Google Sanitizers

Google Sanitizers Google的sanitizers一共有5种: AddressSanitizer (检查寻址问题) :包含LeakSanitizer (检查内存泄漏问题) ThreadSanitizer:检查数据竞争和死锁问题(支持C++和Go) MemorySanitizer:检查使用未初始化的内存问题 HWASAN(Hardware-assisted AddressSanitizer):AddressSanitizer的变种,相比AddressSanitizer消耗的内存更

weixin_42654107的博客 3156

​非线性分析-增加位移量可能出现下面错误。虽然求解无法在所有时间点完成,但在某些点上仍能够求解部分结果。请参阅“帮助系统”中的故障排除,以了解更多信息详情。由于受约束,规划求解引擎无法收敛

基于收敛状态拆分载荷步‌:在已收敛的载荷步基础上,将未收敛的关键区域拆分为更细的子步,比如在载荷突变点前设置5~10个子步,逐步加载。替换冲突约束为弱约束‌:若存在约束冲突,将刚性约束替换为弱弹簧约束(刚度设为1e-6~1e-4),既限制刚体位移,又不影响结构的变形自由度,命令流:SPRING, NODE, K, 1e-6。部分区域约束完整,但存在未被约束的刚体自由度,或约束类型与大变形/接触逻辑冲突,比如某部件的位移约束在初始阶段有效,但大变形后约束位置脱离实际受力点,导致求解器在该阶段无法收敛。

qq_15963745的博客 144

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

linux PAGE_POISONING用法

page poison,内存毒药,page free时给page填充特定字节0xaa,在page alloc时check page内容是否有非0xaa的字节, 有的话,代表当前分配的page被其他page盖到,或者说这个page周边的page有发生内存溢出; 代码实现在debug_pagealloc.c中的kernel_map_pages: kernel/mm/Makefile:obj-$(

u014089131的博客 3047

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

kernel-4.4 slab(一)

linux slab作为用于小块内存分配的机制,主要用于低于PAGE SIZE大小内存的分配,是相对于page_alloc用于分配以页为单位的内存来说的。 slab机制主要分为slab描述符的创建,slab对象的分配,slab对象的回收。 1. slab的创建: 先看slab描述符: struct kmem_cache { struct array_cache __percpu *cp...

laughing_zou的专栏 645

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

linux page结构定义,linux 的 page 结构体的一点笔记

Linux的内核在内存管理中处理的最小单位是physical pages然而处理器的的最小的可寻址的单位是byte 或者是 word很多32位系统构架都是4k的页,64位则是8k的页所以对于4k的页,1G的内存就有262144个不同的页内核通过struct page 结构体来表示每一个页,定义在中程序代码: /** Each physical page in the system has a st...

weixin_39626298的博客 677

文件系统读写--page cache机制

10.1.1 buffer I/O 和 direct I/O 10.1.2 buffer head 和 块缓存 10.1.3 page cache的管理 10.1.4 page cache的状态

abcdefg的专栏 6621

什么是页缓存(Page Cache)(转载)

我们知道文件一般存放在硬盘(机械硬盘或固态硬盘)中,CPU 并不能直接访问硬盘中的数据,而是需要先将硬盘中的数据读入到内存中,然后才能被 CPU 访问。 由于读写硬盘的速度比读写内存要慢很多(DDR4 内存读写速度是机械硬盘500倍,是固态硬盘的200倍),所以为了避免每次读写文件时,都需要对硬盘进行读写操作,Linux 内核使用页缓存(Page Cache)机制来对文件中的数据进行缓存。 本文使用的 Linux 内核版本为:Linux-2.6.23 什么是页缓存 为了提升对文件的读写效率,Li

一个嵌入式软件工程师的博客 8534

【Linux 内核知识梳理 4】Page Cache与 Page 回写

【Linux 内核知识梳理 4】Page Cache与 Page 回写1. Page Cache2. 读 Cache3. 写Cache4. Cache回收5. LRU算法6. Two-List策略7. Page Cache在Linux中的具体实现7.1 address_space结构7.2 address_space操作函数8. Buffer Cache9. Flusher线程群(Flusher Threads) Page Cache 是通过将磁盘中的数据缓存到内存中,从而减少磁盘I/O 操作,从而提高性能

|~~~热爱生活、努力学习的小伙汁~~~| 805

Linux 内存管理窥探(5):page 数据结构

本文参考:https://blog.youkuaiyun.com/gatieme/article/details/52384636 感谢作者无私的奉献   前面聊过内存的表示由 node -> zone -> page ,聊聊 page 结构。 内核把物理页作为内存管理的基本单位. 尽管处理器的最小可寻址单位通常是字, 但是, 内存管理单元MMU通常以页为单位进行处理. 因此,从虚拟内存的上...

StephenZhou 1万+

窃取Linux内核page以构建窝藏自己的Rootkit

窃取内核的page?是的,偷page意味着我们绕过page分配的一切规则和接口,直接从freelist中摘取一个空闲的page来用。 直接看个POC吧,我来模拟一个task_struct的分配过程: #include <linux/module.h> #include <linux/mm.h> #include <linux/sched.h> static void * page_steal(unsigned int j) { void *addr = NULL;

TCP/IP 1万+

LWN:回收未用的页表页的多种方法!

关注了就能看到更多这么棒的文章哦~Ways to reclaim unused page-table pagesBy Jonathan CorbetMay 9, 2022LSFMMDeepL assisted translationhttps://lwn.net/Articles/893726/内存管理子系统最重要的工作之一就是回收未使用(或很少使用)的内存,能够更好地利...

Linux News搬运工 332

page config

web安全性 在虚拟目录中必须存在一个web-inf文件夹,但是细心的用户发现,在每次访问的时候不能发现这个文件夹 web-inf用户无法看见,说明其安全是最高的 此时,就可以通过映射路径的方式完成  /WEB-INF/hello.jsp he /hello.mldn Servlet-mapping表示的是一个映射路径的配置,在访问的时候直接通过url-patter

出任CTO的博客 1094

LWN: COW以及它最近引出的一系列问题 - 第二部分

关注了就能看到更多这么棒的文章哦~Patching until the COWs come home (part 2)March 25, 2021This article was cont...

Linux News搬运工 597
上一篇: LWN:folio的最新情况!
下一篇: LWN:要提供更好的 OOM 调试工具!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值