drop cache原理分析

这篇具有很好参考价值的文章主要介绍了drop cache原理分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

drop_caches_sysctl_handler 函数

drop cache原理分析,linux
通过 echo 到文件/proc/sys/vm/drop_cache的处理函数为drop_caches_sysctl_handler,其中echo 1 > /proc/sys/vm/drop_cache为释放page 页cache,echo 2 > /proc/sys/vm/drop_cache为释放slab cache, echo 3 > /proc/sys/vm/drop_cache为释放page 页cache和slab cache。

释放slab

echo 2 > /proc/sys/vm/drop_cache为释放slab cache其主要处理函数为drop_slab->drop_slab_node
drop cache原理分析,linux
首先通过mem_cgroup_iter用于遍历内存控制组(memory cgroup,简称memcg)其中第一个参数root:层次结构的根节点,即遍历的起始点。第二个参数prev:上一次调用返回的内存控制组,如果是第一次调用则为NULL。第三个参数reclaim:用于共享回收遍历的cookie,如果是完整的遍历则为NULL。再通过内层do-while循环遍历所有的cgroup,其中freed为每次释放的slab对象数量,当释放的数量小于10时表示当前已没有更多的可释放的slab cache,即退出最外层while循环。
drop cache原理分析,linux
以struct super_block为例,其中包括目录项dentry cache和 inode cache 和其他cache
drop cache原理分析,linux
drop cache原理分析,linux
drop cache原理分析,linux
其中在sget_userns函数中通过register_shrinker_prepared注册了&s->s_shrink。

do_shrink_slab释放slab

drop cache原理分析,linux
drop cache原理分析,linux
do_shrink_slab函数中会调用ret = shrinker->scan_objects(shrinker, shrinkctl);进行slab cache的释放,其中ret返回值即代表释放的slab数量。
以struct super_block中的目录项dentry释放为例
drop cache原理分析,linux
drop cache原理分析,linux
drop cache原理分析,linux
drop cache原理分析,linux

其中sb->s_dentry_lru保存所有可释放slab的目录项dentry cache。通过list_lru_shrink_walk函数释放mem_cgroup对应的目录项cache。并将所有需要释放的目录项加入到dispose链表中,并调用shrink_dentry_list函数进行进行释放。
其函数原理为:
(1)使用一个 while 循环来遍历传入的 list 列表,直到列表为空。
从列表的尾部(list->prev)获取一个目录项(dentry)。这是因为 LRU(Least Recently Used)缓存策略通常从尾部开始删除最不常用的项。
(2)使用 spin_lock 对 dentry 进行加锁,以确保线程安全地访问 dentry。
(3)使用 rcu_read_lock 读取 RCU(Read-Copy Update)锁,RCU 是一种用于实现无锁读操作的机制。
(4)调用 shrink_lock_dentry 尝试锁定 dentry。如果无法锁定,说明有其他线程正在使用它,那么跳过当前循环,处理下一个目录项。
(5)如果 shrink_lock_dentry 返回失败,则从 LRU 列表中删除这个 dentry,并检查其引用计数 d_lockref.count 是否小于 0。
(6)如果引用计数小于 0,并且 d_flags 中有 DCACHE_MAY_FREE 标志,那么可以安全地释放这个 dentry,调用 dentry_free 来完成释放。
(7)如果成功锁定了 dentry,首先从 LRU 列表中删除它,然后调用 __dentry_kill 来标记这个 dentry 为已删除状态。
(8)获取当前 dentry 的父目录项 parent。如果父目录项和当前目录项相同(例如,对于根目录),则跳过后续处理。
(9)如果父目录项不是自己且父目录项的引用计数小于等于1(即表示没有其他更多的地方用到该目录项)。

这个函数的目的是在不影响正在使用的目录项的情况下,清理那些不再需要的目录项,以释放内存。它使用了一种递归的方式,不仅删除当前的目录项,还删除它的所有祖先目录项,这样可以减少由于层次结构而产生的碎片。通过这种方式,它有助于优化 dentry 缓存的性能和内存使用。
需要注意的是在__dentry_kill函数中会通过dentry_unlist函数调整当前目录d_child和父目录d_subdirs的链表关系,并调用dentry_free最终释放cache内存。

drop_pagecache_sb释放page cache

drop cache原理分析,linux
drop cache原理分析,linux
drop cache原理分析,linux
drop_pagecache_sb函数调用invalidate_mapping_pages函数对该超级块中所有inode节点i_mapping地址空间的所有未锁定的page 页调用invalidate_inode_page函数。
drop cache原理分析,linux
其中invalidate_inode_page函数检查脏页和正在回写磁盘页和映射页,都不满足时调用invalidate_complete_page函数进行实际的page cache释放。
drop cache原理分析,linux
其中page_mapped函数为判断page->_mapcount映射引用计数。
drop cache原理分析,linux
在alloc_set_pte函数中对虚拟地址映射的page 页设置page->_mapcount映射引用计数。

__alloc_pages_slowpath函数

drop cache原理分析,linux
drop cache原理分析,linux
在__alloc_pages_slowpath慢速申请page页函数中,会先后调用__alloc_pages_direct_reclaim和__alloc_pages_direct_compact函数进行内存页分配。

drop cache原理分析,linux
__alloc_pages_direct_reclaim函数中首先通过__perform_reclaim函数尝试回收一些内存,然后再调用get_page_from_freelist再次申请内存页。

drop cache原理分析,linux
__alloc_pages_direct_compact函数通过try_to_compact_pages函数尝试进行内存规整将内存页碎片整理为完成的内存片,其中可通过echo 1 > /proc/sys/vm/compact_memory主动触发内存规整。再通过get_page_from_freelist函数重新申请内存页。

