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                        
                    
点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部