LWN: 20年后能否解决 negative dentry 问题!

内存回收导致关键业务抖动案例分析-论云原生OS内存QoS保障 蒋彪,腾讯云高级工程师,10+年专注于操作系统相关技术,Linux内核资深发烧友。目前负责腾讯云原生OS的研发,以及OS/虚拟化的性能优化工作。 ## 导语 云原生场景,相比于传统的IDC场景,业务更加复杂多样,而原生 Linux kernel 在面对云原生的各种复杂场景时,时常显得有些力不从心。本文基于一个腾讯云原生场景中的一个实际案例,展现针对类似问题的一些排查思路,并希望借此透视Linux kernel的相关底层逻辑以及可能的优化方向。 ## 背景 腾讯云客户某关键业务容器所在节点,偶发CPU 阅读详情

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

Negative dentries, 20 years later

By Jonathan Corbet
April 11, 2022
DeepL assisted translation
https://lwn.net/Articles/890025/

文件系统和虚拟文件系统层的任务就是管理实际存在的文件,但 Linux 的 "dentry cache" (用来记住文件名查询的结果),也同样会跟踪那些不存在的文件。这个被称为 "negative dentries" 的 cache 在系统的整体性能优化中起到了非常重要的作用,但如果这个 cache 增长得过大的话,它的本身功能就会带来更多消极影响。随着 2022 年 Linux Storage, Filesystem, and Memory-Management Summit(LSFMM)的临近,"negative dentries" 的话题再次被提及;人们目前尚不清楚这次是否真的能解决这个问题。

内核里的 dentry cache 保存了在文件系统中查找一个文件所得到的结果。如果下次需要再查找同一个文件就可以使用 cache 的结果,避免了再次走一遍底层文件系统和访问存储设备。重复查询文件名的情况很常见,比如说 usr/bin/bash 或~.nethackrc 都是例子,所以这是一个重要的优化。

至于为什么要用 negative dentries 来记录那些失败的查找,可能人们就不那么容易一下子理解了。事实上经常出现反复尝试查找一个不存在的文件的情况,比如每次用户输入 "vi" 时,shell 都会遍历 PATH 里面的各个目录(Emacs 用户不会受影响因为他们启动一次编辑器之后就再也不会离开这个舒服的环境)。更常见的情况是 program loader 寻找共享库,或者编译器寻找 include 文件时产生的查询失败。在当今社会中,人们也经常收到建议说需要 "快速失败(fail fast)",在查找那些不存在的文件时,这确实是个好建议。

因此,negative dentries 是个好东西,但正如我们都知道的,过犹不及。虽然正常 dentry 会受到实际存在的文件数量的限制,但对不存在的文件数量却没有什么限制。因此,一个恶意(或根本不知道这里门道的)应用程序很容易就会创造出大量的 negative dentry 。如果内存紧张,内存管理子系统最终会努力将其中一些 negative dentry 回收掉。但是,在没有内存压力的情况下这些 negative dentry 可以无限积累下去,内存总是会被耗尽的,那时就会留下一个大麻烦需要清理了。

有些内核问题很快就能解决,有些则需要更长时间。LWN 早在 2002 年就简要地报道了关于 negative dentry 内存消耗的投诉了,差不多正好是 20 年前。在 2020 年初,LWN 也曾报道过一个最新的解决这个问题的尝试。虽然随着时间的推移,许多开发者已经对 negative dentry 问题进行过尝试了,但核心问题仍然存在。这些 dentry 仍然在占据宝贵的内存,而且它们还可能造成其他问题(如 soft lockup)。

A new discussion

在 3 月中旬 Matthew Wilcox 建议,negative-dentry 问题可以成为一个很好的 LSFMM 主题。"也许对这个问题进行一些集中的头脑风暴可以引出一些真正的解决方案"。通常情况下,仅仅提出这样一个话题就能引起为解决这个问题所需的头脑风暴。这一次没有发生,但它确实导致了 Stephen Brennan 发布了一个 patch set,展示了一个解决这个问题的新方法。

