dentry与inode、dentry_cache

元宝DeepSeek Linux 系统中的缓存主要包括内存缓存(Page Cache、dentry、inode)和软件包管理器缓存(如 yum/apt) Linux 系统中的缓存主要包括内存缓存(Page Cache、dentry、inode)和软件包管理器缓存(如 yum/apt)。文档未详述具体的清理命令组合,但基于我所掌握的知识,以下是针对不同目标的清理方法:一、清理内存缓存(Page Cache、dentry、inode)仅清理页面缓存(Page Cache)清理目录项和 inode 缓存(dentry、inode)清理页面缓存、目录项和 inode 缓存(最彻底)说明:• sync 命令将内存中的脏数据写入磁盘,防止数据丢失。 阅读详情

dentry

  一、dentry的定义
  dentry的中文名称是目录项,是Linux文件系统中某个索引节点(inode)的链接。这个索引节点可以是文件,也可以是目录。
  二、dentry的结构:以下是dentry的结构体
  struct dentry {
  atomic_t d_count; 目录项对象使用计数器
  unsigned int d_flags; 目录项标志
  struct inode * d_inode; 与文件名关联的索引节点
  struct dentry * d_parent; 父目录的目录项对象
  struct list_head d_hash; 散列表表项的指针
  struct list_head d_lru; 未使用链表的指针
  struct list_head d_child; 父目录中目录项对象的链表的指针
  struct list_head d_subdirs;对目录而言,表示子目录目录项对象的链表
  struct list_head d_alias; 相关索引节点(别名)的链表
  int d_mounted; 对于安装点而言,表示被安装文件系统根项
  struct qstr d_name; 文件名
  unsigned long d_time; /* used by d_revalidate */
  struct dentry_operations *d_op; 目录项方法
  struct super_block * d_sb; 文件的超级块对象
  vunsigned long d_vfs_flags;
  void * d_fsdata;与文件系统相关的数据
  unsigned char d_iname [DNAME_INLINE_LEN]; 存放短文件名
  };
  三、dentry与inode
  inode(可理解为ext2 inode)对应于物理磁盘上的具体对象,dentry是一个内存实体,其中的d_inode成员指向对应的inode。也就是说,一个inode可以在运行的时候链接多个dentry,而d_count记录了这个链接的数量。
  按照d_count的值,dentry分为以下三种状态:
  1、未使用(unused)状态:该dentry对象的引用计数d_count的值为0,但其d_inode指针仍然指向相关的的索引节点。该目录项仍然包含有效的信息,只是当前没有人引用他。这种dentry对象在回收内存时可能会被释放。
  2、正在使用(inuse)状态:处于该状态下的dentry对象的引用计数d_count大于0,且其d_inode指向相关的inode对象。这种dentry对象不能被释放。
  3、负(negative)状态:与目录项相关的inode对象不复存在(相应的磁盘索引节点可能已经被删除),dentry对象的d_inode指针为NULL。但这种dentry对象仍然保存在dcache中,以便后续对同一文件名的查找能够快速完成。这种dentry对象在回收内存时将首先被释放。
  四、dentry与dentry_cache
  dentry_cache简称dcache,中文名称是目录项高速缓存,是Linux为了提高目录项对象的处理效率而设计的。它主要由两个数据结构组成:
  1、哈希链表dentry_hashtable:dcache中的所有dentry对象都通过d_hash指针域链到相应的dentry哈希链表中。
  2、未使用的dentry对象链表dentry_unused:dcache中所有处于unused状态和negative状态的dentry对象都通过其d_lru指针域链入dentry_unused链表中。该链表也称为LRU链表。
  目录项高速缓存dcache是索引节点缓存icache的主控器(master),也即 dcache中的dentry对象控制着icache中的inode对象的生命期转换。无论何时,只要一个目录项对象存在于dcache中(非 negative状态),则相应的inode就将总是存在,因为 inode的引用计数i_count总是大于0。当dcache中的一个dentry被释放时,针对相应inode对象的iput()方法就会被调用。
  五、dentry_operations *d_op
  struct dentry_operations {
  int (*d_revalidate)(struct dentry *);
  int (*d_hash) (struct dentry *, struct qstr *);
  int (*d_compare) (struct dentry *, struct qstr *, struct qstr *);
  void (*d_delete)(struct dentry *);
  void (*d_release)(struct dentry *);
  void (*d_iput)(struct dentry *, struct inode *);
  };
  d_revalidate:用于VFS使一个dentry重新生效。
  d_hash:用于VFS向哈希表中加入一个dentry。
  d_compare:dentry的最后一个inode被释放时(d_count等于零),此方法被调用,因为这意味这没有inode再使用此dentry;当然,此dentry仍然有效,并且仍然在dcache中。
  d_release: 用于清除一个dentry。
  d_iput:用于一个dentry释放它的inode(d_count不等于零)
  六、d_parent和d_child
  每个dentry都有一个指向其父目录的指针(d_parent),一个子dentry的哈希列表(d_child)。其中,子dentry基本上就是目录中的文件。
  七、怎样从inode值得到目录名?
  函数得到当前文件或目录的inode值后,进入dcache查找对应的dentry,然后顺着父目录指针d_parent得到父目录的dentry,这样逐级向上直到dentry= root,就得到全部目录名称。