总结

1.drop slab cache会遍历所有所有注册到shrinker_list的链表并调用其回调函数scan_objects释放slab cache。
2.drop page cache 会释放所有struct super_block下的所有inode节点地址空间inode->i_mapping的所有非锁定非脏页非回写页非映射页进行page cache释放。
3.通过/proc/sys/vm/drop_caches 写入特定的值时释放cache缓存。写入值1表示释放page页cache。写入值2表示释放目录项和 inode 缓存等其他slab cache。写入值3表示上述两种cache都进行释放。文章来源地址https://www.toymoban.com/news/detail-846219.html

到了这里,关于drop cache原理分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RC4Drop算法的工作原理揭秘:加密技术的进步之路

    RC4Drop算法是RC4算法的一种改进版本,旨在解决RC4算法在长时间加密过程中可能出现的密钥流偏置问题。RC4算法由Ron Rivest于1987年设计,是一种流密码算法,而RC4Drop算法则在此基础上加入了丢弃密钥字节的步骤,以增强安全性和随机性。 RC4Drop加密解密 | 一个覆盖广泛主题工具

    2024年03月12日
    浏览(54)
  • python装饰器原理 | 常用装饰器使用(@cache, @lru_cache)

    🚀 关于python的装饰器原理介绍可看这里,讲的挺简洁易懂:python装饰器原理 ⭐ 弄懂装饰器原理后,来学学常用装饰器。 也就是一种装饰在被执行的函数上,将其执行的结果缓存起来,当下次请求的时候,如果请求该函数的传参未变则直接返回缓存起来的结果而不再执行函

    2023年04月25日
    浏览(56)
  • 计算机组成原理(4)-----Cache的原理及相关知识点

    目录 1.Cache的原理 2.Cache的性能 3.Cache和主存的映射方式  (1)全相联映射 (2)直接映射 (3)组相联映射 4.替换算法 (1)随机算法(RAND) (2)先进先出算法(FIFO) (3)近期最少使用(LRU) (4)最近不经常使用(LFU) 5.Cache写策略 (1)写命中 •写回法 •全写法 (2)写不命中 •写分配法 •非写分

    2024年02月21日
    浏览(60)
  • 【计算机组成原理】高速缓冲存储器 Cache 的三种映射方式(Cache Mapping)

    缓存是计算机系统中常见的一种高速存储器,用于临时存储常用数据,以便快速访问。在缓存中,有三种常见的映射方式,分别是直接映射、全相联映射和组相联映射。 在直接映射中,每个主存块只能映射到缓存中的一个特定位置。该位置是通过对主存块的某个地址的一部分

    2024年01月19日
    浏览(50)
  • 《Linux内核源码分析》(2)进程原理及系统调用

    操作系统的作用 :作为硬件的使用层,提供使用硬件资源的能力, 进程的作用 :作为操作系统使用层,提供使用操作系统抽象出的资源层的能力 进程、线程和程序的区别 :进程指计算机中已运行的程序。进程本身不是基本的运行单位,而是线程的容器。 程序本身只是指令

    2024年02月07日
    浏览(49)
  • 【计算机组成原理·笔记】Cache主存映射和辅存

    主存中的任意一个块,对映指定的一个 cache块,但 一个 cache块 可以对映多个主存块,在 cache的标记中,有标记标识当前 cache块对应着哪些主存区块。 利用率较低,可能会冲突 主存任意的一块,可以被放入 cache中的任意的一个块中。 利用率高 查询速度慢,查询某主存块是否

    2024年02月08日
    浏览(46)
  • Linux内核分析(五)--IO机制原理与系统总线

    一、引言 二、I/O设备 ------2.1、块设备 ------2.2、字符设备 ------2.3、设备控制器 ------------2.3.1、I/O寻址 ------------2.3.2、内存映射 I/O 三、系统总线 ------3.1、数据总线 ------3.2、地址总线 ------3.3、控制总线 ------3.4、单总线结构 ------3.5、多总线结构 ------3.6、添加cache的三总线结构

    2024年02月05日
    浏览(50)
  • Spark原理之Cache Table的工作原理及实现自动缓存重复表的思考

    使用此语法,可以由用户自定义要缓存的结果集,实际上就是一个临时表,不过数据存储在Spark集群内部,由Application所分配的executors管理。 一旦定义了一个 缓存表 ,就可以在SQL脚本中随处引用这个表名,提高数据检索速度,同时也会资源不必要的资源开销。 用户可以通过

    2024年04月27日
    浏览(39)
  • [算法与数据结构]:LRU Cache 的原理与C++实现

    ​ LRU全称是Least Recently Used,即 最近最久未使用,是一种简单的缓存策略。顾名思义,LRU 算法会选出最近最少使用的数据进行淘汰。 ​ 那么什么是缓存(Cache)呢?缓存是一种提高数据读取性能的技术,可以有效解决存储器性能和容量的矛盾,是一种空间换时间的设计思想,比

    2024年01月20日
    浏览(46)
  • 实验4 Cache性能分析【计算机系统结构】

    2023-6-16 21:19:13 以下内容源自《【计算机系统结构】》 仅供学习交流使用 实验3 Tomasulo算法【计算机系统结构】 (1)加深对Cache的基本概念、基本组织结构以及基本工作原理的理解。 (2)掌握Cache容量、相联度、块大小对Cache性能的影响。 (3)掌握降低Cache不命中率的各种方法。 采用

    2024年02月09日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包