slab cache、虚拟内存和交换分区是Linux内存管理中职责分明又协同工作的三大机制:slab cache优化内核对象分配,虚拟内存提供进程统一地址空间,swap作为内存压力下的匿名页溢出兜底策略。

Linux内存管理中,slab cache、虚拟内存和交换分区是三个相互关联但职责分明的机制。理解它们各自的作用与协作方式,能帮你更准确地诊断内存问题、优化系统性能,而不是简单地“加大swap”或“关闭kswapd”。
slab cache:内核对象的高效复用池
slab cache不是为用户进程服务的,而是内核用来快速分配和回收固定大小的小型对象(比如inode、task_struct、dentry等)的内存管理机制。它避免了频繁调用页分配器(buddy system)的开销,提升内核路径效率。
关键点:
- slab分为slab(经典)、slob(嵌入式小内存)、slub(当前主流,默认启用),可通过cat /proc/slabinfo查看活跃缓存
- 每个slab cache有自己的一组状态:active_objs(已使用对象数)、num_objs(总对象数)、pages_per_slab(每slab占多少页)
- 不直接消耗“可用内存”,但会占用内核可回收内存;压力下可通过echo 2 > /proc/sys/vm/drop_caches尝试释放部分slab(仅限可回收缓存,如dentry/inode)
虚拟内存:进程视角的统一地址空间
每个进程看到的都是从0开始的4GB(32位)或128TB+(64位)线性地址空间,这背后由MMU(内存管理单元)和页表实现映射。虚拟内存让进程无需关心物理内存布局,也支撑了写时复制(COW)、内存映射(mmap)、共享库等关键特性。
需要注意:
- RSS(Resident Set Size)反映进程实际占用的物理内存页,但包含共享页(如libc),不能简单累加判断总内存占用
- VSZ(Virtual Memory Size)是进程虚拟地址空间总大小,含未分配、mmap映射但未访问的区域,不代表真实内存消耗
- 缺页异常(page fault)分两种:次缺页(加载文件页或匿名页到内存)和主缺页(需I/O,如从swap或磁盘读取),后者显著影响性能
交换分区(swap):内存压力下的“溢出区”,不是备份盘
swap不是用来“延长内存寿命”的,它的核心作用是在物理内存紧张时,将部分匿名页(如堆、栈、私有匿名映射)换出,腾出页面供更活跃的内存需求使用。它不交换文件页(这些可直接丢弃后重读)。
实用建议:
- 启用swap仍有价值:即使内存充足,它能让内核更激进地使用空闲内存做page cache,同时保留回退能力;现代内核(5.0+)支持zram(压缩内存swap)或zswap(压缩后暂存于RAM),比传统disk swap延迟低得多
- swappiness(0–100)控制内核倾向:值高→更早换出匿名页;值低(如10)→优先回收page cache;设为0不等于禁用swap(仅在OOM前才用),完全禁用需swapoff -a并移除/etc/fstab中的swap条目
- 监控重点看si/so(swap in/out KB/s)和pgpgin/pgpgout(页输入/输出总量),持续非零说明内存长期不足,应查根本原因而非调swap参数
slab cache优化的是内核内部效率,虚拟内存定义了进程的内存视图,swap则是内存资源调度的兜底策略。三者协同工作,但误把slab当“内存泄漏”、把VSZ当“吃内存”、把swap当成“必须关闭的性能毒药”,都是常见误区。








