Linux 回收内存到底怎么计算anon/file回收比例,只是swappiness这么简单?

JVM诊断及工具笔记(3) 使用pmap 定位一次Jvm Native Memory泄漏 native内存泄漏 阅读详情
AI摘要

本文深入探讨Linux内核如何在内存紧张时决定回收匿名页(anon)和文件页(file)的比例。除了熟知的swappiness参数外,内核还考虑了IO成本、refault概率和pageout数量等因素。源码分析揭示了workingset_refault计算逻辑的变化,以更精确地平衡回收成本和性能影响。

概述

Linux内核为了区分冷热内存,将page以链表的形式保存,主要分为5个链表,除去evictable,我们主要关注另外四个链表:active file/inactive file,active anon和inactive anon链表,可以看到这主要分为两类,file和anon page,内存紧张的时候,内核开始从inactive tail定量回收page,那么这里面就有个很重要的选择:inactive file和inactive anon lru链表的回收比例到底怎么确定?稍微了解mm的肯定都知道内核有个回收倾向可以设置:swappiness,值越大代表更多的回收anon内存,相反,更倾向于回收非anon内存,但是内核控制两者回收比例仅仅是swappiness控制这么简单吗?在阅读v6.1内核发现,随着内核的不断发展和优化,两者回收比例不断的迭代,逐步考虑到更多的情况,本文将以v6.1源码,逐步揭开内核对于两种page回收比例控制的神秘面纱。

比例计算的核心源码

ap和fp分别表示 anon和file扫描回收的比重,其计算主要是涉及几个重要的元素:swappiness,file_cost和anon_cost。为了更好的理解这几个控制变量的意义,我们需要从内核回收两种页面的涉及思想上来考虑。

1. 回收file-backed page和anon page的IO成本不同,故引入swappiness。

比如内核在引入zram内存压缩技术之前,回收anon page的成本比较高,因为需要将内存通过IO写入磁盘,而file-backed文件页有可能遇到clean page不需要IO回写,而比如嵌入式往往都存在zram内存压缩技术,anon匿名内存得回收成本可能比file-backed page要低得,因为内存操作性能比IO性能更好,所以swappiness这个控制选项从另外一个角度理解:代表两种类型得IO成本。

swappiness的具体函数参见内核文档:

 翻译:swappiness用于粗略得表示swap或者file-back page回收得IO成本,取值范围是0-200,如果是100代表内核得mm子系统认为内存回收两种page得IO成本是相当得。内核默认将该值设置60,这种情况内核认为swap的IO成本更高,但是对于存在内存swap的(比如zram或者zswap技术),超过100的值是值得考虑的,因为这种情况下swap是内存操作,性能更好,IO成本更低。

 2. 内存回收要考虑refault概率和两种类型page pageout的数量

refault次数:

内核引入workingset算法后,可以精准的评估出来两种page的refault次数;如果refault次数越多,认为file-cost或者anon-cost数值越大(意味者要减少回收比例,否则频繁发生了refault影响性能)。

pageout数量:

内核也要避免某一种类型的page在疯狂的进行回收,尽量做到均衡,内核实现的时候pageout的page数量也作为一种参考变量,如果某一种类型的页面回收的过多也需要进行一定程度的抑制。

源码解析

源码分析部分我们主要关注file-cost和anon-cost数值的计算逻辑,根据上面分析refault次数和pageout次数都会影响cost数值的计算,下面我们从源码实现上验证一下相关逻辑。

refault因素影响:


/**
 * workingset_refault - Evaluate the refault of a previously evicted folio.
 * @folio: The freshly allocated replacement folio.
 * @shadow: Shadow entry of the evicted folio.
 *
 * Calculates and evaluates the refault distance of the previously
 * evicted folio in the context of the node and the memcg whose memory
 * pressure caused the eviction.
 */
