Linux Swap 详解 (1)

我们来系统性地讲解 Linux Swap,包括概念、实现机制、配置、优化、查看方法、常见问题以及实战练习。


📘 Linux Swap 详解

1. 什么是 Swap?

Swap(交换空间)是 Linux 内核在 物理内存不足 时,将部分不活跃的内存页(page)临时换出到 磁盘上的交换空间 的机制。

  • 本质:虚拟内存扩展技术,将内存压力转移到磁盘。

  • 形式

    • Swap 分区:专用磁盘分区(常见于传统安装方式)。
    • Swap 文件:普通文件,挂载后作为 swap 使用(灵活,易扩容)。

📌 类比:物理内存是高速办公桌,swap 就像临时放到文件柜里,不常用的资料会被搬走,腾出桌面空间。


2. 内核的 Swap 行为

Linux 内核通过 Page Frame Reclamation(页面回收机制)决定何时启用 swap:

  1. Page Aging:内核给页面打分(活跃/不活跃列表)。

  2. LRU(Least Recently Used)链表

    • Active List(活跃页)
    • Inactive List(可回收页)
  3. Swap-out 条件

    • 内存不足,或内核检测到内存紧张。
    • 内核扫描 inactive list,将不常用页写入 swap。
  4. Swap-in 条件

    • 进程再次访问已 swap 出的页,触发缺页异常(page fault)。
    • 内核将该页从 swap 读回内存。

3. SLES(SUSE Linux Enterprise Server)中的 Swap 配置

3.1 查看 Swap 使用情况

bash 复制代码
# 总览
free -h

# 查看详细使用情况
swapon --show

# 查看内存/Swap 页面的内核统计
cat /proc/meminfo | grep -i swap

示例输出:

bash 复制代码
NAME      TYPE SIZE  USED PRIO
/dev/dm-1 partition 8G  1G   -2

3.2 添加 Swap 分区

bash 复制代码
# 创建分区 (fdisk 或 parted)
mkswap /dev/nvme0n1p3
swapon /dev/nvme0n1p3

# 永久启用 (写入 /etc/fstab)
echo "/dev/nvme0n1p3 swap swap defaults 0 0" >> /etc/fstab

3.3 添加 Swap 文件

bash 复制代码
# 创建 4G swap 文件
fallocate -l 4G /swapfile

# 设置权限
chmod 600 /swapfile

# 格式化
mkswap /swapfile

# 启用
swapon /swapfile

# 永久启用
echo "/swapfile swap swap defaults 0 0" >> /etc/fstab

4. Swap 优化与内核参数

4.1 swappiness 参数

控制内核使用 swap 的倾向(0-100,默认 60)。

  • 0:尽可能不使用 swap,除非 OOM。
  • 100:积极使用 swap,将文件缓存留在内存。

查看:

bash 复制代码
cat /proc/sys/vm/swappiness

临时修改:

ini 复制代码
sysctl -w vm.swappiness=10

永久修改:

bash 复制代码
echo "vm.swappiness=10" >> /etc/sysctl.conf

4.2 vm.overcommit_memory

控制内核内存分配策略:

  • 0:启发式分配(默认)。
  • 1:总是允许超过物理内存分配。
  • 2:严格模式,不允许超过 swap+物理内存。

查看:

bash 复制代码
cat /proc/sys/vm/overcommit_memory

5. 常见问题 (FAQ)

Q1: Swap 是否越大越好?

❌ 不一定。Swap 过大不会提高性能,反而可能掩盖内存不足问题。

👉 建议:内存 ≤ 8GB 时,Swap=2×内存;内存 > 8GB 时,Swap≈内存或 1/2。


Q2: Swap 和 zram 有什么区别?

  • Swap:基于磁盘(SSD/HDD),速度慢。
  • zram:基于内存压缩,比 swap 快,但仍然占用部分 RAM。

Q3: 如何判断系统是否在频繁使用 Swap?

复制代码
vmstat 1
  • si(swap in)和 so(swap out)字段长时间不为 0 → 内存压力大。

Q4: swap 导致性能下降怎么办?

  • 增加物理内存。
  • 调低 vm.swappiness
  • 使用 zram 替代 swap。

6. 实战练习

练习 1:查看当前 swap 使用情况

sql 复制代码
free -h
swapon --show

练习 2:新建 2G swap 文件并启用

bash 复制代码
fallocate -l 2G /swap_test
chmod 600 /swap_test
mkswap /swap_test
swapon /swap_test
swapon --show

练习 3:调节 swappiness 并观察效果

css 复制代码
sysctl -w vm.swappiness=90
stress --vm 2 --vm-bytes 1G --timeout 60s
vmstat 1

7. 总结

  • Swap:扩展内存的重要机制,但速度远慢于内存。
  • 关键参数vm.swappinessvm.overcommit_memory
  • SLES 管理工具swapon/swapoffzram 支持。
  • 优化建议:适度配置 swap,不要依赖过大 swap,合理调节 swappiness。
相关推荐
源远流长jerry8 分钟前
STM32之DMA详解
linux·网络·c++·stm32·单片机·嵌入式硬件
tianyuanwo23 分钟前
技术总结:AArch64架构下Jenkins Agent(RPM容器编译节点)掉线问题分析与排查
java·linux·jenkins
blasit38 分钟前
Ubuntu 20.04.6交叉编译得到Ubuntu 16.04.6的可执行文件
linux·运维·ubuntu
轻松Ai享生活1 小时前
详解Linux LVM (Logical Volume Manager)
linux·后端
奇妙-2 小时前
创龙3576ububuntu系统设置静态IP方法
linux
Jayyih2 小时前
嵌入式系统学习Day23(进程)
linux·运维·服务器
Johny_Zhao3 小时前
Conda、Anaconda、Miniconda对比分析
linux·网络安全·信息安全·kubernetes·云计算·conda·shell·containerd·anaconda·yum源·系统运维·miniconda
大数据小墨3 小时前
在Arch Linux上设置SDDM自动登录Hyprland
linux
shylyly_3 小时前
Linux->多线程3
java·linux·开发语言·阻塞队列·生产者消费者模型
小王努力学编程3 小时前
从零开始的 Docker 之旅
linux·运维·服务器·docker·容器·容器编排·镜像制作