Ubuntu 20.04 SWAP分区扩容实战:从4GB到8GB的性能优化指南

发布时间:2026/8/12 23:18:38
Ubuntu 20.04 SWAP分区扩容实战:从4GB到8GB的性能优化指南 1. 项目概述与核心需求解析最近在折腾一台老旧的开发服务器跑的是Ubuntu 20.04主要用来编译一些大型的C项目。编译过程经常卡死一看系统监控物理内存早就吃满了SWAP分区也在疯狂读写磁盘IO直接拉满整个系统响应慢得像幻灯片。问题就出在这里当初安装系统时随手给SWAP分了4GB想着“够用就行”。结果现在项目稍微复杂点内存需求激增这4GB的SWAP在内存耗尽时根本兜不住系统频繁触发OOM Killer杀进程或者陷入剧烈的磁盘颠簸严重影响工作效率。这个场景相信很多用Ubuntu做开发、跑数据库或者搞深度学习的兄弟都遇到过。SWAP分区或者说交换空间是Linux系统里一块非常重要的“安全垫”。它不是内存的替代品而是一个应急缓冲区。当物理内存RAM不够用时内核会把一部分暂时不用的内存数据“交换”到硬盘上的SWAP区域腾出RAM给更紧急的进程使用。但如果这块“安全垫”太小就像给一个拳击手准备了儿童尺寸的护具关键时刻根本起不到缓冲作用系统会直接“硬着陆”——要么强制结束进程要么性能暴跌。所以“调整SWAP分区容量”这个操作绝不仅仅是改个数字那么简单。它背后对应的是对系统工作负载的深刻理解以及对性能与稳定性之间平衡点的精准拿捏。特别是对于Ubuntu 20.04这样一个LTS长期支持版本很多生产环境和开发机都在用掌握这套“扩容手术”是每个系统管理员和进阶开发者必备的技能。接下来我就结合自己踩过的坑把从评估、规划到实操、验证的完整流程拆解清楚。2. SWAP机制深度解析与容量规划原则在动手之前我们必须搞清楚两件事SWAP到底是怎么工作的我的机器到底需要多大的SWAP2.1 SWAP的工作原理与常见误区很多人对SWAP有个根深蒂固的误解“用了SWAP系统就变慢了所以最好禁用SWAP。” 这个观点在SSD普及前或许有几分道理因为传统机械硬盘的随机IO速度比内存慢几个数量级频繁交换确实会导致性能灾难。但在今天即便是SATA SSD其IOPS也远超机械盘NVMe SSD更是快得惊人。适量的SWAP交换其性能代价在大多数场景下是可以接受的它带来的系统稳定性收益远大于那一点微小的延迟。Linux内核的内存管理非常智能。它使用SWAP不仅仅是在内存耗尽时。内核有一个“页面缓存”机制会把读取过的文件缓存在内存中加速后续访问。当系统内存压力增大时内核会优先把这些干净的缓存页面丢弃或移动到SWAP而不是去动应用程序的匿名内存。此外内核还会把一些长时间未访问的“冷”内存页主动换出到SWAP即使物理内存还有剩余目的是为了在内存中保持更多“热”数据提升整体缓存命中率。所以看到SWAP被用了一部分完全不用紧张这恰恰说明内核在高效地管理你的内存。2.2 容量规划到底要多大才够用这是最关键的一步。盲目扩容到几十GB会白白浪费宝贵的磁盘空间尤其是云服务器扩容不足又解决不了问题。传统的经验法则比如“SWAP大小是物理内存的1倍或2倍”在内存动辄16G、32G的今天已经过时了。更科学的规划需要结合你的实际用途休眠支持如果你需要系统休眠Hibernate功能SWAP空间必须大于或等于物理内存。因为休眠要把整个内存镜像写入SWAP。本教程主要讨论服务器/工作站场景通常不启用休眠所以这条可以忽略。内存工作集评估这是最实际的方法。在系统运行你的典型工作负载时比如编译大项目、运行数据库使用free -h、htop或vmstat 1命令观察内存使用情况。重点关注siswap in和soswap out两列。如果它们持续为0说明当前SWAP够用或根本没用上。如果so持续大于0且物理内存使用率%MEM接近100%就说明SWAP在持续写出容量可能不足。现代服务器建议内存 4GB至少2GB SWAP。内存 4GB - 16GB至少4GB SWAP建议与内存等大。内存 16GB重点考虑工作负载。对于数据库服务器、虚拟化宿主机建议配置4GB - 8GB的固定SWAP。对于大多数Web应用、开发机4GB通常足够。对于拥有超大内存如128GB以上的机器SWAP主要起“安全阀”作用防止极端情况下的OOM配置4GB-8GB即可。以我自己的开发机为例物理内存32GB日常编译需要约28GB峰值。原4GB SWAP在编译后期会被写满导致so飙升。我的目标是将SWAP扩容到8GB为内存峰值留出约25%的缓冲空间这个比例在经验中比较安全。注意调整分区是高风险操作务必在操作前备份重要数据。如果是在虚拟机中可以先做个快照。如果是物理机确保有完整的系统备份或恢复方案。3. 方案选型SWAP文件 vs SWAP分区在Linux中实现SWAP有两种主要形式SWAP分区和SWAP文件。Ubuntu 20.04默认安装时通常创建的是一个独立的SWAP分区。我们需要根据现有情况选择调整方案。3.1 SWAP分区与SWAP文件的优劣对比特性SWAP分区SWAP文件性能传统观点认为稍好因为是一个连续的磁盘区域没有文件系统开销。但在现代内核和SSD上差异极小。性能接近分区完全可接受。灵活性差。大小固定调整需要移动或修改分区表操作复杂且有风险。极好。可以随时创建、删除、调整大小无需调整磁盘分区。管理难度高涉及fdisk/parted等分区工具。低使用dd和mkswap等文件操作命令即可。适用场景系统安装时规划好且后期不打算频繁调整的场景。强烈推荐用于后期调整。几乎所有现代调整场景的首选。3.2 我们的决策采用SWAP文件方案对于“调整现有SWAP分区容量”这个需求最安全、最灵活的方案不是去折腾那个已有的SWAP分区而是直接禁用它然后创建一个新的、更大容量的SWAP文件。原因如下风险最低修改分区表尤其是涉及移动分区是高风险操作一不小心可能导致系统无法启动。而操作文件的风险相对可控。操作简单整个过程不需要重启除了可能需要更新/etc/fstab命令步骤清晰。可逆性强如果新SWAP文件有问题可以轻松删除并重新启用旧SWAP分区。兼容性好从Ubuntu 18.04开始系统对SWAP文件的支持已经非常完善性能和稳定性与分区无异。因此本教程的核心路径将是备份 - 禁用旧SWAP分区 - 创建新SWAP文件 - 启用并持久化。4. 实操准备与现有状态检查动手前必须对系统现状了如指掌。4.1 检查当前SWAP使用情况打开终端输入以下命令sudo swapon --show这个命令会列出所有活跃的交换空间。输出可能类似NAME TYPE SIZE USED PRIO /dev/sda2 partition 4G 1.2G -2这里可以看到我有一个位于/dev/sda2的SWAP分区大小是4G已使用了1.2G。记下它的设备名/dev/sda2和类型partition。接着查看内存和SWAP的整体概况free -h输出total used free shared buff/cache available Mem: 31Gi 19Gi 1.5Gi 1.2Gi 10Gi 10Gi Swap: 4.0Gi 1.2Gi 2.8Gi确认总SWAP是4.0GiB。4.2 检查磁盘空间可用性创建SWAP文件需要连续的磁盘空间。我们需要找一个有足够空闲空间的分区通常是根分区/或者/home。df -h查看输出找到挂载点为/的那一行看Avail列。例如Filesystem Size Used Avail Use% Mounted on /dev/sda3 200G 50G 150G 25% /这意味着根分区有150GB的剩余空间足够我们创建8GB的SWAP文件。请确保你选择的分区有至少比你目标SWAP大小多出1-2GB的剩余空间以保证文件系统的健康。4.3 记录关键配置信息我们需要知道当前SWAP分区是如何被系统启用的以便后续正确禁用和替换。cat /etc/fstab在输出中寻找包含swap字样的行。例如# /etc/fstab: static file system information. ... UUIDabcd1234-5678-90ef-ghij-klmnopqrstuv none swap sw 0 0 # 或者可能是设备名 # /dev/sda2 none swap sw 0 0记下这一行。它表示系统启动时会自动将指定设备通过UUID或设备名挂载为SWAP。稍后我们需要注释或修改这一行。5. 分步实操从旧分区迁移到新SWAP文件现在开始核心操作。请严格按照顺序执行。5.1 第一步禁用并释放旧的SWAP分区首先关闭当前正在使用的SWAP分区。sudo swapoff -v /dev/sda2请将/dev/sda2替换为你之前用swapon --show查到的设备名。-v参数表示详细输出可以看到关闭进度。执行后再次运行sudo swapon --show和free -h确认SWAP总量变为0或不再显示原来的分区。重要提示如果SWAP分区正在被大量使用used值很高swapoff命令可能会花费很长时间因为内核需要把数据从SWAP读回内存。在此期间系统可能会变慢。最好在系统负载较低时进行此操作。5.2 第二步创建新的SWAP文件我们决定在根目录/下创建名为swapfile的SWAP文件大小为8GB8388608 KiB。请务必使用fallocate或dd命令来创建而不是简单的touch以确保分配连续磁盘块获得最佳性能。方法A使用fallocate推荐更快sudo fallocate -l 8G /swapfile如果fallocate在某些文件系统如ext4的某些旧版本上报告不支持则使用dd。方法B使用dd通用sudo dd if/dev/zero of/swapfile bs1M count8192解释if/dev/zero是输入源零数据流of/swapfile是输出文件bs1M是每次读写块大小为1MiBcount8192是块的数量。1M * 8192 8GiB。创建完成后检查文件大小ls -lh /swapfile应该显示大约8GB。5.3 第三步设置正确的文件权限SWAP文件必须只有root可读写否则会有严重的安全风险。sudo chmod 600 /swapfile这条命令将文件权限设置为-rw-------即只有所有者root可读写。5.4 第四步格式化文件为SWAP空间使用mkswap命令将文件标记为交换空间。sudo mkswap /swapfile输出会类似“Setting up swapspace version 1, size 8 GiB (8589930496 bytes)”。这个命令会在文件头部写入一个交换空间签名。5.5 第五步启用新的SWAP文件现在激活这个SWAP文件。sudo swapon /swapfile再次运行sudo swapon --show和free -h你应该能看到新的SWAP文件已经生效总SWAP容量变成了8GB左右旧分区4G 新文件8G但旧分区已禁用所以应只显示新文件的8G。5.6 第六步使配置永久生效更新fstab目前的新SWAP文件只在当前会话有效重启后会失效。我们需要修改/etc/fstab让系统开机自动启用它。首先备份原始的fstab文件一个好习惯sudo cp /etc/fstab /etc/fstab.bak然后使用文本编辑器如nano或vim编辑/etc/fstabsudo nano /etc/fstab在文件末尾添加一行来挂载新的SWAP文件。首先找到并注释掉在行首加#之前标识旧SWAP分区的那一行。例如# UUIDabcd1234-5678-90ef-ghij-klmnopqrstuv none swap sw 0 0然后在新的一行添加/swapfile none swap sw 0 0这一行的意思是将/swapfile这个文件挂载为交换空间使用默认选项sw。保存并退出编辑器在nano中是CtrlX然后按Y确认再按回车。5.7 第七步调整Swappiness参数可选但推荐swappiness是一个内核参数取值范围0-100它控制系统有多“积极”地使用SWAP。值越高内核越倾向于使用SWAP值越低则越倾向于保留数据在物理内存中。默认值通常是60。对于拥有大量物理内存的桌面或服务器将其调低可以减少不必要的交换提升响应速度。特别是当你有SSD时虽然SWAP性能尚可但频繁交换仍会消耗SSD的写入寿命。查看当前值cat /proc/sys/vm/swappiness临时修改重启后失效sudo sysctl vm.swappiness10永久修改编辑/etc/sysctl.conf文件sudo nano /etc/sysctl.conf在文件末尾添加vm.swappiness10保存退出。要使永久修改立即生效可运行sudo sysctl -p对于我的开发机我设置为10。对于内存紧张的系统可以保持默认或稍高。这是一个需要根据实际观察来微调的参数。6. 验证、测试与旧分区清理6.1 验证配置重启系统这是检验配置是否持久化的终极测试。sudo reboot重启后登录系统再次运行sudo swapon --show free -h cat /proc/swaps所有命令都应确认/swapfile是唯一活跃的交换空间且大小为8GB。6.2 性能压力测试可选如果你想测试新SWAP文件在压力下的表现可以做一个简单的测试。警告此操作会故意耗尽内存可能导致前台程序无响应请在测试环境中谨慎操作或保存好所有工作。安装压力测试工具sudo apt install stress-ng运行一个快速测试尝试分配超过物理内存的量stress-ng --vm 1 --vm-bytes 40G --vm-keep --timeout 60s这个命令会尝试分配40GB的内存假设你物理内存32GB持续60秒。同时在另一个终端窗口运行vmstat 1或htop观察si/so列和SWAP使用情况。你应该能看到系统开始使用SWAP但不会像之前那样轻易写满或触发OOM。测试完成后系统应逐渐恢复正常。6.3 清理旧的SWAP分区最终步骤确认新的SWAP文件工作完全正常后那个旧的、4GB的SWAP分区就彻底闲置了。你可以选择保留它作为备份不做任何操作。但它会占用磁盘空间。删除它并合并到其他分区这是高级操作涉及分区表修改和文件系统扩容风险极高需要用到fdisk/parted和resize2fs等工具。除非你非常清楚自己在做什么并且有完整的备份否则不建议新手操作。将它格式化为普通分区并挂载使用相对安全。你可以用sudo mkfs.ext4 /dev/sda2将其格式化为ext4文件系统然后创建一个挂载点如/mnt/old_swap并在/etc/fstab中添加挂载项将它用作普通数据盘。对于大多数用户如果磁盘空间不紧张建议选择方案1即保留不动这是最安全的选择。7. 常见问题与故障排查实录在实际操作中你可能会遇到以下问题7.1 问题swapon失败提示 “swapon: /swapfile: read swap header failed: Invalid argument”原因最常见的原因是SWAP文件没有正确格式化或者文件系统不支持SWAP文件极少数情况。解决确保你使用了sudo mkswap /swapfile命令并且没有报错。检查文件权限是否为600(-rw-------)。如果使用fallocate创建某些文件系统如F2FS或带特定特性的ext4可能需要额外的步骤。可以尝试用dd命令重新创建文件先sudo swapoff /swapfile和sudo rm /swapfile。sudo dd if/dev/zero of/swapfile bs1M count8192 statusprogress sudo chmod 600 /swapfile sudo mkswap /swapfile7.2 问题系统重启后新的SWAP文件没有自动激活原因/etc/fstab配置错误或者文件路径、权限问题。解决检查/etc/fstab中新增的行是否有拼写错误确保路径是/swapfile。检查/swapfile的权限和所有者。系统启动时会在挂载根文件系统后、启用交换空间前检查fstab。如果/swapfile位于需要网络挂载的驱动器上如NFS可能会失败。对于本地磁盘这不是问题。可以手动执行sudo swapon -a命令这个命令会尝试启用fstab中所有标记为swap的设备。观察其输出是否有错误信息。7.3 问题fallocate命令创建的文件mkswap时报错原因fallocate创建的是“稀疏文件”在某些内核或文件系统配置下SWAP需要完全分配非稀疏的文件。解决这就是为什么备选方案总是使用dd。直接使用dd命令创建可以避免这个兼容性问题。虽然慢一点但兼容性最好。7.4 问题调整swappiness后效果不明显原因swappiness只是内核交换策略的一个因素。另一个关键参数是vfs_cache_pressure控制内核回收用于目录和inode缓存的内存倾向。另外如果应用程序就是需要那么多内存该交换时还是会交换。深入排查使用cat /proc/vmstat | grep -i swap查看更详细的交换统计。观察pgswapin和pgswapout的变化。使用smem或slabtop命令查看内核缓存的使用情况。调整是一个持续观察和微调的过程没有一劳永逸的万能值。7.5 性能调优进阶使用zram替代或辅助SWAP对于内存容量中等如8GB-16GB且频繁遇到内存压力的系统可以研究一下zram。zram是在内存中创建一个压缩块设备作为SWAP。由于压缩和解压的速度远快于磁盘IO它能极大提升“交换”的性能体验相当于用CPU时间换取了更快的响应。Ubuntu 22.04 及更高版本在内存较小的安装中默认启用了zram。在20.04上你可以手动安装和配置zram-config包。这可以作为物理SWAP文件的一个高性能补充尤其适合那些内存不足但CPU有富余的场景。