negative-dentry 问题带来的困难之一是很难知道什么时候该开始回收。系统的规模和工作负载千变万化,所以任何一种简单的限制都有可能导致某个场景出现性能 regression。可以考虑为系统管理员提供一个调节这个阈值的开关,但是这只是把问题推给了用户,人们普遍认为内核应该能够自己解决这些问题。但是,正如 Brennan 指出的,这并不容易:

很难通过查看一个 hash bucket 或 LRU list 来设计一个启发式规则从而确定合理的 negative dentry 数量,因为这个方法无法从小型系统轻易扩展到大型系统上去。但是针对每个目录来设置启发式规则,就会更容易扩展,而且更容易推理。

这组 patch 提出的具体启发式方法是,任何一个目录的 negative dentry 数量不应超过 positive dentry 数量的五倍。如果一个目录的 cache 中有 20 个 positive dentry,那么 negative dentry 就不能超过 100 个。这是一个很好的想法,只是有一个小问题:内核并没有针对每个目录来统计相关的 dentries 的数量或类型进行统计。

为了解决这个问题,Brennan 添加了一些代码,在与每个目录相关的 dentries list 中保持一个 "cursor"。每当有一个 dentry 操作(创建或删除)发生时,这部分代码会在 list 中把 cursor 后移 6 个 dentry 位置;如果连一个 positive dentry 都没有碰到过,那么就可以认为已经超过了限制,从而进行一些 negative dentry 的清理。将这项工作安排到 dentry 操作本身里面,就意味着这个开销会由那些创建了大量 dentry 的进程本身来承担,这似乎是个正确做法。

当然,这种方法的问题在于,没有任何方法可以迫使 dentry 是以特定的顺序添加到目录的 list 中的。取决于创建 dentry 的顺序,这种算法可能会对 positive 和 negative dentry 的实际比例得出错误结论,从而做错事。布伦南承认这个问题确实存在("确实这里会对各种 workload 有不同结果,我承认这个问题"),但还没有想出一个更好的主意。就目前的情况来看,这种算法似乎肯定会导致一些极端案例,这可能会阻止人们接受这个 patch set,即使没有其他什么担忧了。

The bigger problem

不过,在正常讨论中,Dave Chinner 认为,对 negative dentry 的关注只是解决了问题的表象,而忽略了更大的问题。他说,真正的问题是,内存压力是内核控制它所维护的许多 cache 的大小的唯一决定因素:

是的,这里的根本问题是,当 没有内存压力 的时候,内存回收机制对管理这些长期积累下来的单一使用目的的 cached object (缓存对象)毫无帮助。有[大量]的空闲时间和闲置资源可以合理地用来管理 cache,但我们没有。例如,没有对 cache 进行定期 rotate 从而触发对这些一次性使用的对象的检测和回收(例如在使用之后几分钟内进行检查),从而防止它们不必要地占满所有的内存,并在内存最终被用光时产生短暂的内存回收和分配延迟的高峰。

他说,与其担心 dentry cache,开发者不如想出一种机制来管理所有内核内 cache 的大小。Wilcox 原则上同意,但警告说不要把问题搞得太广泛,以至于变得难以解决。Chinner 则重申了这一点,他说有多个内核 cache 都有同样的问题,而基于某种定期扫描以使 cache 内的内容老化的解决方案,可以立即适用于所有的这些类型的 cache 中。

这个讨论已经结束了,没有人提出要建立 Chinner 希望看到的更通用的缓冲区老化机制。但问题仍然存在,而且似乎不太可能自己消失。所以这个讨论出现在 LSFMM 档期的可能性似乎相当高。也许三年来第一次在内存管理和文件系统领域的讨论将导致对解决方案达成某种程度的共识,最好是在已经过去了 20 年后的今天就能实现。

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

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

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

145829e488fa6ec9b6442ca464dd4d06.png

