Linux的内存管理机制是一个复杂而高效的体系,涉及物理内存分配、虚拟地址转换、缓存优化等多个层面。以下从核心机制、关键技术和优化策略三个方面进行详细解析:
虚拟内存(Virtual Memory)
mmap()
或malloc()
申请内存时,仅分配虚拟地址,实际物理内存在首次访问时通过缺页异常(Page Fault)分配。fork()
创建子进程时共享父进程内存页,仅当写入时才复制新页,减少开销。分页管理(Paging)
交换空间(Swap)
/proc/sys/vm/swappiness
):控制换出倾向(0-100),值越高越积极使用swap。伙伴系统(Buddy System)
Slab分配器
task_struct
)预分配内存池,减少重复初始化和碎片。SLAB
:传统实现,缓存对齐优化。SLUB
(默认):简化设计,调试友好。SLOB
:嵌入式场景专用,极简但碎片多。内存回收
active_list
/inactive_list
)。/proc/sys/vm/min_free_kbytes
定义。透明大页(THP)
/sys/kernel/mm/transparent_hugepage/enabled
调整)。OOM Killer机制
oom_score
,优先终止高分进程。/proc/<pid>/oom_adj
调整特定进程的OOM优先级。内存压缩(zswap/z3fold)
CONFIG_ZSWAP
)。NUMA优化
numactl
工具可绑定进程到特定NUMA节点。/proc/sys/vm/zone_reclaim_mode
控制跨节点内存分配。CGroup限制
memory.limit_in_bytes
限制容器/进程组内存使用,触发OOM时仅影响组内进程。free -h
:查看总内存/swap使用(注意available
字段含可回收缓存)。vmstat 1
:监控系统级内存压力(si/so
反映swap交换频率)。smem -s swap
:按进程统计实际内存占用(PSS/USS)。cat /proc/meminfo
:获取详细内存统计(如Slab
/PageTables
占用)。perf mem
:分析内存访问模式。numastat
:NUMA节点内存分布统计。valgrind --tool=memcheck
或内核kmemleak
检测。swappiness
或增加物理内存。echo 1 > /proc/sys/vm/drop_caches
释放可回收Slab(类型2)。Linux通过这套机制实现了高效的内存利用率与性能平衡,理解其原理对系统调优和故障排查至关重要。