vm内核参数之缓存回收vfs_cache_pressure 注:本文分析基于3.10.0-693.el7内核版本,即CentOS 7.4 1、背景 在上篇文章中,我们知道在使用drop_caches接口释放内存时,drop_slab中会调用各个slab管理区的shrink函数释放空闲内存。在实际释放前会先计算可释放的空闲slab缓存数量,这个计算在针对超级块以及mbcache时会受vfs_cache_pressure参数控制。 2、super block shrink 文件系统在初始化时会调用alloc_super分配超级块,此时就会设置超级块的shrink函数,为 阅读详情

相关推荐

技能伤害继承英雄属性【War3地图编辑器】

风暴之锤跟随山丘之王的力量增长

ArYe 2299

Linux性能优化从入门到实战:12 内存篇:Swap 基础

内存资源紧张时,可能导致的结果 (1)OOM 杀死大内存CPU利用率又低的进程(系统内存耗尽的情况下才生效:OOM 触发的时机是基于虚拟内存,即进程在申请内存时,如果申请的虚拟内存加上服务器实际已用的内存之和,比总的物理内存还大,就会触发 OOM); (2)回收内存 1 )回收文件页(File-backed Page)。有两种:   第一种,回收Buffer和Cache。大部分文件页直...

ak18888的博客 588

QoderWake 与 Qoder 工具生态详解

Qoder CLIQoder SDKQoderWake谁在用你(开发者)你的程序你的数字员工谁在跑你的终端会话你的应用进程Daemon 后台进程什么时候跑你启动时你的代码调用时7×24 持续运行怎么触发键盘输入函数调用定时/事件/API/IM有记忆吗会话级 + 文件无多层持久记忆能协作吗Subagent多 Waker + IM 群组核心价值编码效率集成灵活性自主生产力一句话总结。

驽马不舍 949

linux inode cache,使用NFS时出现nfs_inode_cache占用内存过高问题的解决

一、现象运行了使用NFS文件系统的应用程序后,内存缓慢泄漏,最后导致整个服务器的内存全部耗尽,系统调起多个pdflush进程,并占到CPU的99%,这时整个系统系统变得处理速度极慢,那怕是敲个命令都慢得不行;二、检查流程1. 查看系统最耗内存的进程# top -mTasks: 428 total, 1 running, 427 sleeping, 0 stopped, 0 zombie...

weixin_29079643的博客 844

电磁波函数复数表示法:为什么物理学家偏爱e^(ikz)而非cos(kr-wt)?