void workingset_refault(struct folio *folio, void *shadow)
{
	bool file = folio_is_file_lru(folio);
	struct mem_cgroup *eviction_memcg;
	struct lruvec *eviction_lruvec;
	unsigned long refault_distance;
	unsigned long workingset_size;
	struct pglist_data *pgdat;
	struct mem_cgroup *memcg;
	unsigned long eviction;
	struct lruvec *lruvec;
	unsigned long refault;
	bool workingset;
	int memcgid;
	long nr;

	if (lru_gen_enabled()) {
		lru_gen_refault(folio, shadow);
		return;
	}

	unpack_shadow(shadow, &memcgid, &pgdat, &eviction, &workingset);
	eviction <<= bucket_order;

	rcu_read_lock();
	/*
	 * Look up the memcg associated with the stored ID. It might
	 * have been deleted since the folio's eviction.
	 *
	 * Note that in rare events the ID could have been recycled
	 * for a new cgroup that refaults a shared folio. This is
	 * impossible to tell from the available data. However, this
	 * should be a rare and limited disturbance, and activations
	 * are always speculative anyway. Ultimately, it's the aging
	 * algorithm's job to shake out the minimum access frequency
	 * for the active cache.
	 *
	 * XXX: On !CONFIG_MEMCG, this will always return NULL; it
	 * would be better if the root_mem_cgroup existed in all
	 * configurations instead.
	 */
	eviction_memcg = mem_cgroup_from_id(memcgid);
	if (!mem_cgroup_disabled() && !eviction_memcg)
		goto out;
	eviction_lruvec = mem_cgroup_lruvec(eviction_memcg, pgdat);
	refault = atomic_long_read(&eviction_lruvec->nonresident_age);

	/*
	 * Calculate the refault distance
	 *
	 * The unsigned subtraction here gives an accurate distance
	 * across nonresident_age overflows in most cases. There is a
	 * special case: usually, shadow entries have a short lifetime
	 * and are either refaulted or reclaimed along with the inode
	 * before they get too old.  But it is not impossible for the
	 * nonresident_age to lap a shadow entry in the field, which
	 * can then result in a false small refault distance, leading
	 * to a false activation should this old entry actually
	 * refault again.  However, earlier kernels used to deactivate
	 * unconditionally with *every* reclaim invocation for the
	 * longest time, so the occasional inappropriate activation
	 * leading to pressure on the active list is not a problem.
	 */
	refault_distance = (refault - eviction) & EVICTION_MASK;

	/*
	 * The activation decision for this folio is made at the level
	 * where the eviction occurred, as that is where the LRU order
	 * during folio reclaim is being determined.
	 *
	 * However, the cgroup that will own the folio is the one that
	 * is actually experiencing the refault event.
	 */
	nr = folio_nr_pages(folio);
	memcg = folio_memcg(folio);
	lruvec = mem_cgroup_lruvec(memcg, pgdat);

	mod_lruvec_state(lruvec, WORKINGSET_REFAULT_BASE + file, nr);

	mem_cgroup_flush_stats_delayed();
	/*
	 * Compare the distance to the existing workingset size. We
	 * don't activate pages that couldn't stay resident even if
	 * all the memory was available to the workingset. Whether
	 * workingset competition needs to consider anon or not depends
	 * on having swap.
	 */
	workingset_size = lruvec_page_state(eviction_lruvec, NR_ACTIVE_FILE);
	if (!file) {
		workingset_size += lruvec_page_state(eviction_lruvec,
						     NR_INACTIVE_FILE);
	}
	if (mem_cgroup_get_nr_swap_pages(memcg) > 0) {
		workingset_size += lruvec_page_state(eviction_lruvec,
						     NR_ACTIVE_ANON);
		if (file) {
			workingset_size += lruvec_page_state(eviction_lruvec,
						     NR_INACTIVE_ANON);
		}
	}
	if (refault_distance > workingset_size)
		goto out;

	folio_set_active(folio);
	workingset_age_nonresident(lruvec, nr);
	mod_lruvec_state(lruvec, WORKINGSET_ACTIVATE_BASE + file, nr);

	/* Folio was active prior to eviction */
	if (workingset) {
		folio_set_workingset(folio);
		/* XXX: Move to lru_cache_add() when it supports new vs putback */
		lru_note_cost_folio(folio);
		mod_lruvec_state(lruvec, WORKINGSET_RESTORE_BASE + file, nr);
	}
out:
	rcu_read_unlock();
}

workingset_refault有两个重要的点:

1.workingset_size计算逻辑

内核刚引入workingset算法的时候,workingset_size计算逻辑很简单,只要计算相应类型page的Active page数量就可以了,而v6.1源码的计算逻辑更为复杂,也更为科学,总结起来:workingset size等于:Sum of all LRU size except inactive list of page's type。

anon page:

