当前位置:首页>Linux>Linux Memory 优化: (1) 架构与常见专业术语

Linux Memory 优化: (1) 架构与常见专业术语

  • 2026-10-11 06:12:27
Linux Memory 优化: (1) 架构与常见专业术语

Linux Memory 架构与常见专业术语

Linux 内存管理(Linux Memory Management)是 Linux Kernel 中最复杂、也是最核心的子系统之一。它不仅负责物理内存(Physical Memory)的管理,还负责虚拟内存(Virtual Memory)、页缓存(Page Cache)、NUMA、内存回收(Reclaim)、交换(Swap)、Huge Page、OOM 等众多功能。

理解 Linux Memory 的整体架构,对于性能优化、内核开发、数据库、Kubernetes、云计算以及面试都有非常大的帮助。

Linux Memory 总体架构

Linux 内存管理可以分为几个主要层次:

Linux Memory 并不是一个单独模块,而是多个子系统协同工作的结果。

一、Virtual Memory(虚拟内存)

现代 Linux 使用虚拟地址(Virtual Address)而不是物理地址。

每个进程都拥有独立的地址空间:

0x0000000000000000

├── Code

├── Data

├── Heap

├── mmap()

├── Shared Library

├── Stack

0xFFFFFFFFFFFFFFFF

CPU 访问的是虚拟地址(VA),MMU(Memory Management Unit)通过页表(Page Table)将其转换为物理地址(PA)。

因此,经常会看到几个术语:

●Virtual Address(VA)

●Physical Address(PA)

●MMU

●Page Table

●Address Translation

二、Page(页)

Linux Memory 的最小管理单位是 Page。

通常:

x86

Page Size = 4 KB 

当然也支持:

●Huge Page(2MB)

●Giant Page(1GB)

内核中的每个物理页都会对应一个:

struct page

因此经常看到:

struct page

几乎所有 Memory 子系统都会围绕它展开。

三、Page Frame

Page Frame 指的是物理内存中的一个页。

例如:

RAM 

+-------+

|Page 0 |

+-------+

|Page 1 |

+-------+

|Page 2 |

+-------+

Linux 实际管理的是 Page Frame,而不是字节。

四、Zone(内存区域)

物理内存继续划分成多个 Zone。

典型 x86_64:

Node 0

+-----------------------+

| DMA|

+-----------------------+

| DMA32|

+-----------------------+

| Normal|

+-----------------------+

| Movable|

+-----------------------+

原因:

不同设备访问内存能力不同。

例如:

DMA 设备只能访问低地址。

因此 Linux 使用:

ZONE_DMA

ZONE_DMA32

ZONE_NORMAL

ZONE_MOVABLE

五、NUMA(Non-Uniform Memory Access)

服务器通常不是只有一个 CPU。

例如:

CPU0 ------ Memory0 

CPU1 ------ Memory1

访问本地 Memory:

Fast

访问远程 Memory:

Slow

因此 Linux 引入:

NUMA Node

术语包括:

●NUMA Node

●Local Memory

●Remote Memory

●NUMA Balancing

六、Buddy Allocator(伙伴算法)

Linux 使用 Buddy System 管理物理内存。

它负责:

●分配 Page

●回收 Page

●合并连续 Page

例如:

1024 Pages 

↓

512 + 512

↓

256 +256

优点:

●分配快

●合并快

缺点:

●External Fragmentation(外部碎片)

七、Slab Allocator

Buddy 只能分配 Page。

如果申请:

128 Bytes 

直接分配 4KB Page 太浪费。

于是 Linux 引入:

SLAB

SLUB

SLOB(已基本淘汰)

负责:

kmalloc()

↓

Cache

↓

Object

典型对象:

●task_struct

●inode

●dentry

●file

因此:

Buddy 管理 Page

Slab 管理 Kernel Object

八、Page Cache

文件读写不会直接访问磁盘。

而是:

Disk 

↓

Page Cache

↓

Application

因此:

read()

↓

Page Cache

↓

Disk(Miss)

好处:

●减少磁盘 IO

●加速读取

Page Cache 是 Linux 性能优化中最重要的模块之一。

九、LRU(Least Recently Used)

内存满了怎么办?

Linux 会选择一些页回收。

经典算法:

LRU

现代 Kernel 使用:

Active List

Inactive List

负责:

●判断冷热页

●回收冷页

十、Swap

如果 RAM 不够:

RAM

↓

Swap Disk

页面可以:

Swap Out

以后再:

Swap In

优点:

避免 OOM。

缺点:

性能下降明显。

十一、OOM(Out Of Memory)

当:

Memory Exhausted

Linux 会启动:

OOM Killer

根据:

oom_score

选择最合适的进程结束。

相关术语:

●OOM Killer

●oom_score

●oom_score_adj

十二、Memory Reclaim(内存回收)

Linux 有两种主要回收方式:

kswapd

后台线程:

Memory Low 

↓

kswapd

↓

Reclai

Direct Reclaim

申请内存失败:

alloc_pages()

↓

Direct Reclaim

通常性能更差。

十三、Memory Compaction(内存整理)

连续物理内存不足时:

Compaction

↓

Move Pages

↓

Create Large Free Block

主要用于:

●Huge Page

●CMA

●高阶内存分配(High-order Allocation)

十四、Huge Page

普通:

4 KB

Huge Page:

2 MB

Gigantic Page:

1 GB

优势:

●减少 Page Table

●降低 TLB Miss

●提高数据库和虚拟化场景性能

十五、Page Fault(缺页异常)

访问虚拟地址时:

CPU

↓

Page Fault

↓

Kernel

↓

Handle Fault

分为:

●Minor Page Fault

●Major Page Fault

Major Fault 需要访问磁盘,代价最高。

十六、Copy-on-Write(COW)

执行:

fork()

时:

父子进程共享同一物理页:

Parent

\

Page

/

Child

当任一进程写入时:

Copy

↓

 Write

从而避免不必要的数据复制,提高效率。

十七、Memory Overcommit

Linux 默认允许:

malloc(100GB)

即使机器只有:

32GB RAM

真正访问时才分配。

对应:

vm.overcommit_memory

十八、Memory Cgroup(memcg)

在容器环境中:

Container A

2GB

Container B

4GB

Linux 使用:

Memory Cgroup

限制:

●Memory Limit

●OOM

●Page Cache

●Swap

Kubernetes 的 Pod Memory Limit 底层正是依赖 memcg 实现。

总结

Linux 内存管理可以概括为一条清晰的数据流:

Application

│

▼

Virtual Memory

│

▼

Page Table

│

▼

Physical Memory

│

▼

Buddy Allocator

│

▼

Slab / Page Cache

│

▼

LRU Reclaim

│

▼

Swap / OOM

掌握这一整体架构,再逐步深入到各个模块(如页表、Buddy、SLUB、Page Cache、内存回收、NUMA、memcg 等),能够帮助我们更高效地分析内存性能问题、理解内核源码,并在系统性能优化和技术面试中建立完整的知识体系。

最新文章

随机文章