如何识别并解决复杂的dcache问题 背景:这个是在centos7.6的环境上复现的,但该问题其实在很多内核版本上都有,如何做好对linux一些缓存的监控和控制,一直是云计算方向的热点,但这些热点属于细分场景,很难合入到linux主基线,随着ebpf的逐渐稳定,对通用linux内核的编程,观测,可能会有新的收获。下面列一下我们是怎么排查并解决这个问题的。 一、故障现象 oppo云内核团队发现集群的snmpd的cpu消耗冲高, snmpd几乎长时间占用一个核,perf发现热点如下: + 92.00% 3.96% [kernel] 阅读详情

相关推荐

Linux文件存储抽象VFS

概念VFS(Virtual Filesystem Switch)称为虚拟文件系统或虚拟文件系统转换,是一个内核软件层,在具体的文件系统之上抽象的一层,用来处理与Posix文件系统相关的所有调用,表现为能够给各种文件系统提供一个通用的接口,使上层的应用程序能够使用通用的接口访问不同文件系统,同时也为不同文件系统的通信提供了媒介。架构VFS在整个Linux系统中的架构视图如下:Linux系统的User...

Oshyn —— 乐而学,学而乐 2403

Dentry negativity/negative dentry

Dentry negativity ByJonathan Corbet March 12, 2020 原文来自:https://lwn.net/Articles/814535/ 2017年时,Waiman Long提出patch来限制kernel里保存的"negative dentries"的数量。3年过去了,好消息是这个功能还在继续,可是,看起来仍然不能合入mainline。也可以理解,其实大多数人还根本不知道什么是negative dentries,以及为什么kernel开发者会关心这个概念。这.

RToax 1246

论文精读——A Comprehensive Survey of Continual Learning: Theory, Method and Application

为了应对现实世界的动态性,智能系统需要在其整个生命周期中逐步获取、更新、积累并利用知识。这种能力被称为Continue Learning(持续学习)。从广义上讲,持续学习明显受到catastrophic forgetting(灾难性遗忘)的限制,即学习新任务通常会导致旧任务的性能急剧下降。Continue Learning的核心目的有二,其一为(稳定性与可塑性间的权衡),其二为(足够的任务内/任务间泛化能力)。

xsddys的博客 1241

dentry是一个目录项(Directory entry),相当于一个文件目录,该文件目录里面有很多文件.//vfs dentry cache 模块实现分析/