workingset_size = NR_ACTIVE_FILE + NR_INACTIVE_FILE + NR_ACTIVE_ANON

file-backed page:

workingset_size = NR_ACTIVE_FILE + NR_ACTIVE_ANON + NR_INACTIVE_ANON

内核为什么要修改这个逻辑呢?可以参见如下系列patch:

Re: [PATCH 05/14] mm: workingset: let cache workingset challenge anon - Johannes Weiner

尤其这个系列的patch的05号修改对应workingset_size计算逻辑的优化,核心的思想是说虽然内核将lru链表分割成file和anon,但是计算workingset size的时候要综合起来看这两个部分,不能割裂的看,因为系统回收内存的时候是file和anon综合扫描回收的,具体原因原作者回复的特别清晰:

This is intentional, because there IS a connection: they both take up
space in RAM, and they both cost IO to bring back once reclaimed.

When file is refaulting, it means we need to make more space for
cache. That space can come from stale active file pages. But what if
active cache is all hot, and meanwhile there are cold anon pages that
we could swap out once and then serve everything from RAM?

When file is refaulting, we should find the coldest data that is
taking up RAM and kick it out. It doesn't matter whether it's file or
anon: the goal is to free up RAM with the least amount of IO risk.

Remember that the file/anon split, and the inactive/active split, are
there to optimize reclaim. It doesn't mean that these memory pools are
independent from each other.

The file list is split in two because of use-once cache. The anon and
file lists are split because of different IO patterns, because we may
not have swap etc. But once we are out of use-once cache, have swap
space available, and have corrected for the different cost of IO,
there needs to be a relative order between all pages in the system to
find the optimal candidates to reclaim.

 有个人说file和anon的refault distance计算是按内核的逻辑这两个是没关系,新patch打破了这个固有观念。作者回复了上面一段:

这是有意为之,因为这两个是有联系的:他们都占用RAM内存,回收的时候也都有IO成本。当file发生refault时候,意味者需要给cache更多的生存空间(避免被回收导致refault的空间),这个空间可以来自于老旧的active file pages(也就是说将该cache page放入active file lru链表保护下),但是如果如果active file page都是hot频繁访问的,与此同时,存在cold anon pages可以swap out应该怎么样呢?

当文件发生refault的时候,我们要做的是找到coldest的page然后回收掉,不需要关心这个是file,还是anon page:目标就是以最小的IO成本释放内存而已。

记住:file/anon的区分,inactive/active的区分都是为了方便内存回收,并不意味者这些内存是互相独立无关的。

总结:作者的意思是说,计算workingset size的时候,比如file-backed page来说,不仅仅只考虑本file acitve lru,也要综合考虑anon page的情况,比如作者说的情况,假设active file lru都是hot的,而anon 中存在大量cold page,这个时候os会选择回收anon page的,这对于file page就是一种保护了,作者的patch更新后更激进的将page放入active 进行保护。

对于patch更新后有个人提出了疑问说某种情况会导致发生内存颠簸:

> My suspicion is started by this counter example.
> 
> Environment:
> anon: 500 MB (so hot) / 500 MB (so hot)
> file: 50 MB (hot) / 50 MB (cold)
> 
> Think about the situation that there is periodical access to other file (100 MB)
> with low frequency (refault distance is 500 MB)
> 
> Without your change, this periodical access doesn't make thrashing for cached
> active file page since refault distance of periodical access is larger
> than the size of
> the active file list. However, with your change, it causes thrashing
> on the file list.

上面意思是说由于新的patch综合考虑了file/anon计算working size,那么对于上面的case新的patch引入后(没有更新前不会)低频访问的100M file产生的page就会被加入active file lru链表当中,这样的话可能会导致hot的file被挤到inactive file lru当中,然后导致这50M active hot page cache逐渐被挤到inactive file lru中被系统回收,导致颠簸,而没有引入新patch,由于不满足refault distance > 50M的条件,低频访问的page都不会被放入active file lru,所以没有问题。。。

作者回复:不管是否引入新patch其实都不会引入颠簸(本身这100M低频访问的颠簸是再说难免的),对于那50M hot file不会引起颠簸是因为这些内存是hot的,那意味者page_check_references会将page扔回active file lru的,所以不会被回收引起颠簸,GOOD Reply!!!

2.lru_note_cost_folio逻辑

这个函数就是用来累加不同类型(file/anon)回收的成本,调用时机有如下几种:

