当前位置: 首页 > news >正文

优化Ubuntu性能:如何动态调整swap交换空间大小

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

这里可以看出物理内存15G,swap只有2G。当used接近total时就需要考虑扩容了。更专业的做法是用vmstat观察si/so(swap in/out)频率:

vmstat 1 5

如果siso列经常出现非零值,说明系统在频繁使用swap,这时候扩容能显著提升性能。

3. 安全关闭现有swap空间

调整swap前必须先禁用当前swap,这是很多教程容易忽略的关键步骤。直接操作swap文件可能导致数据损坏,正确做法是:

sudo swapoff -a

这个命令会立即停止所有swap分区和swap文件的使用。这时候如果你运行free -h,会看到Swap那行全部显示为0。注意:如果系统正在使用大量swap,这个操作可能导致内存压力骤增,最好在空闲时段执行。

有个实际案例:某次我给生产环境服务器调整swap时,忘记先迁移服务,结果swapoff瞬间导致OOM killer终止了关键进程。所以稳妥的做法是先确保:

  1. 保存所有工作进度
  2. 关闭内存密集型应用
  3. 通过free -h确认内存有足够余量

4. 创建新的swap文件

现在可以创建新swap文件了。我推荐在根目录创建,因为通常根分区有充足空间。决定大小时可以参考这个经验值:

  • 内存≤4G:swap=内存×2
  • 4G<内存≤8G:swap=8G
  • 8G<内存≤64G:swap=16G
  • 内存>64G:swap=32G

比如要创建16G swap文件:

sudo dd if=/dev/zero of=/swapfile bs=1G count=16

这里解释下参数:

  • if=/dev/zero:用零填充文件
  • of=/swapfile:输出文件路径
  • bs=1G:每次写入1G数据块
  • count=16:写入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

这个配置的意思是:

  • /swapfile:swap文件路径
  • none:不挂载到具体目录
  • swap:文件系统类型
  • sw:swap专用选项
  • 0 0:dump和fsck相关设置

6. 高级调优技巧

基础的swap配置完成后,还可以通过这几个参数进一步优化性能:

调整swappiness(默认值60可能过高):

echo 'vm.swappiness=10' | 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.enabled=1' | 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分钟,期间出现OOM
  • 16G内存+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混用

问题3:swap使用率始终为0解决:可能是swappiness设置过低,临时调高测试:

sudo sysctl vm.swappiness=60

性能下降排查:如果发现启用swap后系统变卡,可以用iostat -x 1查看磁盘IO情况。如果%util持续高于80%,说明磁盘成为瓶颈,考虑:

  1. 使用更快的SSD
  2. 减少swappiness值
  3. 增加物理内存

我在一台老旧的开发机上就遇到过这种情况:机械硬盘+8G swap导致系统几乎不可用,换成SSD后性能提升显著。所以swap不是越大越好,要综合考虑硬件配置。

http://www.cnnetsun.cn/news/1353549.html

相关文章:

  • 异步任务卡顿?Dify自定义节点不生效?深度拆解Event Loop与Celery集成失效根源,
  • 影墨·今颜小红书人像生成实战:3步打造电影感东方写真
  • 麒麟V10系统下Docker安装全攻略:从零配置到加速器优化
  • 上位机软件开发实战:从数据采集到可视化全流程解析
  • YOLO12在安防监控中的应用:实时检测人员车辆实战案例
  • SYSU-Exam:开源学习平台的高效复习解决方案
  • 基于大语言模型的毕设实战:从选题到部署的完整技术路径
  • 手把手教你用LongCat-Image-Edit V2:上传图片输入中文指令,轻松改图
  • STEP3-VL-10B惊艳效果:儿童绘本图理解→故事续写→分镜脚本生成全流程
  • 5G PUSCH非动态传输实战:Type 1和Type 2配置授权的区别与配置详解
  • 小白友好:ms-swift框架快速上手,5步完成大模型微调与部署
  • Z-Image-Turbo_UI界面功能体验:拖拽上传、选择模型、点击生成,简单三步
  • MGeo门址结构化模型详细步骤:地址省市区街道门牌号自动识别
  • OpenCV形状识别进阶:从轮廓提取到复杂形状检测的完整指南
  • CosyVoice长文本合成稳定性测试:一小时有声书生成案例
  • 4大维度:零基础掌握大型语言模型实战应用
  • CANoe自动化测试必备:用ReplayBlock+CAPL脚本实现智能报文回放(V11.0版)
  • MySQL 常用 SQL 语句大全
  • navicat15安装破解
  • [ai生成]自学检索增强生成(RAG)day1
  • 三相风光储LCL并网直流微电网仿真系统探究
  • Ansys 案例研究 | 对流系数如何影响温度变化速率
  • 防火墙做不到的事:一张图讲清网闸的“物理隔离”到底是什么?
  • 如何在window终端使用代理
  • 【WRF安装】完整自动化 WRF-ARW/WRF-Chem 安装脚本(多服务器测试)
  • 一个顶级的黑客能厉害到什么程度?
  • Excel 实战技巧:动态单元格引用中使用 LET 函数优化 Excel 公式性能与可读性
  • 【C++算法入门】贪心算法-分糖果问题
  • MT5 跨平台对冲系统选型:从 EA 开发到工具落地,我为什么选道一?
  • 收藏 | 从零开始学LangGraph,构建能思考的Agentic RAG系统,小白也能轻松上手!