Featured image of post Proxmox VE 虚拟内存 Swap 全面解析 🐧

Proxmox VE 虚拟内存 Swap 全面解析 🐧

Proxmox VE 虚拟内存 Swap 全面解析 🐧 深入理解 Proxmox VE 中 Swap 虚拟内存的工作原理、配置方法和优化&

Proxmox VE 虚拟内存 Swap 全面解析 🐧

深入理解 Proxmox VE 中 Swap 虚拟内存的工作原理、配置方法和优化策略,帮助您构建更稳定高效的虚拟化环境!🚀


📖 导航目录


✨ 什么是 Swap 虚拟内存?

Swap 虚拟内存是 Linux 系统的一种内存管理机制,当物理内存(RAM)不足时,系统会将一部分不常用的内存数据暂时存储到硬盘上的特定区域(Swap 空间),从而释放物理内存供更紧急的任务使用。

🔍 工作原理

  • 内存扩展:将硬盘空间虚拟为内存使用
  • 数据交换:将不活跃的内存页移动到 Swap 空间
  • 应急保护:防止内存耗尽导致系统崩溃或进程被终止
  • 内存压缩:现代 Linux 内核还使用 zswap 进行内存压缩,减少对磁盘的依赖

📊 内存层次结构对比

存储类型 访问速度 容量 成本 用途
CPU 缓存 1-10ns KB-MB 极高 处理器直接访问
内存 (RAM) 10-100ns GB 活动数据和程序
Swap 空间 1-10ms GB 不活动内存页
硬盘存储 5-20ms TB 极低 长期数据存储

🛠️ 一、删除 Swap 虚拟内存

1. 临时禁用所有 Swap

1
swapoff -a

2. 永久移除 /etc/fstab 中的交换条目

编辑 /etc/fstab 文件:

1
nano /etc/fstab

