本文约2600字,今天继续来学习内存分析相关的知识。
关注公众号, 即可获得与Linux相关的电子书籍以及常用开发工具,文末有文档清单。
💡 本文基于在我正在维护的产品上面输出的样例讲解:
total used free shared buffersMem: 194576 160808 33768 46192 6552-/+ buffers: 154256 40320Swap: 0 0 0默认单位:KB
free 命令是 Linux 运维、嵌入式开发、实时系统调试中最核心的内存排查工具。绝大多数人仅会看懂基础数值,却不了解指标内核来源、内存分类本质,常出现"空闲内存很低但系统正常""缓存占用高不敢清理""shared 内存泄漏无法释放"等问题。
本文结合内核源码、proc 文件机制、内存分级逻辑,全面解析 free 命令指标含义、底层数据源、核心内核函数、内存泄漏排查、全场景优化方案。
该行是内核原始内存统计,包含所有内存占用,无法直接判断业务内存压力,各字段释义如下:
| total | ||
| used | ||
| free | ||
| shared | ||
| buffers |
这是判断系统内存压力的唯一标准,剥离了可回收的系统缓冲,还原业务真实内存占用:
-/+ buffers: 154256 40320核心逻辑:Linux 会最大化利用空闲内存做 IO 缓冲提升性能,缓冲内存不属于真正占用,可随时回收给业务进程。
样例中 Swap 全为 0,代表系统未配置交换分区。实时 Linux(PREEMPT_RT/Xenomai)强制建议禁用 Swap,磁盘换页会带来毫秒级延迟,彻底破坏系统实时性与确定性。
| Buffers 块缓冲 | |||
| Page Cache 页缓存 | |||
| Shmem 共享内存 |
free 属于 procps 工具集,无硬件读取逻辑,所有数据均来自内核虚拟文件 /proc/meminfo。
执行链路:
free 命令 → 解析 /proc/meminfo 文本 → 通过固定公式计算 → 输出各字段内核通过固定函数实时统计内存状态、生成 meminfo 文件:
meminfo_proc_show() | 核心入口函数/proc/meminfo |
si_meminfo() | |
si_swapinfo() | |
global_page_state() | |
calculate_available_memory() |
# 原始 used原始 used = MemTotal - MemFree# 真实业务已用(-/+ buffers 行的 used)真实业务已用 = 原始 used - Buffers - Cache# 真实可用内存(-/+ buffers 行的 free)真实可用内存 = MemFree + Buffers + Cache - 不可回收 Slab/Shmem普通文件缓存、块缓冲可通过内核接口手动回收,生产仅用于调试排查,不建议频繁执行:
# 先刷写脏数据防止丢数据,再释放对应缓存sync && echo 1 > /proc/sys/vm/drop_caches # 释放页缓存sync && echo 2 > /proc/sys/vm/drop_caches # 释放目录、inode 缓存sync && echo 3 > /proc/sys/vm/drop_caches # 释放全部可回收缓存⚠️ 关键结论:
drop_caches无法释放 Shmem,共享内存、tmpfs 占用需针对性清理。
1. 排查占用
ipcs -m # 查看 System V 共享内存df -h /dev/shm # 查看 POSIX 共享内存占用2. 清理 System V 共享内存(进程崩溃残留泄漏)
# 单个清理ipcrm -m 共享段ID# 批量清理ipcs -m | awk 'NR>3 {print $2}' | xargs -r ipcrm -m3. 清理 /dev/shm 僵尸文件
# 清理 JVM、程序异常退出残留文件find /dev/shm -name "hsperfdata_*" -delete4. 彻底释放
munmap、shm_unlink 释放映射⚠️ RT 实时系统严禁暴力删除 /dev/shm 文件,会引发调度抖动、实时延迟飙升。
-/+ buffers 行的 free 值dmesg 报 OOM-killer| 进程级内存 | tophtop 查看 RSS;ps aux --sort -rss | |
| 内核 Slab 内存 | slabtop | |
| 共享内存 | ipcs/dev/shm 磁盘占用 | |
| 实时系统专项 | mlock 锁定内存、大页占用 |
# 1. 实时系统核心:禁用交换分区,关闭换页vm.swappiness=0# 2. 脏页刷写优化,避免 IO 瞬时夯机vm.dirty_background_ratio=5vm.dirty_ratio=15vm.dirty_expire_centisecs=3000# 3. 缓存回收策略,优先回收文件缓存vm.vfs_cache_pressure=100# 4. 预留空闲内存,缓解内存碎片vm.min_free_kbytes=8192O_DIRECT 绕过页缓存,避免缓存内存暴涨mlockall 锁定内存,禁止换出 | |
/dev/shm 最大容量,防止无上限暴涨 |
free 命令数据全部来源于 /proc/meminfo,由内核内存管理模块统一统计,核心函数为 meminfo_proc_show()
排查内存压力的核心是 -/+ buffers 行指标,切勿通过原始 free、used 数值判断系统状态
普通缓存可自动/手动回收,Shmem 共享内存为特殊内存,需单独清理、重点防控泄漏
通用 Linux 侧重 IO 缓存优化,实时 Linux 核心是禁用 Swap、锁定内存、消除碎片、杜绝抖动,保障系统实时性
往期文章(欢迎订阅技术分享栏目全部文章):

这里是女程序员的笔记本
15年+嵌入式软件工程师兼二胎宝妈
分享读书心得、工作经验,自我成长和生活方式。
希望我的文字能对你有所帮助