//根据pageout对应类型page(anon/file)统计swap-out或者write-page回写数量,这种
//情况就是统计下swap或者writepage的数量,避免过度swapout或者过度writepage,要均衡一下
shrink_inactive_list
    --->lru_note_cost

//如果发现page生命周期范围内是active过的,那么发生缺页的时候就统计一次缺页成本
//内核认为active过的页面(PG_workingset的含义,就是生命周期中有存在active 链表中)被回收
//发生refault才具备参考意义
workingset_refault
    --->lru_note_cost_folio

参考文章

[PATCH 10/14] mm: only count actual rotations as LRU reclaim cost - Johannes Weiner

Linux伪文件系统proc Linux伪文件proc 阅读详情

相关推荐

Linux 内存workingset Refault Distance算法源码及源码解析

内核mm子系统中有一个workingset.c实现了refault distance算法,发现网络逻辑介绍该算法的文章主要是黏贴自奔跑吧内核一书中的内容,军比较雷同,讲述的角度比较难以理解,我第一看到的时候琢磨了2天才明白,本文希望从更容易理解的角度来分析何为refault distance算法,以及内核引入该算法的原因,这就要从内核回收page面临的挑战说起。本文源码:v5.9。

GetnextWindow的专栏 1605

【OS】Linux Process Memory的探究

关于Linux的进程地址这件事....

woodwhale的博客 1277

multi-generation lru系列 - 怎么决定回收anon还是file

Linux 回收内存到底怎么计算anon/file回收比例,只是swappiness这么简单?-优快云博客。

GetnextWindow的专栏 723

Linux内存反向映射

Linux内存反向映射

weixin_48450161的博客 664

一文讲解Linux的内存回收和交换(内含代码)

Linux的swap相关部分代码从2.6早期版本到现在的4.6版本在细节之处已经有不少变化。本文讨论的swap基于Linux 4.4内核代码。Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的处理逻辑。希望本文能让读者了解Linux对swap的使用大概是什么样子。swap到底是干嘛的?swappiness到底是用来调节什么的?什么是内存水位标记?kswapd什么时候会进行swap操作?swap分区的优先级(priority)有啥用?

m0_74282605的博客 942

1.5 页面回收与交换reclaim/swap:内存不够时怎么办

本文探讨了Linux内核在物理内存不足时的页面回收与交换机制。主要内容包括: 回收策略:内核通过LRU算法维护5条链表区分活跃/非活跃的匿名页和文件页,利用硬件Accessed位追踪页面冷热程度,通过反向映射找到所有页面映射关系。 回收过程:采用优先级控制扫描范围,优先回收文件页(根据swappiness参数调整倾向),处理脏页时文件页回写、匿名页写入swap分区,使用swap entry记录换出页面位置。 极端处理:当回收失败时触发OOM Killer终止进程。

图形/计算GPU的驱动与虚拟化技术分享园地 927

Linux的内存回收和交换

前言Linux的swap相关部分代码从2.6早期版本到现在的4.6版本在细节之处已经有不少变化。本文讨论的swap基于Linux4.4内核代码。Linux内存管理是一套...

Peter的专栏 2990

医学影像弹性形变处理

这段代码的主要流程是:读取 DICOM 医学影像,尝试使用 MONAI 进行弹性形变(根据版本适配),如果失败则使用 OpenCV 实现,最后可视化并保存处理结果。这样可以在不同环境下灵活处理医学影像的弹性形变需求。后面会写一篇解释弹性变形方法的短文。

wh_xia_jun的专栏 778

Swap 与 Swappiness

Swap 与 Swappiness 原创聂子腾网易游戏运维平台2019-07-20 聂子腾 网易游戏私有云平台萌新运维工程师。 起 开机!~ 各种服务启动!~ 各种进程骑上了心爱的系统小摩托,并希望它永远不会堵车。随着系统的运转,越来越多的程序进行使用内存,Linux 使用内存的原则是尽量使用,尽力满足,使得最大限度的使『热』资源存活在内存中,系统就可能面临内存告...

Fish 1178

细聊Oracle通过ODBC数据源连接SQL Server数据库

    类似文章搜索引擎上有很多,内容大致相同,今天所谓细聊是因为我在借鉴这些文章时候走了些弯路,所以写此文,为自己备忘,同时如果能为初涉此处知识点的小伙伴提供些帮助就更好了,废话不多说。    我的应用场景:    项目系统使用oracle数据库,与客户的第三方系统供应商实现资源共享,对方为sql server数据库;    我的测试开发环境为64bitwin7PC机,本机上装有64位Oracl...

