什么是 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