Linux 内存分配与回收机制详解
发布时间 - 2026-01-29 00:00:00 点击率:次从 Linux 5.13 开始,vmalloc() 默认尝试使用大页映射,但需满足空闲大页充足、地址对齐及分配大小足够(通常 ≥ 几十 KB)等条件;可通过启用 CONFIG_DEBUG_VM_VALLOC 查看 dmesg 日志或结合 /sys/kernel/debug/page_owner 分析页 order 确认,小内存系统慎用,启动参数 nohugevmalloc 可全局禁用。
vmalloc() 用大页了吗?怎么确认?
从 Linux 5.13 开始,vmalloc() 默认尝试使用大页(huge pages)映射,但不是所有情况都生效——它依赖 zone 的空闲大页数量、对齐要求和分配大小。你不能靠 cat /proc/vmallocinfo 直接看出是否用了大页,因为该接口不暴露页粒度信息。
内核提供了 is_vm_area_hugepages(const void *addr) 这个内联函数来判断,但它依赖未导出的 find_vm_area(),所以**树外模块(比如你自己写的 ko)根本没法调用**。实际调试时,更可行的方式是:在内核配置中启用 CONFIG_DEBUG_VM_VALLOC,然后触发分配后检查 dmesg 是否出现 vmalloc(): using hugepage 类似日志;或者用 /sys/kernel/debug/page_owner 配合 addr 查看对应页的 order(order ≥ 2 通常意味着 4KB → 2MB 映射)。
- 嵌入式小内存系统慎用:大页可能导致内部碎片,比如只申请 16KB 却占掉一个 2MB 大页
- 启动时加
nohugevmalloc参数可全局禁用,比运行时 patch 更可靠 - 注意:即使启用了,
vmalloc(4096)也大概率还是用 4KB 页——大页只对 ≥ 几十 KB 的分配有收益
SLAB 回收为什么有时“卡住”不释放?
SLAB 分配器本身不主动回收 slab 缓存,而是等 kmem_cache_shrink() 被显式调用或由内存压力触发的 shrink_slab() 路径间接执行。常见现象是:你调了 kmem_cache_destroy(),但 /proc/slabinfo 里对应缓存项仍存在,甚至 slabinfo -a 显示 active_objs > 0。
原因通常是对象还在被引用:比如某个 struct 被放在链表里但没删干净,或被 RCU 持有未完成宽限期。SLAB 不会强制回收正在使用的对象,也不会等待 RCU 宽限期自动结束。
- 用
slabinfo -v cache_name查看详细状态,重点关注active_objs和num_objs差值 - RCU 场景下,必须确保所有
synchronize_rcu()或call_rcu()回调已执行完毕 - 驱动模块卸载前,务必先清空所有对象引用,再调
kmem_cache_destroy(),否则可能 oops
OOM 前内存回收到底按什么顺序走?watermark 是怎么起作用的?
不是等 free 内存归零才回收,而是在空闲页低于 watermark[WMARK_LOW] 时就启动快速回收(kswapd),低于 watermark[WMARK_MIN] 则触发直接回收(alloc_pages() 中同步阻塞执行)。三个水位关系固定:min ,且 low = min + min/4,high = min + min/2。
关键点在于:kswapd 只负责把空闲页拉回 high 水位以上;一旦进程分配触发 direct reclaim,说明 low 都守不住了,此时回收路径会更激进(比如扫描更多 LRU 链表、尝试 swap、甚至考虑 OOM)。
- 查看当前水位:
grep -A10 "Node.*DMA\|Node.*Normal" /proc/zoneinfo -
echo 1 > /proc/sys/vm/swappiness并不能阻止 page cache 回收——只要 anon 和 file 页面都在 LRU 上,file 页面永远优先被回收 - 频繁触发 direct reclaim?说明工作负载长期压着 low 水位跑,要么加内存,要么减少 mmap 大量文件或 tmpfs 使用
用户态看到的 “free 内存少”,真缺内存吗?
Linux 把大量空闲内存用于 page cache 和 slab,free 命令显示的 “available” 才是真正可立即分配的预估值(含可回收 cache)。很多运维第一反应是 kill 进程,但往往杀的是正在用 cache 加速 I/O 的进程,反而让磁盘变慢、延迟飙升。
真正要查的是:有没有进程在疯狂分配 anon 内存又不释放(如内存泄漏)、是否 swapin/si 持续升高(说明已在用 swap)、/proc/meminfo 中 Inactive(file) 是否远高于 Active(file)(cache 没被有效利用)。
- 别信 top 里的 %MEM 排序结果——它算的是 RSS,包含共享库和 mmap 共享内存,不代表独占消耗
- 用
ps aux --sort=-vsz | head -10看虚拟内存占用,再结合pmap -x PID看具体段分布 - 如果
Available还剩 1GB 以上,但系统卡顿,大概率是 I/O 或锁竞争问题,不是内存不足
水位计算是 per-zone 的,NUMA 系统里某 node 的 low 水位被击穿,可能只影响该 node 分配,不一定触发全局 OOM;而 slab 回收的时机藏在 shrink_slab() 的调用链深处,不深入到 mm/vmscan.c 很难看清它到底什么时候愿意放手。
# linux
# js
# node
# app
# 虚拟内存
# ai
# 内存占用
# 为什么
# echo
# sort
# const
# void
# 接口
# using
# Struct
# 对象
# 的是
# 水位计
# 链表
# 是在
# 放在
# 都在
# 还在
# 很难
# 什么时候
# 是怎么
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
怎样使用JSON进行数据交换_它有什么限制
Android利用动画实现背景逐渐变暗
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
在centOS 7安装mysql 5.7的详细教程
浅谈Javascript中的Label语句
北京网站制作的公司有哪些,北京白云观官方网站?
微信h5制作网站有哪些,免费微信H5页面制作工具?
如何快速生成ASP一键建站模板并优化安全性?
Laravel怎么上传文件_Laravel图片上传及存储配置
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
音乐网站服务器如何优化API响应速度?
如何生成腾讯云建站专用兑换码?
三星网站视频制作教程下载,三星w23网页如何全屏?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
Linux安全能力提升路径_长期防护思维说明【指导】
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
php json中文编码为null的解决办法
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
制作旅游网站html,怎样注册旅游网站?
制作企业网站建设方案,怎样建设一个公司网站?
javascript中对象的定义、使用以及对象和原型链操作小结
PHP 500报错的快速解决方法
如何在云虚拟主机上快速搭建个人网站?
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
个人摄影网站制作流程,摄影爱好者都去什么网站?
Laravel如何使用Vite进行前端资源打包?(配置示例)
Laravel如何自定义错误页面(404, 500)?(代码示例)
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
Laravel如何为API生成Swagger或OpenAPI文档
如何在VPS电脑上快速搭建网站?
如何登录建站主机?访问步骤全解析
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
Laravel Docker环境搭建教程_Laravel Sail使用指南
如何用景安虚拟主机手机版绑定域名建站?
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
在线教育网站制作平台,山西立德教育官网?
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
如何在建站宝盒中设置产品搜索功能?