1. dentry结构体dentry是一个目录项(Directory entry),相当于一个文件目录,该文件目录里面有很多文件。其实本质就是一个dir_entry结构体,重要成员有文件的inode索引号,文件名等,存储着文件的信息。dentry结构体相关信息: struct ext2_dir_entry_2 { __u32 inode; /* 文件的inode号 */ __u16 rec_len; /* 目录项长度 */ __u8 na

uunubt的专栏 2831

Fast-LIO2轮速计融合实战:打滑检测与协方差调参避坑指南

多传感器融合是提升移动机器人定位鲁棒性的关键手段。在激光雷达与惯性测量单元(IMU)紧耦合的基础上,加入轮式编码器作为额外的速度约束,能够有效抑制长走廊、重复纹理等退化场景下的漂移。其核心原理是通过运动学模型将轮速转换为机体系速度,并作为因子引入迭代误差状态卡尔曼滤波器(ESIKF)。然而,打滑现象与协方差参数设置是融合成败的关键。本文从工程实践出发,系统梳理了传感器配置、外参标定、打滑检测策略(运动学一致性、轮速自洽性)以及观测噪声协方差R与初始协方差P0的调参方法,并给出实测参数与问题排查速查表,为在F

weixin_34159110的博客 433

Unity 接入HybridCLR的点点滴滴,亲测三平台(PC、Android、WebGL)妥妥的。-问题分享

一入热更深似海啊,没有热更是真恼火啊,干啥啥不方便,动不动就得重新发包;说实在的,也是工作之余研究这个,在原有框架基础上接入这个热更,既要保持原有功能,还要支持热更,实实在在、断断续续搞了这么久,终于是接入并测通了,这一路是坎坎坷坷,下面把走过的弯弯绕绕记录下,希望对后来想接入的小伙伴有帮助吧。

GarFe的博客 1万+

LWN:Dentry negativity

关注了就能看到更多这么棒的文章哦~Dentry negativityByJonathan CorbetMarch 12, 2020原文来自:https://lwn.net/Artic...

Linux News搬运工 439

WSL2 Ubuntu复现FoundationPose项目(docker)

复现一个基于深度学习的物体姿态估计框架FoundationPose项目,使用docker,WSL2

woaidawangwang的博客 2000

dentry数据组织与相关操作

Linux用数据结构dentry来描述fs中与某个文件索引节点相链接的一个目录项(可以是文件,也可以是目录)。   每个dentry对象都属于下列几种状态之一:   (1)未使用(unused)状态:该dentry对象的引用计数d_count的值为0,但其d_inode指针仍然指

zhang_shuai_2011的专栏 1220

把 ABAP 采购订单增强做成一条可控流水线:BAdI ME_PROCESS_PO_CUST 全流程实战

摘要: SAP MM模块的ME_PROCESS_PO_CUST BAdI提供了采购订单全生命周期的增强点,覆盖从ME2*N事务到BAPI调用的各类场景。该接口通过INITIALIZE、OPEN、PROCESS_*系列方法、CHECK等组成完整处理流水线,支持字段控制、业务校验、数据派生等功能。关键注意事项包括:PROCESS_*方法仅在相关对象变更时触发、字段控制需区分参考键与动态规则、避免递归调用等。该BAdI采用面向对象设计,通过IF_PURCHASE_ORDER_*等接口操作采购单据对象,而非直接修改

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 402

初识数据之特征选择

【代码】初识数据之特征选择。

M_inherit的博客 1134

linux 内核 目录项高速缓存 dentry cache 简介

每个dentry对象都属于下列几种状态之一: (1)未使用(unused)状态:该dentry对象的引用计数d_count的值为0,但其d_inode指针仍然指向相关的的索引节点。该目录项仍然包含有效的信息,只是当前没有人引用他。这种dentry对象在回收内存时可能会被释放。 (2)正在使用(inuse)状态:处于该状态下的dentry对象的引用计数d_count大于0,且其d_inode指向...

whatday的专栏 6045

部署OpenClaw时设置环境变量提示export: not valid in this context的完整解决方案

OpenClaw环境变量设置错误解决方案 问题概述 在部署OpenClaw时设置环境变量出现"export: not valid in this context"错误,通常由以下原因导致: 在非交互式shell中使用export命令 在命令替换或管道中使用export 脚本文件包含Windows换行符(CRLF) 解决方案 修正脚本执行方式:确保export命令在正确的shell上下文中使用 使用source命令:通过. setup_openclaw.sh或source setup_op

博客 457

LWN:阻止root用户破坏已mount的文件系统!

关注了就能看到更多这么棒的文章哦~Defending mounted filesystems from the root userBy Jonathan CorbetAugust 21, 2023ChatGPT assisted translationhttps://lwn.net/Articles/941764/让文件系统在面对恶意创建的文件系统映像(filesystem images)时也能足...

Linux News搬运工 894

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

linux dentry cache

Linux dentry cache学习 每个dentry对象都属于下列几种状态之一:   (1)未使用(unused)状态:该dentry对象的引用计数d_count的值为0,但其d_inode指针仍然指向相关的的索引节点。该目录项仍然包含有效的信息,只是当前没有人引用他。这种dentry对象在回收内存时可能会被释放。   (2)正在使用(inuse)状态:处于该状态下的den

DenzilXu的专栏 9019

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

linux VFS中dentry结构解析

先看>此书中对dentry,file,process,inode这几个数据结构关系的解析。 进程每打开一个文件,就会有一个file结构与之对应。同一个进程可以多次打开同一个文件而得到多个不同的file结构,file结构描述了被打开文件的属性,读写的偏移指针等等当前信息。        两个不同的file结构可以对应同一个dentry结构。进程多次打开同一个文件时,对应的只有一个dentry

JuliusRyan的专栏 4596

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

linux性能优化-内核参数大全

linux内核参数大全

sre救赎之路 1055

linux dentry 实现机制分析

from: http://hary.wang.blog.163.com/blog/static/11695172820104572038197/  Linux用数据结构dentry来描述fs中与某个文件索引节点相链接的一个目录项(可以是文件,也可以是目录)。    每个dentry对象都属于下列几种状态之一:    (1)未使用(unused)状态:该dentry对象的引用计数

liliang199的专栏 736

dentry 和inode整理

direction 和inode的资料整理 文件打开

唯一的信仰 8388

linux虚拟文件系统综述

Linux延续了Unix的一个哲学观点:一切皆文件,应用看到的所有对象都是文件,里面除了socket不那么典型之外所有都是文件。而实际情况非常复杂,内核管理着非常多的设备:字符设备、块设备、网络设备,还支持许多类型的文件系统:ext2、ext3、ext4、fuse、ntfs等,另外还有很多的伪文件系统:proc、devfs、sys、debugfs等,特殊的节点类型:netlink、notify、epoll等。没有什么是不能通过增加一个抽象层解决的,VFS就作为linux中的这一抽象层完成了一切皆文件的哲学观

faxiang1230的专栏 497

dentry与inode、dentry_cache

dentry   一、dentry的定义   dentry的中文名称是目录项,是Linux文件系统中某个索引节点(inode)的链接。这个索引节点可以是文件,也可以是目录。   二、dentry的结构:以下是dentry的结构体   struct dentry {   atomic_t d_count; 目录项对象使用计数器   unsigned int d_flags; 目录项标志

peter_cloud的专栏 925

内核参数优化

fs.file-max = 999999:这个参数表示进程(比如一个worker进程)可以同时打开的最大句柄数,这个参数直线限制最大并发连接数,需根据实际情况配置。 net.ipv4.tcp_max_tw_buckets = 6000#这个参数表示操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。该参数默认为180000,过...

延瓒 7127

CentOS6 slab内存占用高故障排查

一、故障复盘 服务器总内存16G,所有进程占用内存4G,slab占用7G,其中dentry占用6G,一直无法释放。导致服务器内存持续在80%以上。 dentry的作用是目录项缓存,当打开一个文件时,系统会分配一部分dentry给这个文件,便于下次打开更快。 最终排查发现是由于curl时,会打开/usr/local/lib下的*.so文件,但这个路径下没有这些文件,于是打开时报错No such file or directory,导致占用了很多dentry,由于打开失败,只有open操作,没有close操作,

欢子不唱歌的博客 6361

linux 系统内存剩余内存不足,Cache占用过多内存导致Linux系统内存不足问题排查...

问题描述Linux服务器内存使用量超过阈值,触发报警。问题排查首先,通过free命令观察系统的内存使用情况,显示如下:totalusedfreesharedbufferscachedMem:24675796245871448865203570121612488-/+buffers/cache:226176442058152Swap:2096472108224198...

weixin_31029019的博客 1036

Linux内核学习笔记(一) 虚拟文件系统VFS

什么是VFS Vritual Filesystem 是给用户空间程序提供统一的文件和文件系统访问接口的内核子系统。借助VFS,即使文件系统的类型不同(比如NTFS和ext3),也可以实现文件系统之间交互(移动、复制文件等), 从用户空间程序的角度来看,VFS提供了一个统一的抽象、接口。这使得用户空间程序可以对不同类型的文件系统发起统一的系统调用,而不需要关心底层的文件系统类型。 从文件系统的...

胡LiuJia@BLOG 4861
上一篇: LWN:5.18合并窗口第一部分!
下一篇: LWN: KVM guest 里的私有内存!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值