找到并删除或注释掉(在行首添加 #)以下两行:

1
2
/dev/pve/swap none swap sw 0 0
/swapfile2 none swap sw 0 0

修改后的相关部分应该看起来像这样:

1
2
3
4
5
6
7
8
9
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/pve/root / ext4 errors=remount-ro 0 1
UUID=F49F-33B4 /boot/efi vfat defaults 0 1
#/dev/pve/swap none swap sw 0 0
proc /proc proc defaults 0 0

## usb--ext4--/mnt/usb
UUID=998ebf40-fb54-1444-ad98-b903a6809686 /mnt/usb ext4 nofail,x-systemd.device-timeout=15s 0 0
#/swapfile2 none swap sw 0 0

保存并退出编辑器(在 nano 中按 Ctrl+X,然后按 Y 确认,最后按 Enter)。

3. 删除交换文件

删除您创建的交换文件 /swapfile2:

1
rm -f /swapfile2

4. 删除 LVM 交换分区(可选但推荐)

要完全移除 LVM 交换分区并回收其空间,请执行以下步骤:

首先确认当前的 LVM 布局:

1
lvdisplay

您应该会看到类似这样的输出,其中包含一个名为 swap 的逻辑卷:

1
2
3
4
5
6
7
8
9
--- Logical volume ---
LV Path                /dev/pve/swap
LV Name                swap
VG Name                pve
LV UUID                ...
LV Write Access        read/write
LV Status              available
# open                 0
LV Size                8.00 GiB

删除交换逻辑卷:

1
lvremove /dev/pve/swap

系统会提示您确认删除,输入 y 并按 Enter。

现在您可以将释放的空间分配给其他逻辑卷。最合理的选择是扩展根分区:

1
2
3
4
5
# 扩展根逻辑卷(使用所有可用空间)
lvextend -l +100%FREE /dev/pve/root

# 调整文件系统大小(假设是 ext4)
resize2fs /dev/pve/root

5. 验证更改

确认所有交换空间已被移除:

1
2
free -h
swapon --show

这两个命令应该显示没有任何交换空间被激活。

二、创建 Swap 虚拟内存(推荐用于 PVE)

方法一、文件为 Swap 虚拟内存

1. 创建 Swap 文件

1
2
# 创建 16GB 的 Swap 文件
dd if=/dev/zero of=/swapfile bs=1G count=16 status=progress

status=progress 参数显示创建进度,避免长时间无响应

2. 设置安全权限

1
chmod 0600 /swapfile

确保只有 root 用户可以访问,提高安全性

3. 格式化 Swap 文件

1
mkswap /swapfile

将文件标记为 Swap 空间

4. 启用 Swap

1
swapon /swapfile

立即激活 Swap 文件

5. 验证 Swap 状态

1
2
free -h
swapon --show

查看内存和 Swap 使用情况

方法二、分区为 Swap 虚拟内存

1. 创建 Swap 分区

1
2
3
# 使用 fdisk 或 parted 创建新分区
fdisk /dev/sdb
# 在 fdisk 中: n → p → 分区号 → 起始扇区 → 结束扇区 → t → 82 (Linux swap) → w

2. 格式化 Swap 分区

1
mkswap /dev/sdb1

3. 启用 Swap 分区

1
swapon /dev/sdb1

4. 验证 Swap 状态

1
2
free -h
cat /proc/swaps

⚙️ 三、配置永久生效

1. 备份 fstab 文件

1
cp /etc/fstab /etc/fstab.bak

2. 添加自动挂载配置

1
2
3
4
5
6
7
8
9
# 对于 Swap 文件
echo '/swapfile none swap sw 0 0' >> /etc/fstab

# 对于 Swap 分区
echo '/dev/sdb1 none swap sw 0 0' >> /etc/fstab

# 或者使用 UUID(推荐,更稳定)
UUID=$(blkid -s UUID -o value /dev/sdb1)
echo "UUID=$UUID none swap sw 0 0" >> /etc/fstab

3. 测试配置是否正确

1
2
3
4
5
6
7
8
9
# 禁用所有 Swap
swapoff -a

# 重新启用所有 Swap(根据 fstab)
swapon -a

# 验证结果
free -h
swapon --show

4. 检查系统启动时 Swap 加载

1
2
3
4
5
# 查看系统启动日志
dmesg | grep -i swap

# 检查 systemd 服务状态
systemctl status swap.target

🎯 四、Swap 策略优化(Swappiness)

1. 理解 Swappiness

Swappiness 是 Linux 内核参数,控制系统使用 Swap 的倾向程度:

  • 值范围:0-100
  • 默认值:60(大多数发行版)
  • 低值 (0-30):尽量避免使用 Swap
  • 高值 (70-100):积极使用 Swap

2. 查看当前 Swappiness 值

1
2
3
4
5
6
7
cat /proc/sys/vm/swappiness

# 或者
sysctl vm.swappiness

# 查看所有内存相关参数
sysctl -a | grep vm.

3. 临时调整 Swappiness

1
2
3
4
5
# 方法 1
sysctl vm.swappiness=10

# 方法 2
echo 10 > /proc/sys/vm/swappiness

临时调整重启后失效,适合测试不同值的效果

4. 永久调整 Swappiness

1
2
3
4
5
6
7
8
# 编辑 sysctl 配置文件
echo 'vm.swappiness=10' >> /etc/sysctl.conf

# 或者创建专用配置文件
echo 'vm.swappiness=10' > /etc/sysctl.d/99-swap.conf

# 立即生效
sysctl -p /etc/sysctl.d/99-swap.conf

5. Swappiness 推荐值

场景 推荐值 说明
桌面系统 10-30 减少卡顿,提升响应速度
服务器 10-20 优先使用物理内存
数据库服务器 1-10 极尽量避免使用 Swap
内存严重不足 60-80 积极使用 Swap 避免崩溃
PVE 虚拟化主机 10-30 平衡虚拟机性能和稳定性

6. 相关参数调整

1
2
3
4
5
6
7
# 调整虚拟内存管理参数
echo 'vm.vfs_cache_pressure=50' >> /etc/sysctl.conf
echo 'vm.dirty_ratio=10' >> /etc/sysctl.conf
echo 'vm.dirty_background_ratio=5' >> /etc/sysctl.conf

# 应用配置
sysctl -p

⚖️ 五、启用 Swap 的优缺点

✅ 优点

  1. 内存扩展:缓解物理内存压力
  2. 系统稳定:防止内存耗尽导致系统崩溃
  3. 进程保护:避免重要进程被 OOM Killer 终止
  4. 成本效益:用廉价硬盘空间扩展昂贵的内存
  5. 休眠支持:系统休眠需要 Swap 空间保存内存状态

❌ 缺点

  1. 性能下降:硬盘速度远低于内存(HDD: 100-200 IOPS, SSD: 10K-100K IOPS, RAM: 数百万 IOPS)
  2. 硬盘磨损:频繁交换操作可能缩短 SSD 寿命
  3. 潜在错误:极端情况下可能导致内存相关错误
  4. 响应延迟:Windows 虚拟机会明显卡顿
  5. 管理复杂度:需要合理配置和监控

📊 性能影响分析

1
2
3
4
5
6
7
8
# 测试磁盘 I/O 性能(影响 Swap 性能的关键因素)
dd if=/dev/zero of=/tmp/test bs=8k count=1000000

# 监控 Swap I/O
iostat -xm 1

# 查看内存和 Swap 使用趋势
vmstat 1

🚀 六、优化 Swap 性能的策略

1. 使用高性能存储

1
2
3
4
5
6
7
8
# 优先使用 NVMe SSD 创建 Swap
dd if=/dev/zero of=/mnt/nvme/swapfile bs=1G count=16 status=progress

# 或者使用 RAM disk(临时性,重启失效)
mount -t tmpfs -o size=2G tmpfs /mnt/tmpfs
dd if=/dev/zero of=/mnt/tmpfs/swapfile bs=1G count=2 status=progress
mkswap /mnt/tmpfs/swapfile
swapon /mnt/tmpfs/swapfile

2. 多个 Swap 区域

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 创建多个 Swap 文件
dd if=/dev/zero of=/swapfile1 bs=1G count=8 status=progress
dd if=/dev/zero of=/swapfile2 bs=1G count=8 status=progress

# 同时启用
mkswap /swapfile1
mkswap /swapfile2
swapon /swapfile1
swapon /swapfile2

# 查看所有 Swap 空间
swapon --show

# 设置不同的优先级
echo '/swapfile1 none swap sw,pri=100 0 0' >> /etc/fstab
echo '/swapfile2 none swap sw,pri=50 0 0' >> /etc/fstab

3. 调整 Swap 优先级

1
2
3
4
5
6
7
# 在 /etc/fstab 中设置优先级(数字越小优先级越高)
/swapfile1 none swap sw,pri=10 0 0
/swapfile2 none swap sw,pri=20 0 0

# 或者使用设备路径
/dev/sdb1 none swap sw,pri=10 0 0
/dev/sdc1 none swap sw,pri=20 0 0

4. 监控 Swap 使用情况

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 实时监控
watch -n 1 'free -h; echo "Swappiness: $(cat /proc/sys/vm/swappiness)"'

# 查看详细 Swap 信息
cat /proc/swaps

# 监控 Swap I/O 活动
iostat -xm 1

# 查看哪些进程使用 Swap
smem -s swap -r

# 或者使用
for file in /proc/*/status; do
    awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file
done 2>/dev/null | sort -k 2 -n -r | head -10

📊 七、Swap 大小规划建议

物理内存大小 推荐 Swap 大小 说明
≤ 2GB 2× 内存 传统建议,确保系统稳定性
2-8GB =内存 平衡性能和稳定性
8-64GB 4-16GB 服务器环境推荐值
≥ 64GB 4-8GB 大内存系统,主要用于应急
休眠需求 内存大小 + 10% 系统休眠需要足够空间保存内存状态

💡 PVE 特定建议

对于运行大量虚拟机的 PVE 主机,建议配置:

  • 最小: 4GB Swap
  • 推荐: 8-16GB Swap
  • 最大: 不超过 32GB(除非有特殊需求)

🔢 计算公式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 根据内存计算推荐 Swap 大小
MEMORY_GB=$(free -g | awk '/Mem:/ {print $2}')
if [ $MEMORY_GB -le 2 ]; then
    SWAP_GB=$((MEMORY_GB * 2))
elif [ $MEMORY_GB -le 8 ]; then
    SWAP_GB=$MEMORY_GB
elif [ $MEMORY_GB -le 64 ]; then
    SWAP_GB=16
else
    SWAP_GB=8
fi

echo "推荐 Swap 大小: ${SWAP_GB}GB"

🔧 八、高级配置技巧

1. 使用 ZRAM(内存压缩)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 安装 zram-tools
apt install zram-tools

# 配置 ZRAM(编辑 /etc/default/zramswap)
PERCENTAGE=50
PRIORITY=100
ALGORITHM=lz4

# 重启服务
systemctl restart zramswap

# 查看状态
zramctl

# 或者手动配置
modprobe zram num_devices=1
echo 4G > /sys/block/zram0/disksize
mkswap /dev/zram0
swapon /dev/zram0 -p 100

2. 调整缓存压力

1
2
3
4
5
6
7
8
# 减少缓存压力,降低 Swap 使用
echo 50 > /proc/sys/vm/vfs_cache_pressure
echo 'vm.vfs_cache_pressure=50' >> /etc/sysctl.conf

# 调整脏页写回策略
echo 'vm.dirty_ratio=10' >> /etc/sysctl.conf
echo 'vm.dirty_background_ratio=5' >> /etc/sysctl.conf
echo 'vm.dirty_expire_centisecs=3000' >> /etc/sysctl.conf

3. 禁用 Swap(特定场景)

1
2
3
4
5
6
7
8
# 临时禁用所有 Swap
swapoff -a

# 永久禁用(编辑 /etc/fstab,注释或删除 Swap 行)
sed -i '/swap/d' /etc/fstab

# 或者使用 swapoff 和 systemctl
systemctl mask swap.target

4. 应急内存管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 手动释放缓存
echo 3 > /proc/sys/vm/drop_caches

# 仅释放页缓存
echo 1 > /proc/sys/vm/drop_caches

# 释放目录项和inode缓存
echo 2 > /proc/sys/vm/drop_caches

# 查看内存使用详情
cat /proc/meminfo

5. 使用 Btrfs 交换文件

1
2
3
4
5
6
7
8
# 在 Btrfs 文件系统上创建交换文件
truncate -s 0 /swapfile
chattr +C /swapfile
btrfs property set /swapfile compression none
dd if=/dev/zero of=/swapfile bs=1G count=16 status=progress
chmod 0600 /swapfile
mkswap /swapfile
swapon /swapfile

🚨 九、故障排除与注意事项

1. Swap 创建失败

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 检查磁盘空间
df -h

# 检查文件系统类型(某些文件系统不支持 Swap)
df -T

# 检查文件系统特性(如稀疏文件支持)
touch /testfile
truncate -s 1G /testfile
ls -lh /testfile  # 检查文件大小

# 对于 Btrfs,需要特殊处理
btrfs filesystem df /

2. Swap 无法启用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 检查文件权限
ls -la /swapfile

# 检查文件系统挂载选项(noexec, nosuid)
mount | grep " / "

# 重新格式化
mkswap -f /swapfile

# 检查内核日志
dmesg | grep -i swap

# 检查 SELinux/AppArmor 限制
ausearch -m avc -ts recent | grep swap

3. 性能问题诊断

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 查看 Swap 使用情况
vmstat 1

# 检查哪些进程使用 Swap
smem -s swap -r

# 或者使用
for file in /proc/*/status; do
    awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file
done 2>/dev/null | sort -k 2 -n -r | head -10

# 监控磁盘 I/O
iotop -o

# 检查内存压力
cat /proc/pressure/memory

4. 安全注意事项

  • 避免将 Swap 文件放在加密分区(性能极差)
  • 定期监控 Swap 使用情况,避免过度依赖
  • 考虑在系统休眠时加密 Swap 内容
  • 确保 Swap 文件权限正确(0600)
  • 在敏感环境中考虑禁用 Swap(防止内存数据泄露)

5. SSD 特殊考虑

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 检查 SSD 磨损情况
smartctl -A /dev/nvme0n1 | grep Wear_Level

# 为 SSD 调整交换策略
echo 'vm.swappiness=10' >> /etc/sysctl.conf
echo 'vm.vfs_cache_pressure=50' >> /etc/sysctl.conf

# 使用 fstrim 定期整理
systemctl enable fstrim.timer
systemctl start fstrim.timer

📈 十、监控与维护

1. 创建监控脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
# swap_monitor.sh - 监控 Swap 使用情况

THRESHOLD=80 # 警告阈值百分比
LOG_FILE="/var/log/swap_monitor.log"

# 获取 Swap 使用率
swap_total=$(free | awk '/Swap/ {print $2}')
swap_used=$(free | awk '/Swap/ {print $3}')
if [ $swap_total -gt 0 ]; then
    swap_usage=$((swap_used * 100 / swap_total))
else
    swap_usage=0
fi

echo "$(date): Swap 使用率: $swap_usage%" >> $LOG_FILE

if [ $swap_usage -ge $THRESHOLD ]; then
    echo "$(date): 警告: Swap 使用率超过 $THRESHOLD%!" >> $LOG_FILE
    # 发送警报邮件
    echo "Swap 使用率警报: $swap_usage%" | mail -s "Swap 使用率警报 $(hostname)" admin@example.com
    # 触发应急措施
    echo 1 > /proc/sys/vm/drop_caches
fi

2. 设置定期监控

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 添加定时任务
echo "*/5 * * * * root /usr/local/bin/swap_monitor.sh" > /etc/cron.d/swap_monitor

# 或者使用 systemd timer
cat > /etc/systemd/system/swap-monitor.service << EOF
[Unit]
Description=Swap Usage Monitor
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/swap_monitor.sh
User=root
EOF

cat > /etc/systemd/system/swap-monitor.timer << EOF
[Unit]
Description=Run swap monitor every 5 minutes

[Timer]
OnBootSec=5min
OnUnitActiveSec=5min

[Install]
WantedBy=timers.target
EOF

systemctl enable swap-monitor.timer
systemctl start swap-monitor.timer

3. 定期维护

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 检查并清理不再需要的 Swap 文件
swapon --show | grep file | while read path _; do
    if [ ! -f "$path" ]; then
        swapoff "$path"
        sed -i "\|$path|d" /etc/fstab
        echo "已清理无效的 Swap 文件: $path"
    fi
done

# 检查 Swap 文件系统完整性
swapon --show | grep file | awk '{print $1}' | while read swapfile; do
    if ! swapon -s | grep -q "$swapfile"; then
        mkswap -f "$swapfile"
        swapon "$swapfile"
    fi
done

# 定期重新启用 Swap(防止长时间运行的问题)
swapoff -a && swapon -a

4. 性能基准测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 测试 Swap 性能
dd if=/dev/zero of=/tmp/test bs=8k count=1000000

# 测试内存和 Swap 综合性能
sysbench memory --memory-block-size=1K --memory-total-size=10G run

# 监控测试期间的性能
vmstat 1 30 > /tmp/vmstat.log &
iostat -xm 1 30 > /tmp/iostat.log &
sysbench memory --memory-block-size=1K --memory-total-size=10G run

5. 日志分析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 分析 Swap 使用模式
awk '/Swap/ {print $3}' /proc/meminfo > /tmp/swap_usage.log

# 生成使用报告
gnuplot << EOF
set terminal png
set output "/tmp/swap_usage.png"
set title "Swap Usage Over Time"
set xlabel "Time"
set ylabel "Swap Used (KB)"
plot "/tmp/swap_usage.log" with lines
EOF

🎯 总结

Swap 是 Linux 系统重要的内存管理机制,合理配置可以提升系统稳定性,但需要根据具体使用场景进行优化。对于 PVE 虚拟化平台,建议:

  1. 使用高性能 NVMe SSD 创建适量 Swap
  2. 设置较低的 swappiness 值(10-30)
  3. 配置监控和警报,及时发现内存问题
  4. 定期维护 Swap 空间,确保系统健康运行
  5. 根据工作负载调整 Swap 大小和策略

通过本指南,您应该能够更好地理解和优化 PVE 中的 Swap 配置,构建更稳定高效的虚拟化环境!

💡 提示:在生产环境中进行任何更改前,请务必在测试环境中验证,并确保有完整的数据备份。

希望本指南帮助您更好地管理 PVE 系统的内存资源!如有问题,请参考 PVE 官方文档或社区论坛。

最后更新于 2025-09-28