Linux内核内存管理深度实战:从页表机制到OOM Killer全链路解析
内存管理是Linux内核最复杂的子系统之一,掌握其原理与实战调优,是资深系统工程师和后端开发者的必备技能。本文从x86-64四级页表出发,深入Buddy System、Slab分配器、LRU页面回收、OOM Killer的完整链路,并给出生产环境实战调优方案。
一、虚拟内存与多级页表
1.1 为什么需要虚拟内存
虚拟内存提供了三个核心价值:进程地址空间隔离(每个进程拥有独立的48位虚拟地址空间)、内存超量使用(通过页面交换扩展可用内存)、内存映射文件(mmap实现文件IO加速)。Linux内核将虚拟地址空间划分为用户空间(0x0000_0000_0000_0000 ~ 0x0000_7FFF_FFFF_FFFF,约128TB)和内核空间(0xFFFF_8000_0000_0000 ~ 0xFFFF_FFFF_FFFF_FFFF)。
1.2 x86-64四级页表结构
在x86-64架构中,Linux采用四级页表将48位虚拟地址(256TB)转换为物理地址:
- PML4 (Page Map Level 4):第39-47位,512条目,每个条目覆盖512GB
- PDPT (Page Directory Pointer Table):第30-38位,512条目,每个条目覆盖1GB
- PD (Page Directory):第21-29位,512条目,每个条目覆盖2MB
- PT (Page Table):第12-20位,512条目,每个条目覆盖4KB
物理页内偏移使用低12位(4KB页)。CR3寄存器存储PML4表的物理地址。每次地址转换需要4次内存访问,这就是TLB(Translation Lookaside Buffer)缓存的意义所在。
1.3 TLB与HugePages
TLB是MMU中的硬件缓存,缓存近期的虚拟页到物理页框的映射。L1 TLB通常有64条目(4KB页)或32条目(2MB/1GB页),L2 TLB有512-1536条目。
HugePages(大页) 通过增大页尺寸减少TLB未命中:
- 2MB HugePages:跳过PT层,PD条目直接指向2MB物理页
- 1GB HugePages:跳过PD层,PDPT条目直接指向1GB物理页
- TLB覆盖范围从4KB × 64 = 256KB提升到2MB × 64 = 128MB
对于数据库和DPDK等内存密集型应用,HugePages可将TLB未命中率降低至接近零。配置方式:
# 静态分配2MB HugePages(40个,共80MB)
echo 40

发表评论 取消回复