Ubuntu/Debian 设置 Swap 虚拟内存

什么是 Swap?

Swap(交换分区)是Linux系统中的虚拟内存机制,当物理内存不足时,系统会将不常用的内存页面写入到硬盘上的swap区域,从而释放物理内存供其他程序使用。

为什么需要 Swap?

  • 内存不足保护:防止系统因内存不足而崩溃
  • 休眠支持:系统休眠时需要将内存内容写入swap
  • 内存优化:将不活跃的内存页面交换到硬盘
  • 服务器稳定性:提高服务器在内存压力下的稳定性

Ubuntu 官方建议的大小

  • 物理内存 ≤ 1GB:swap = 物理内存 × 2
  • 物理内存 1GB-2GB:swap = 物理内存 × 1.5
  • 物理内存 2GB-8GB:swap = 物理内存
  • 物理内存 > 8GB:swap = 物理内存 × 0.5

检查当前 Swap 状态

# 查看swap使用情况
swapon -s

# 查看内存和swap使用情况
free -h

# 查看swap分区信息
cat /proc/swaps

创建 Swap 文件

1. 创建 Swap 文件

使用 dd 命令创建指定大小的swap文件:

# 创建4GB的swap文件
sudo dd if=/dev/zero of=/var/swap bs=1024 count=4194304

2. Swap 文件大小对照表

大小 count 值 适用场景
1GB 1048576 小内存服务器(≤2GB RAM)
2GB 2097152 中等内存服务器(2-4GB RAM)
4GB 4194304 大内存服务器(4-8GB RAM)
8GB 8388608 大内存服务器(8-16GB RAM)
16GB 16777216 超大内存服务器(>16GB RAM)

3. 格式化 Swap 文件

# 将文件格式化为swap格式
sudo mkswap /var/swap

# 设置正确的权限
sudo chmod 0600 /var/swap

4. 启用 Swap

# 启用swap文件
sudo swapon /var/swap

# 验证swap是否启用
swapon -s

永久启用 Swap

为了在系统重启后自动启用swap,需要将其添加到 /etc/fstab 文件:

# 添加swap文件到fstab
echo '/var/swap       swap             swap    defaults        0 0' >> /etc/fstab

禁用 Swap

如果需要临时禁用swap:

# 禁用swap文件
sudo swapoff /var/swap

# 验证swap是否已禁用
swapon -s

Swap 优化建议

1. 调整 Swappiness

swappiness 参数控制系统使用swap的倾向性(0-100):

# 查看当前swappiness值
cat /proc/sys/vm/swappiness

# 临时调整swappiness(重启后失效)
sudo sysctl vm.swappiness=10

# 永久调整swappiness
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Swappiness 建议值:

  • 服务器环境:10-30(减少swap使用)
  • 桌面环境:60(默认值)
  • 内存充足:1-10(几乎不使用swap)

2. 性能优化

对于SSD硬盘,可以调整swap的I/O调度:

# 设置swap文件的I/O调度为deadline
echo 'ACTION=="add|change", KERNEL=="loop*", ATTR{queue/scheduler}="deadline"' | sudo tee /etc/udev/rules.d/60-swap-scheduler.rules

监控 Swap 使用

1. 实时监控

# 实时查看内存和swap使用情况
watch -n 1 free -h

# 查看swap使用详情
cat /proc/meminfo | grep -i swap

2. 系统监控

# 查看swap使用率
vmstat 1 5

# 查看内存和swap统计
cat /proc/vmstat | grep -i swap

常见问题解决

1. Swap 文件权限问题

如果遇到权限错误:

# 确保swap文件权限正确
sudo chown root:root /var/swap
sudo chmod 0600 /var/swap

3. 性能问题

如果swap使用过多影响性能:

# 减少swappiness
echo 'vm.swappiness=1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 清理swap
sudo swapoff -a && sudo swapon -a
使用 Hugo 构建
主题 StackJimmy 设计