xueren_83的博客 1万+

基于LightGBM和多模型融合的量化交易研究:沪深300为例【附代码】

📊 数据科学与大数据专业 | 数据分析与模型构建 | 数据驱动决策✨ 专业领域:数据挖掘与清洗大数据处理与存储技术机器学习与深度学习模型数据可视化与报告生成分布式计算与云计算数据安全与隐私保护💡 擅长工具:Python/R/Matlab 数据分析与建模Hadoop/Spark 大数据处理平台SQL数据库管理与优化Tableau/Power BI 数据可视化工具TensorFlow/PyTorch 深度学习框架✅数据科学与大数据技术毕业论文【数据】

lagougongzuoshi的博客 1669

linux内存回收500M,回收和交换Linux的内存回收和交换

原标题:回收和交换Linux的内存回收和交换作者 | zorro来自 | http://liwei.life/微信公众号:Linux系统技术 前言Linux的swap相关部分代码从2.6早期版本到现在的4.6版本在细节之处已经有不少变化。本文讨论的swap基于Linux 4.4内核代码。Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的处理逻辑。希望本文能让读者了解Linux对...

weixin_36371053的博客 212

设备接入与APP(应用程序)接入华为云iotDA平台的详细操作步骤及获取方式

设备及APP(应用程序) 登录 IoTDA 平台所需的 入场与操作清单内容,提供逐项详细操作步骤和获取方式,并穿插贴士便于理解与实际操作落地。内容基于 华为云 IoTDA 控制台 和 IAM 控制台 的实际使用路径整理。

hy行者勇哥的博客 3058

linux+swap分区规则_Linux的内存回收和交换

前言Linux的swap相关部分代码从2.6早期版本到现在的4.6版本在细节之处已经有不少变化。本文讨论的swap基于Linux 4.4内核代码。Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的处理逻辑。希望本文能让读者了解Linux对swap的使用大概是什么样子。阅读完本文,应该可以帮你解决以下问题:swap到底是干嘛的?swappiness到底是用来调节什么的?什么是内存水...

weixin_29099217的博客 535

eNSP常见故障处理

eNSP无法启动设备一直停在#井号的问题的解决方案?

lvshiliang123的博客 2万+

LLC 谐振变换器开发设计1

本文档详细介绍了基于DSP28335的LLC谐振变换器开发设计。系统采用频率调制(FM)控制方式,实现高效率、高功率密度的隔离型DC/DC变换。文档阐述了LLC拓扑结构和工作原理,给出了谐振频率、品质因数等关键参数的计算公式。硬件设计包括功率器件选型和采样电路实现,软件部分提供了DSP28335的核心控制算法和代码示例,涵盖频率转换、PI控制和PWM生成。系统还设计了启动策略和保护机制,确保可靠运行。该设计实现了主开关零电压开通和低纹波输出特性。

329

Linux mem 2.5 Buddy 内存回收机制

文章目录1. 简介2. LRU 组织2.1 LRU 链表2.2 LRU Cache2.3 LRU 移动操作2.3.1 page 加入 LRU2.3.2 其他 LRU 移动操作3. LRU 回收3.1 LRU 更新3.2 Swappiness3.3 反向映射3.4 代码实现3.4.1 struct scan_control3.4.2 shrink_node()3.4.3 shrink_list()3.4.4 shrink_active_list()3.4.5 shrink_inactive_list()3.4

pwl999的博客 1450

Coze实战:解锁多Bot协同与条件分支工作流的奥秘

本文详细介绍了在字节跳动Coze平台实现多Bot协同与条件分支工作流的方法。首先阐述了Coze平台的功能优势,包括丰富的插件、知识库和工作流功能。随后分步骤讲解了多Bot协同的实现:从准备工作、创建Bot到协同配置,并提供了电商客服的实例演示。在条件分支工作流部分,详细说明了条件节点的作用类型、条件设定方法以及具体配置操作,强调测试优化的重要性。最后通过电商平台综合案例,展示了多Bot协同与条件分支的实际应用效果,并针对常见问题提供解决方案。文章为开发者在Coze平台上构建智能应用提供了实用指导,有助于提升

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 449

