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。
相关推荐
YouEmbedded13 小时前
解码UDP
linux·udp
w***488214 小时前
Linux安装redis
linux·运维·redis
python百炼成钢16 小时前
28.嵌入式 Linux LED 驱动开发实验
linux·运维·驱动开发
西风未眠17 小时前
高效编辑之vi/vim常用快捷键汇总
linux·编辑器·vim
_Stellar17 小时前
Linux 服务器管理 根目录文件夹权限设置 基于用户组实现安全共享
linux·服务器·安全
LUCIFER18 小时前
驱动开发:详细分析 DTB、DTS、DTSI、DTBO 的区别、用途及它们之间的关系
linux·服务器·驱动开发
liuyao_xianhui19 小时前
版本控制器git--gdb/cgdb
linux·运维·服务器·git
CS_浮鱼19 小时前
【Linux进阶】mmap实战:文件映射、进程通信与LRU缓存
linux·运维·c++·缓存
chuxinweihui20 小时前
应用层协议 HTTP
linux·服务器·网络·网络协议·http
xu_yule20 小时前
Linux_16(多线程)信号量+基于环形队列的生成消费模型+自选锁+读写锁
linux·运维·服务器