本文深入解析了电磁波函数复数表示法(如e^(ikz))相较于传统余弦形式的巨大优势。通过欧拉公式,复数形式将复杂的三角运算转化为简洁的指数运算,在微分、积分、线性叠加及处理相位时展现出极高的计算效率,是物理学家和工程师分析波动现象的核心工具。

weixin_29094539的博客 498

sentaurus学习笔记(HFET_pGate_GaN仿真)(五)

`(sdedr:define-constant-profile`和`(sdedr:define-constant-profile-region`命令用于定义并应用一个恒定的活性硼掺杂浓度剖面`"ndop_GaN_gate_const"`到氮化镓栅极层上,其值为`NpGaN_gate`。- `"Oxide"`指定了这一层的材料名称(在这里代表氧化层),而`"nucleation"`是这一层在仿真中的标识名称。- `"GaN"`指定了这一层的材料名称,而`"GaN_gate"`是这一层在仿真中的标识名称。

qq_52640792的博客 940

使用NFS时出现nfs_inode_cache占用内存过高问题的解决

一、现象 运行了使用NFS文件系统的应用程序后,内存缓慢泄漏, 最后导致整个服务器的内存全部耗尽,系统调起多个pdflush进程,并占到CPU的99%, 这时整个系统系统变得处理速度极慢,那怕是敲个命令都慢得不行; 二、检查流程 1. 查看系统最耗内存的进程 # top -m Tasks: 428 total,   1 running, 427 sleeping,   0 sto

北雨南萍 8601

【温室气体数据集】全球总碳柱观测网络 TCCON

【温室气体数据集】全球总碳柱观测网络 TCCON

WW、forever的博客 437

【转】inode缓存与dentry缓存