linux 的swap、swappiness及kswapd原理【转+自己理解】

我们一般所说的swap,指的是一个交换分区或文件。从功能上讲,交换分区主要是在内存不够用的时候,将部分内存上的数据交换到swap空间上,以便让系统不会因内存不够用而导致oom或者更致命的情况出现。所以,当内存使用存在压力,开始触发内存回收的行为时,就可能会使用swap空间。内核对swap的使用实际上是跟内存回收行为紧密结合的。为什么要进行内存回收?哪些内存可能会被回收呢?回收的过程中什么时候会进行交换呢?具体怎么交换?下面我们就从这些问题出发,一个一个进行分析。为什么要进行内存回收?

kwdecsdn的博客 1088

芒果YOLOv12改进90:检测头篇之ShareSepHead:即插即用|原创新颖共享Sep检测头,更省参数量,更高效,打造新型YOLOv8检测器,精度高效涨点

芒果YOLOv12改进90:检测头篇之ShareSepHead:即插即用|原创新颖共享Sep检测头,更省参数量,更高效,打造新型YOLOv8检测器,精度高效涨点

包括YOLOv5、YOLOv7、YOLOv8等模型改进 343

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

linux 清空文件_Linux的内存回收和交换

前言Linux的swap相关部分代码从2.6早期版本到现在的4.6版本在细节之处已经有不少变化。本文讨论的swap基于Linux4.4内核代码。Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的处理逻辑。希望本文能让读者了解Linux对swap的使用大概是什么样子。阅读完本文,应该可以帮你解决以下问题:swap到底是干嘛的?swappiness到底是用来调节什么的?什...

weixin_39878646的博客 208

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

linux file-nr 内核参数,开源技术分享:Linux 内核参数 swappiness细解

原标题:开源技术分享:Linux 内核参数 swappiness细解本篇文章主要是就swappiness的一个源码上的解析(基于kernel版本 v4.14-13151-g5a787756b809),仅为个人见解,有不足欢迎相互交流。关于Swap和swappinessSwap(交换分区)是操作系统就内存不足的一个缓解。当内存紧张时候,会适当的根据一些配置值和当前的统计值进行一次判断,会把一些ano...

weixin_29752563的博客 281

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

efm32 入门.pdf

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

linux进程链表,Linux学习-内存管理篇(六)-内存回收(lru链表)

一、页面回收触发方式Linux中页面回收主要是通过两种方式触发的:由“内存严重不足”事件触发的。由后台进程 kswapd触发的,该进程周期性地运行,一旦检测到当系统空闲内存小于阈值,就会触发页面回收操作。二、哪些页框可以回收属于内核的大部分页框是不能够进行回收的,比如内核栈、内核代码段、内核数据段以及大部分内核使用的页框。进程使用的页框可以进行回收的,比如进程代码段、进程数据段、进程堆栈、进程访问...

weixin_30852391的博客 520

Linux 页回收机制深度剖析: 从设计哲学到实战调试

惰性策略: 不是预防性回收, 而是响应式回收分层回收: 从易到难 (文件页→匿名页)频率胜于近期: 访问频率比最近访问时间更重要工作集保护: 通过refault检测保护常用页面平衡艺术: 在回收开销和内存利用率间平衡Linux页回收机制是一个渐进式完善的典范. 从最初的简单LRU, 到引入双链表策略, 再到工作集检测和内存压缩, 每一步演进都解决了实际部署中的痛点. 它不是完美的——没有一种算法能适应所有负载, 但它的可调节性和透明性使得管理员能够针对特定工作负载进行优化。

X 1131

从匿名页回收到文件页缓存:Linux内存回收机制全流程拆解(附性能对比数据)

本文深入拆解了Linux内核内存回收机制的全流程,重点剖析了从匿名页到文件页缓存的回收决策与执行路径。通过分析`shrink_node`等核心函数,结合`swappiness`参数调优、容器cgroup环境下的特殊处理以及实际性能对比数据,为运维和SRE团队提供了系统性的内存问题排查与调优方案。

e6f7g8h9i的博客 200

vm内核参数之swap分区使用控制swappiness

注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.2

Blue summer的博客 1645
上一篇: LWN:多代LRU方案的未来!
下一篇: multi-generation lru系列 - 怎么决定回收anon还是file
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值