
1. 为什么需要动态调整swap交换空间很多刚接触Ubuntu的开发者可能都遇到过这样的场景编译大型项目时系统突然卡死或者运行内存密集型应用时频繁出现OOM内存不足错误。这时候查看系统监控往往会发现物理内存已经耗尽而swap空间却闲置着或者设置不合理。我在帮团队优化CI/CD流水线时就遇到过典型案例一台16G内存的构建服务器在并行编译Android系统时频繁崩溃。检查发现默认的2G swap空间根本不够用后来把swap调整到8G后不仅构建成功率提升到100%整体编译时间还缩短了15%。swap空间本质上是磁盘上的一块特殊区域当物理内存不足时系统会把暂时不用的内存数据交换到这里。虽然磁盘速度比内存慢得多NVMe SSD的延迟大约是DDR4内存的10万倍但有swap总比系统直接杀进程要好。特别是在这些场景下特别有用处理大型数据集的数据科学工作同时运行多个虚拟机的开发环境编译大型代码库如Linux内核、Android系统运行内存消耗不稳定的应用如Chrome浏览器2. 检查当前swap使用情况在动手调整之前我们需要先了解系统的内存现状。打开终端我最常用的三个诊断命令是free -h swapon --show cat /proc/swaps以我的开发机为例执行free -h会显示这样的信息total used free shared buff/cache available Mem: 15G 4.2G 8.1G 356M 3.2G 10G Swap: 2.0G 512M 1.5G这里可以看出物理内存15Gswap只有2G。当used接近total时就需要考虑扩容了。更专业的做法是用vmstat观察si/soswap in/out频率vmstat 1 5如果si和so列经常出现非零值说明系统在频繁使用swap这时候扩容能显著提升性能。3. 安全关闭现有swap空间调整swap前必须先禁用当前swap这是很多教程容易忽略的关键步骤。直接操作swap文件可能导致数据损坏正确做法是sudo swapoff -a这个命令会立即停止所有swap分区和swap文件的使用。这时候如果你运行free -h会看到Swap那行全部显示为0。注意如果系统正在使用大量swap这个操作可能导致内存压力骤增最好在空闲时段执行。有个实际案例某次我给生产环境服务器调整swap时忘记先迁移服务结果swapoff瞬间导致OOM killer终止了关键进程。所以稳妥的做法是先确保保存所有工作进度关闭内存密集型应用通过free -h确认内存有足够余量4. 创建新的swap文件现在可以创建新swap文件了。我推荐在根目录创建因为通常根分区有充足空间。决定大小时可以参考这个经验值内存≤4Gswap内存×24G内存≤8Gswap8G8G内存≤64Gswap16G内存64Gswap32G比如要创建16G swap文件sudo dd if/dev/zero of/swapfile bs1G count16这里解释下参数if/dev/zero用零填充文件of/swapfile输出文件路径bs1G每次写入1G数据块count16写入16次总大小16G创建完成后需要设置正确权限sudo chmod 600 /swapfile sudo mkswap /swapfile性能优化技巧如果使用SSD可以通过fallocate替代dd来快速创建文件sudo fallocate -l 16G /swapfile这能在几秒内完成操作而dd可能需要几分钟。不过某些旧文件系统如ext3不支持fallocate这时候还是得用dd。5. 启用并永久化swap配置现在可以激活新swap文件了sudo swapon /swapfile验证是否生效sudo swapon --show应该能看到类似输出NAME TYPE SIZE USED PRIO /swapfile file 16G 0B -2为了让配置永久生效需要编辑/etc/fstab。强烈建议先备份sudo cp /etc/fstab /etc/fstab.bak然后添加这行配置echo /swapfile none swap sw 0 0 | sudo tee -a /etc/fstab这个配置的意思是/swapfileswap文件路径none不挂载到具体目录swap文件系统类型swswap专用选项0 0dump和fsck相关设置6. 高级调优技巧基础的swap配置完成后还可以通过这几个参数进一步优化性能调整swappiness默认值60可能过高echo vm.swappiness10 | sudo tee -a /etc/sysctl.conf sudo sysctl -p这个值(0-100)控制系统使用swap的积极程度。对于SSD系统建议设为10-30如果物理内存很大比如64G以上甚至可以设为1。提升swap优先级当有多个swap时sudo swapon -p 100 /swapfile优先级越高数字越大的swap会被优先使用。使用zswap压缩适用于内存8G的系统echo zswap.enabled1 | sudo tee -a /etc/sysctl.conf这个内核特性会在内存中压缩swap页面能显著减少磁盘IO。7. 实际效果测试与验证配置完成后我建议用这些方法验证效果压力测试stress-ng --vm 4 --vm-bytes $(free -g | awk /Mem/{print int($2*0.9)})G --timeout 60s这个命令会占用90%的物理内存持续60秒观察swap使用情况。编译性能对比 以编译Linux内核为例time make -j$(nproc)调整swap前后分别记录时间我的测试结果显示16G内存2G swap编译时间32分钟期间出现OOM16G内存16G swap编译时间28分钟无OOM监控工具推荐htop直观查看内存/swap使用率glances综合监控工具smem -s swap -r按进程统计swap使用8. 常见问题排查问题1swapon失败提示invalid argument解决通常是因为文件系统不支持swap尝试sudo mkswap -f /swapfile问题2重启后swap未自动加载解决检查/etc/fstab是否有语法错误特别是空格和tab混用问题3swap使用率始终为0解决可能是swappiness设置过低临时调高测试sudo sysctl vm.swappiness60性能下降排查如果发现启用swap后系统变卡可以用iostat -x 1查看磁盘IO情况。如果%util持续高于80%说明磁盘成为瓶颈考虑使用更快的SSD减少swappiness值增加物理内存我在一台老旧的开发机上就遇到过这种情况机械硬盘8G swap导致系统几乎不可用换成SSD后性能提升显著。所以swap不是越大越好要综合考虑硬件配置。