调整 Linux 的 Swap 分区(交换分区)是系统运维中一项常见的任务,无论是为了应对临时的内存压力,还是为了优化长期的内存使用策略。本文将通过几种典型场景,详细介绍如何安全地调整、创建或删除 Swap 空间,并优化其使用行为。操作前请务必备份重要数据,尤其是在涉及磁盘分区时。
1. 调整现有 Swap 分区大小
直接调整一个已存在的 Swap 分区大小通常意味着需要删除并重新创建分区,这个过程存在风险,建议在物理机或虚拟机的维护模式(如 Rescue 模式)下进行。
首先,查看当前系统中的 Swap 信息:
swapon --show
或者
cat /proc/swaps
确认目标 Swap 分区(例如 /dev/sdb1)后,先将其停用:
swapoff /dev/sdXn
接下来,使用 fdisk 或 parted 等工具删除旧分区,并在同一位置创建一个更大或更小的新分区。完成分区操作后,记录新分区的 UUID:
sudo blkid /dev/sdXn
然后,将该分区格式化为 Swap 格式并立即启用:
mkswap /dev/sdXn
swapon /dev/sdXn
最后,为了确保系统重启后配置依然生效,需要更新 /etc/fstab 文件,将其中对应 Swap 分区的条目修改为新的 UUID。
2. 使用 Swap 文件(更灵活的方案)
如果觉得操作分区风险较高,或者在云服务器等无法直接调整分区布局的环境中,使用 Swap 文件是一个更灵活、更安全的选择。
创建一个 4GB 大小的 Swap 文件(请根据你的磁盘空间和需求调整 count 值):
dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress
设置正确的文件权限,防止被非 root 用户读取:
chmod 600 /swapfile
将该文件格式化为 Swap 空间:
mkswap /swapfile
启用这个 Swap 文件:
swapon /swapfile
若想让配置永久生效,需要在 /etc/fstab 文件末尾添加一行:
/swapfile none swap sw 0 0
完成后,可以通过 free -h 或 swapon --show 命令来验证 Swap 是否已成功添加并启用。
3. 删除 Swap 分区或文件
如果你决定不再需要某个 Swap 空间,可以按照以下步骤安全移除。
首先,停用目标 Swap:
swapoff /dev/sdXn # 或 swapoff /swapfile
然后,编辑 /etc/fstab 文件,找到对应 Swap 分区或文件的行,将其删除或注释掉(在行首添加 #)。
如果需要彻底删除 Swap 分区并回收磁盘空间,还需使用 fdisk 或 parted 工具删除该分区,并考虑将释放出的空间合并到相邻分区中。此操作会丢失该分区上的所有数据,务必谨慎。
4. 优化 Swap 使用倾向 (swappiness)
swappiness 值(范围 0-100)决定了内核使用 Swap 空间的积极程度。值越高,内核越倾向于使用 Swap;默认值通常是 60。对于希望减少 Swap 使用、优先使用物理内存的服务器,可以调低此值。
查看当前的 swappiness 设置:
cat /proc/sys/vm/swappiness
临时将值调整为 10(仅当前会话有效):
sudo sysctl vm.swappiness=10
若需永久生效,编辑 /etc/sysctl.conf 文件,添加或修改如下行:
vm.swappiness=10
保存后,执行 sudo sysctl -p 使配置立即生效。
关键注意事项
- 操作环境:调整物理分区前,确保目标分区未被挂载,最好在维护模式下操作。
- 云服务器限制:大多数云服务商不支持动态调整系统盘分区,因此强烈推荐使用 Swap 文件方案。
- 配置验证:修改
/etc/fstab 后,可以运行 sudo mount -a 来测试配置语法是否正确,避免因配置错误导致系统无法启动。
- 性能权衡:Swap 本质上是磁盘空间,速度远慢于物理内存。过低的
swappiness 可能导致内存耗尽时进程被 OOM Killer 直接终止;过高则可能因频繁换入换出导致系统响应变慢。需要根据实际负载找到平衡点。
希望这篇指南能帮助你更好地管理 Linux 系统的 Swap 空间。如果你在系统调优过程中有其他经验或疑问,欢迎到 云栈社区 的 运维 & 测试 板块与大家交流探讨。