Linux的交换区
Linux 交换区(Swap)详解
交换区(Swap)是 Linux 系统用于扩展内存的一种机制,它将部分磁盘空间虚拟成内存使用。当物理内存(RAM)不足时,系统会将不活跃的内存页移动到交换区,从而避免进程因内存不足(OOM)被强制终止。
1. 交换区的作用
- 扩展可用内存:当 RAM 耗尽时,系统使用 Swap 作为后备存储。
- 休眠(Hibernate)支持:休眠时,内存数据会保存到 Swap。
- 减少 OOM 风险:避免系统因内存不足而崩溃。
2. 交换区的类型
类型 | 说明 |
---|---|
Swap 分区 | 独立的磁盘分区(推荐方式,性能较好) |
Swap 文件 | 普通文件模拟的交换区(灵活,无需重新分区) |
ZRAM | 基于内存的压缩交换(适用于内存较小设备,如嵌入式系统) |
3. 查看当前交换区
free -h # 查看内存和 Swap 使用情况
swapon --show # 查看活跃的 Swap 设备
cat /proc/swaps # 查看 Swap 详细信息
输出示例:
total used free shared buff/cache available
Mem: 7.7G 2.1G 3.2G 345M 2.4G 5.0G
Swap: 2.0G 0B 2.0G
4. 创建交换区
(1) 创建 Swap 文件(推荐)
# 1. 创建空文件(大小 4GB)
sudo fallocate -l 4G /swapfile# 2. 设置权限(仅 root 可读写)
sudo chmod 600 /swapfile# 3. 格式化为 Swap
sudo mkswap /swapfile# 4. 启用 Swap
sudo swapon /swapfile# 5. 永久生效(写入 /etc/fstab)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
(2) 创建 Swap 分区
# 1. 使用 fdisk/gdisk 创建新分区(类型为 Linux Swap)
# 2. 格式化
sudo mkswap /dev/sdXN # 替换为实际分区(如 /dev/sdb1)# 3. 启用
sudo swapon /dev/sdXN# 4. 写入 /etc/fstab
echo '/dev/sdXN none swap sw 0 0' | sudo tee -a /etc/fstab
5. 调整交换区使用策略
Linux 通过 swappiness
控制 Swap 使用频率(范围 0-100):
- 0:尽量不使用 Swap(除非内存耗尽)。
- 100:积极使用 Swap(可能降低性能)。
查看当前值:
cat /proc/sys/vm/swappiness
临时修改:
sudo sysctl vm.swappiness=10
永久修改:
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
6. 删除交换区
(1) 禁用 Swap 文件
sudo swapoff /swapfile
sudo rm /swapfile
sudo sed -i '/\/swapfile/d' /etc/fstab
(2) 禁用 Swap 分区
sudo swapoff /dev/sdXN
sudo sed -i '/\/dev\/sdXN/d' /etc/fstab
7. 交换区大小建议
物理内存(RAM) | 推荐 Swap 大小 |
---|---|
≤ 2GB | RAM × 2 |
2GB–8GB | 等于 RAM 大小 |
8GB–64GB | RAM × 0.5(至少 4GB) |
≥ 64GB | 4GB(或不用 Swap) |
8. 性能优化
- 优先使用 Swap 分区(比文件性能高 5%~10%)。
- SSD 比 HDD 更适合 Swap(减少延迟)。
- 避免过度使用 Swap(频繁交换会拖慢系统)。
9. 常见问题
(1) Swap 使用率过高
- 原因:物理内存不足,系统频繁换页。
- 解决:增加 RAM 或优化应用内存占用。
(2) 休眠(Hibernate)失败
- 原因:Swap 空间小于 RAM。
- 解决:确保
Swap ≥ RAM
大小。
(3) swapon
报错 “invalid argument”
- 原因:Swap 文件未正确格式化。
- 解决:重新运行
mkswap
。
10. 总结
操作 | 命令 |
---|---|
创建 Swap 文件 | fallocate → mkswap → swapon |
启用现有 Swap | swapon /swapfile |
禁用 Swap | swapoff /swapfile |
调整 swappiness | sysctl vm.swappiness=10 |
合理配置 Swap 可提升系统稳定性,但不能替代物理内存! 🚀