0

0

Linux 内存回收策略解析

冰川箭仙

冰川箭仙

发布时间:2026-01-28 16:55:02

|

302人浏览过

|

来源于php中文网

原创

内存回收由min、low、high三水位线分级触发:low被击穿时kswapd异步回收,min被击穿时进程阻塞并直接回收,持续低于min则触发OOM Killer;真实压力需查/proc/zoneinfo中pages_low与pages_free差值。

linux 内存回收策略解析

内存回收什么时候真正开始?看三个水位线

Linux 不是等内存用光才动手,而是靠 minlowhigh 三条水位线分级响应。它们存于每个内存区(zone)的 watermark[] 数组中,关系固定:min 。

  • low 被击穿 → kswapd 守护进程被唤醒,异步扫描 inactive 链表,悄悄回收页面,不卡应用
  • min 被击穿 → 当前分配内存的进程被阻塞,触发 直接回收(Direct Reclaim),同步清理,延迟明显可感
  • 持续跌破 min 且无法缓解 → 最终触发 OOM Killer,按 oom_score_adj 杀进程保系统

别只盯着 free -h 的 “available”,它只是估算;真实压力信号藏在 /proc/zoneinfo 里——查 pages_low 和当前 pages_free 的差值,才是判断是否已进入回收临界的真实依据。

匿名页 vs 文件页:回收逻辑完全不同

回收不是“一锅端”,内核对两类页区别对待:

  • 文件页(File Pages):比如读取过的 /etc/passwd 缓存在内存里。若未修改(clean),直接丢弃,下次访问再从磁盘读;若已修改(dirty),必须先写回磁盘(经 pdflushwriteback 线程),才能释放
  • 匿名页(Anonymous Pages):进程堆、mmap(MAP_ANONYMOUS) 分配的内存。无磁盘备份,只能写入 swap 分区(或压缩后留在内存,见下条),否则就只能丢弃——但丢弃前得确认它没被写过(PageDirty 为 false)

这意味着:纯计算型服务(如 Java 应用堆大但文件缓存少)更容易触达 swap;而高 IO 服务(如数据库缓存大量脏页)可能卡在回写队列,表现为 wa% 持续偏高,pgpgout 却上不去。

swappiness 是开关,不是油门

vm.swappiness 控制的是「匿名页」和「文件页」在回收时的相对优先级,不是“越小越不 swap”。它的作用点在 LRU 链表扫描阶段:

Designs.ai
Designs.ai

AI设计工具

下载
  • 值为 0:仅在内存极度紧张(min 水位以下)且文件页已基本清空时,才考虑 swap 匿名页
  • 值为 60(默认):匿名页和文件页按比例混合回收,倾向保留更多文件缓存
  • 值为 100:尽可能把匿名页换出,哪怕文件页还很充裕

常见误区:给数据库服务器设 swappiness=1 就能杜绝 swap?错。只要 kswapd 扫到足够多不活跃匿名页,且文件页已回收殆尽,它仍会 swap。真正有效的是配合 vm.vfs_cache_pressure=50(减少 dentry/inode 缓存回收压力)+ 限制进程 memcg 内存上限,把压力挡在 zone 外。

压缩 swap(zswap)不是万能加速器

启用 zswap(需内核开启 CONFIG_ZSWAP)后,内核会把准备 swap 的匿名页先压缩,暂存于内存中的 zpool,只有当压缩池满或页面太久未访问,才真正落盘。

  • 优势:大幅减少磁盘 I/O,尤其对 SSD 寿命友好;对突发性内存峰值响应更快
  • 代价:CPU 压缩/解压开销(实测约增加 2–5% sys CPU);压缩失败的页面仍要走传统 swap 路径
  • 坑点:zswap 默认使用 lzo 算法,压缩率低但快;换成 lz4 可提升压缩率,但需确认内核支持且不引入额外延迟

它解决的是「swap 频繁导致 IO 瓶颈」的问题,不是「内存根本不够」的问题。如果你的 SwapTotal 已接近耗尽,zswap 只是延缓 OOM,而非消除根源。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

396

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

396

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

503

2023.08.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

407

2023.08.14

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

358

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2082

2023.08.14

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8万人学习

Git 教程
Git 教程

共21课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号