565 字
2 分钟
为什么 Linux 需要 Swapping
Linux 系统会在物理内存不足时,将部分内存数据交换到磁盘。这个过程称为 Swapping。为什么 Linux 需要 Swapping?
一、什么是 Swapping
1.1 Swapping 的概念
flowchart LR
subgraph 物理内存
A[活动进程]
B[缓存数据]
C[空闲内存]
end
subgraph 磁盘
S[Swap 空间<br/>交换分区/文件]
end
A -->|内存压力| S
S -->|恢复| A
Note: 当物理内存不足时<br/>将不活跃页面换出到磁盘
1.2 Swapping 的触发条件
# 查看 swap 使用free -h# total used free# Mem: 31Gi 28Gi 2.7Gi# Swap: 2Gi 156Mi 1.9Gi
# 查看 swapiness 参数cat /proc/sys/vm/swappiness# 60二、为什么需要 Swapping
2.1 内存超量使用(Overcommit)
# 进程申请内存不一定立即使用# 这是内存分配的正常行为
process = malloc(1GB) # 申请 1GB# 实际使用可能只有 100MB
# 如果没有 swap,系统会 OOM# 有了 swap,可以等实际使用时再分配2.2 保护 OOM Killer
flowchart LR
subgraph 没有 swap
M[内存耗尽] --> O[OOM Killer]
O --> K[杀死进程]
end
subgraph 有 swap
M2[内存压力] --> S[换出到 swap]
S --> R[内存释放]
R --> N[正常继续]
end
没有 swap 时:内存耗尽 → OOM Killer 直接杀死进程 有 swap 时:内存压力 → 先尝试换出 → 给进程机会清理
2.3 内存碎片整理
flowchart LR
subgraph 内存碎片
A[进程 A: 100MB]
G[间隙]
B[进程 B: 50MB]
G2[间隙]
C[进程 C: 200MB]
end
Note: 需要连续大内存块时<br/>通过 swap 整理
三、Swapping 的工作原理
3.1 页面回收(Page Reclaim)
flowchart TB
subgraph 页面类型
F[File-backed 页<br/>文件缓存]
A[Anonymous 页<br/>进程内存]
end
subgraph 回收策略
F -->|可以直接释放| FC[释放]
F -->|可以写回磁盘| FW[写回后释放]
A -->|换出到 swap| SW[swap out]
end
3.2 LRU 列表
flowchart LR
subgraph LRU (最近最少使用)
LRU[LRU 列表]
LRU -->|最不活跃| L[换出候选]
LRU -->|最活跃| H[保持内存]
end
Linux 使用 LRU(Least Recently Used)算法决定哪些页面应该被换出。
四、swappiness 参数
4.1 swappiness 的含义
# swappiness 范围: 0-100# 0: 尽量不使用 swap,除非内存快耗尽# 100: 积极使用 swap
cat /proc/sys/vm/swappiness# 60 (默认)| swappiness | 行为 |
|---|---|
| 0 | 几乎不用 swap,保护进程内存 |
| 60 | 平衡策略 |
| 100 | 优先换出内存 |
4.2 推荐的 swappiness
| 场景 | 推荐值 | 原因 |
|---|---|---|
| 数据库服务器 | 10-30 | 内存大,避免 swap 影响性能 |
| 通用桌面 | 60 | 平衡 |
| 内存紧张 | 较高 | 需要 swap 保护 |
# 临时修改sysctl vm.swappiness=10
# 永久修改echo "vm.swappiness=10" >> /etc/sysctl.conf五、Swapping 的性能影响
5.1 Swap 性能问题
# 如果大量 swap 活动,说明内存不足vmstat 1# procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
# 1 0 0 2000000 50000 300000 0 0 0 0 100 200 10 5 85 0 0
# si/so 列显示 swap 活动# 如果持续不为 0,说明内存不足5.2 判断是否需要更多内存
| 指标 | 说明 |
|---|---|
si 持续不为 0 | 正在从 swap 换入,需要更多内存 |
so 持续不为 0 | 正在换出到 swap,内存不足 |
| available 很小 | 实际可用内存不足 |
六、Swap 配置建议
6.1 Swap 大小
| 内存大小 | 建议 swap 大小 |
|---|---|
| < 2GB | 2x RAM |
| 2-8GB | = RAM |
| 8-64GB | 至少 4GB |
| > 64GB | 至少 4GB |
6.2 Swap 位置
# 使用 SSD 作为 swap# SSD 的 swap 性能比 HDD 高 100 倍
# 创建 swap 文件fallocate -l 8G /swapfilechmod 600 /swapfilemkswap /swapfileswapon /swapfile七、总结
7.1 Linux 需要 Swapping 的原因
| 原因 | 说明 |
|---|---|
| 内存超量使用 | 进程申请的内存不一定立即使用 |
| 保护进程 | 避免 OOM Killer 直接杀死进程 |
| 内存碎片整理 | 需要连续大内存块时换出页面 |
| 休眠支持 | 支持系统休眠需要 swap |
7.2 swappiness 调整指南
| 场景 | swappiness |
|---|---|
| MySQL/PostgreSQL | 10-30 |
| 通用服务器 | 60 |
| 内存紧张 | 较高 |
核心观点:Swapping 是 Linux 内存管理的重要组成部分,它提供了内存超量使用的能力,保护系统免受 OOM 的影响。但过多的 swap 会严重影响性能,需要根据场景合理配置。
参考资料
- Linux Swap FAQ — 内核文档
- vm.swappiness — swappiness 文档
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
为什么 Linux 需要 Swapping
https://blog.souloss.com/posts/why-the-design/why-linux-needs-swapping/ 部分信息可能已经过时
相关文章 智能推荐
1
为什么 Linux 需要虚拟内存
技术科普 深入解析虚拟内存的设计原理,为什么操作系统需要虚拟内存,页表机制,物理内存与虚拟内存的映射。
2
为什么 Linux 默认页大小是 4KB
技术科普 深入解析 Linux 默认选择 4KB 页大小的历史原因和技术权衡。
3
为什么 Linux 和 macOS 不需要碎片整理
技术科普 深入解析为什么 Linux 和 macOS 的文件系统不需要碎片整理,与 Windows NTFS 的对比。
4
为什么 HugePages 可以提升数据库性能
技术科普 深入解析 HugePages 如何提升数据库性能,TLB 缓存的工作原理。
5
为什么 WebSocket 需要握手
技术科普 深入解析 WebSocket 握手协议的设计原理,理解从 HTTP 到 WebSocket 的协议升级机制。