inode缓存与dentry缓存 ,转载,供学习参考 1. inode缓存 1: struct inode { 2: /* RCU path lookup touches following: */ 3: umode_t i_mode; 4: uid_t i_uid;

wangww631的专栏 2104

智能车图像处理3-入门级分析2 ---直道冲刺

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 4306

Qt Android MySql 数据库驱动编译(详细图解步骤)

第一步.先介绍下环境搭建: Qt 版本 5.12.11 下载链接 https://download.qt.io/archive/qt/5.12/5.12.11/qt-opensource-linux-x64-5.12.11.run Ubuntu 18.04.6 LTS 下载链接 JDK版本 1.8.0_191 下载链接https://www.oracle.com/java/technologies/downloads/ Android Studio版本 ...

h a 6 6 6 c k 为 你解决复杂难题! 3380

linux增加nfs的inode,linux – 异常高的nfs_inode_cache

您遇到任何问题吗?你的RAM使用情况如何? (例如free -m)Linux使用任何可用于缓存的RAM是完全正常的 – 其中一些将通过slabtop(dentries,inode等)显示,其余部分通过free -m’缓存内存(pagecache / swapcache)显示./ proc / sys / vm / vfs_cache_pressure控制内核释放它们的比例.如果默认为“合理”设置,...

weixin_30070339的博客 468

增距镜或中继镜选型

增距镜光路图

camerall 5244

dentry与inode节点之间的关系

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

zhangxinrun的专栏 2280

IMSL CNL 7.0.0 (x86-64)Crack

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

efm32 入门.pdf

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

dentry

dentry与inode、dentry_cache 2009-02-06 12:01:24 分类: LINUX dentry   一、dentry的定义   dentry的中文名称是目录项,是Linux文件系统中某个索引节点(inode)的链接。这个索引节点可以是文件,也可以是目录。   二、dentry的结构:以下是dentry的结构体   struct d

lin111000713的专栏 911

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

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

Linux 文件系统解析(三)cache

内存数据结构 Dentry Cache Inode Cache Page Cache 文件系统驱动中的Cache Cache的设置接口 vm,swappiness cgroup

xyin_kevin的博客 2322

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Linux内核-文件系统之目录项高速缓存(dentry cache)简介

可以看出,shrink_dcache_parent()函数首先通过调用 select_parent()函数来从LRU链表中查找父目录parent的子目录对象,并将这些子dentry对象移到LRU链表的尾部,并返回所找到的子dentry对象的个数(这一步是为调用prune_dcache()函数做准备的);另一方面,由于super_block::s_dentry_lru链表中的目录项对象是未使用的,因此当内存紧张时,应该将其中一些很长时间内未被使用的dentry对象释放掉,以缓解系统的压力。

m0_74282605的博客 982

linux VFS中dentry结构解析

转载自 http://xuxd32.blog.163.com/blog/static/48121933201198101050732/ linux VFS中dentry结构解析   2011-10-08 10:10:50|  分类: ARM学习|举报|字号 订阅 linux VFS中dentry结构解析http://hi.baidu.com/mn

antiquedwr的专栏 687

linux文件系统dentry_Linux中的VFS实现 [二]

Linux中的VFS实现[一] 基础操作内核不能感知一个文件的内容和结构,它只是把文件简单地看做字节的集合,并提供了对其内容的字节流访问。对一个文件的常规操作包括创建、删除和读写等。【打开文件】一个进程想要读取或是写入一个文件,必须先建立和文件inode之间的通道,方式是通过open()函数。int open (const char *pathname, int flags, mode_t mod...

weixin_39540834的博客 252

shrink_slab回收inode/dentry简析

其它地方显示调用d_put()释放dentry时,并不是直接销毁,而是将dentry挂到super_block的lru上(可能是作为缓存使用),只有通过显示调用prune_dcache_sb来回收。最终就会调用上面挂在rcu callback上的释放函数。释放相应文件系统使用到inode时,就会通过调用对应文件系统的destroy_inode函数来释放slab。在执行sb的shrink函数时会调用prune_dcache_sb回收dentry。发现在创建sb的时候会注册shrinker。

zhao651931684的博客 862

dentry的中文名称是目录项,是Linux文件系统中某个索引节点(inode)的链接。这个索引节点可以是文件,也可以是目录

dentry - 目录项的结构 以下是dentry的结构体 struct dentry {      atomic_t d_count; 目录项对象使用计数器      unsigned int d_flags; 目录项标志      struct inode * d_inode; 与文件名关联的索引节点      struct dentry * d_parent; 父目录的目录项对象

lyuncxw 1297

Linux VFS分析(二)

 4.对文件系统的管理 inode的管理:Inode-cache hash表inode_hashtable索引节点缓存 dentry的管理: 我们知道,若干dentry描绘了一个树型的目录结构,这就是用户所看到的目录结构,每个dentry指向一个索引节点(inode)结构然而,这些dentry结构并不是常驻内存的,因为整个目录结构可能会非常大,以致于内存根本装不下。Linux的

qwaszx523的博客 696

Linux文件系统 struct inode 结构体解析

Linux文件系统 struct inode 结构体解析,以及 dentry 和 inode之间的关联简介。

小立仔 5046

Linux内核学习轨迹第六部:目录项缓存dcache与inode缓存(第五节)

哈希键由「父dentry的地址 + 文件名的哈希值」组成,相同父目录下的相同文件名,哈希值相同,会落到同一个哈希桶中。每个dentry都有d_parent指向父目录的dentry,d_subdirs链表存储该目录下的所有子dentry,d_child是子dentry在父目录链表中的节点,形成了完整的目录树结构,支持目录的顺序遍历。inode缓存是内核为struct inode创建的内存缓存系统,核心目标是缓存文件的元数据,避免每次访问文件都要从磁盘读取inode,减少磁盘IO,提升元数据操作的性能。

新时代农民工 369
上一篇: SIGTERM SIGINT
下一篇: Glusterfs Rebalance简析
peter_cloud
博客等级 码龄15年 24粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值