Linux下扩充Swap交换空间:解决内存不足的实用指南,这些影响要注意!

电子说

1.4w人已加入

描述

 

 

大家在使用 Linux 系统(比如常用的 Ubuntu)时,是不是偶尔会遇到 内存不足” 的弹窗?比如运行大型编译任务、多开虚拟机、做数据分析,或者把 Linux 当服务器用的时候,物理内存一旦 告急,系统就会卡顿甚至崩溃。这时候,Swap 交换空间就成了救场神器

 

 

今天就带大家全面搞懂 Swap:它是什么、什么时候需要扩充、扩充后对堆内存和存储速率有啥影响,最后附上一步到位的 Ubuntu 扩充教程,新手也能跟着做!

内存

一、先搞懂:Swap 交换空间到底是什么?

 

简单说,Swap 就像 Linux 的 虚拟内存,和 Windows 的虚拟内存原理类似 —— 当物理内存(就是你电脑里插的内存条)不够用的时候,系统会把内存中暂时用不上的数据,临时存到硬盘(或 SSD)的 Swap 分区 文件里,腾出物理内存给急需的程序使用。

 

 

比如 Ubuntu 系统默认的 Swap 大小通常是 2G,如果你物理内存是 8G,运行一个占 10G 内存的程序,这时候 Swap 就会 接手” 剩下的 2G,避免程序直接崩溃。

 

 

二、这些场景下,一定要扩充 Swap

 

不是所有情况都需要扩充 Swap,关键看你的使用场景和系统状态。以下 种情况,建议立刻检查并扩充 Swap

 

 

1. 物理内存不足,频繁触发 内存告警

 

比如物理内存 8G,却要运行占 12G 内存的大型软件(如 MatlabDocker 容器集群、视频渲染工具);

 

 

多任务并发时(比如开着代码编辑器、浏览器、虚拟机、数据库),系统卡顿明显,用free -h命令查看时,可用内存” 接近 0Swap 却已经占满。

 

 

2. 服务器长期高负载运行

 

如果把 Linux 当服务器(比如 Web 服务器、数据库服务器),长期有大量进程在后台运行,即使物理内存暂时够用,也建议扩充 Swap—— 避免突发流量(比如瞬间大量用户访问)导致内存峰值超负载,从而保证服务稳定。

 

 

3. 低内存设备的 续命需求

 

比如树莓派、嵌入式 Linux 设备(物理内存可能只有 2G/4G),运行轻量级服务器或边缘计算任务时,2G 默认 Swap 不够用,扩充后能显著减少 内存溢出” 风险。

 

 

三、扩充 Swap 对堆内存的影响:有帮助但也有 

 

首先得明确:堆内存是程序运行时动态申请的内存空间(比如 Java 的 JVM 堆、C++ new申请的内存),是程序干活” 的核心内存区域。Swap 和堆内存的关系很紧密,扩充后影响主要有两点:

 

 

1. 正面影响:避免堆内存 溢出崩溃

 

当程序申请的堆内存超过物理内存上限时,系统会把堆内存中暂时闲置” 的数据(比如很久没调用的变量、缓存数据)转移到 Swap 中,释放物理内存给新的堆内存申请。

 

 

举个例子:你运行一个 Java 程序,JVM 堆设置为 10G,而物理内存只有 8G。如果没有 Swap,程序会直接报 “OOM(内存溢出)” 错误;有了 8G Swap 后,系统会把堆中暂时不用的 2G 数据存到 Swap,程序能正常运行。

 

 

2. 负面影响:堆内存 交换频繁” 会变慢

 

如果堆内存数据需要频繁在物理内存” 和 “Swap” 之间切换(行业里叫 内存颠簸),程序响应会明显变慢。因为硬盘 / SSD 的读写速度,比物理内存慢了几个数量级(物理内存是 GB/s 级,机械硬盘是 MB/s 级,即使是 SSD 也差 10 倍以上)。

 

 

比如你写的程序频繁申请和释放堆内存,且数据量接近物理内存上限,Swap 会反复 存 ” 堆数据,此时你会发现程序卡顿、CPU 占用率飙升(因为 CPU 要等数据交换完成)。

 

 

四、对存储速率的影响:别忽视硬盘 IO 的压力

 

Swap 本质是 用硬盘空间当内存,所以它的读写速度完全依赖你的存储设备,同时也会占用存储设备的 IO 资源,影响其他操作:

 

 

1. 不同存储介质,影响天差地别

 

存储类型

 

 

Swap 读写速度

 

 

对系统的影响

 

 

机械硬盘(HDD

 

 

慢(约 50-150MB/s

 

 

严重占用硬盘 IO,同时做文件拷贝、安装软件会卡顿,甚至系统整体响应变慢

 

 

固态硬盘(SSD

 

 

较快(约 500-2000MB/s

 

 

影响比 HDD 小,但频繁读写 Swap 会消耗 SSD 的 擦写寿命SSD 有固定擦写次数)

 

 

nvme 固态硬盘

 

 

很快(约 3000-7000MB/s

 

 

影响最小,接近物理内存速度,适合作为 Swap 存储介质

 

 

2. Swap 使用率过高,整个系统会 卡壳

 

如果 Swap 使用率超过 50%,且持续上升,说明物理内存已经严重不足,系统大部分时间都在 搬数据(把物理内存数据写到 Swap,再把 Swap 数据读回物理内存),此时:

 

 

打开文件、切换软件要等很久;

 

 

命令行输入指令,回车后要延迟几秒才响应;

 

 

甚至鼠标光标都会卡顿跳帧

 

 

五、实战:Ubuntu 下扩充 Swap 的 步详细教程

 

 Ubuntu 系统为例,从 查看当前 Swap” 到 开机自动生效,每一步都有具体命令和示例,新手也能跟着做(其他 Linux 发行版步骤类似,命令通用)。

 

 

前置准备

 

确保系统有足够的硬盘 / SSD 空间(比如要扩到 8G,就需要至少 8G 空闲空间);

 

 

sudo权限操作(需要管理员密码)。

 

 

步骤 1:查看当前 Swap 大小

 

先执行free -h命令,查看当前 Swap 的总大小和使用情况(-h表示人类可读格式,用 GB/MB 显示,更直观):

 

 

  •  
free -h

执行后会看到类似输出:

 

 

  •  
  •  
  •  
              总计       已用       空闲     共享 缓冲/缓存   可用内存:       19Gi       1.2Gi       5.9Gi       3.0Mi        12Gi        17Gi交换:       2.0Gi         0B       2.0Gi

能看到默认 Swap 是 2G,这时候如果要扩到 8G,继续下一步。

 

 

步骤 2:先关闭现有 Swap

 

扩充前必须关闭当前的 Swap(避免数据冲突),执行命令:

 

 

  •  
sudo swapoff -a

输入管理员密码后,再用free -h验证,会发现交换” 那一行的 总计” 变成 0,说明关闭成功:

 

 

  •  
交换:         0B         0B          0B

步骤 3:创建新的 Swap 文件

 

dd命令创建一个指定大小的 Swap 文件(这里以扩到 8G 为例),命令如下:

 

 

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

解释一下参数:

 

 

if=/dev/zero:从零设备” 读取数据(用来生成空白文件);

 

 

of=/swapfile:把生成的文件保存到根目录,命名为swapfile

 

 

bs=1G:每次读写的块大小” 是 1G

 

 

count=8:读取 8 次块,总大小 = 1G×8=8G(想扩到 16G 就把 count 改成 16)。

 

 

执行后会看到类似输出,说明文件创建成功:

 

 

  •  
  •  
  •  
记录了8+0的读入记录了8+0的写出8589934592字节(8.6GB,8.0GiB)已复制,7.04727秒,1.2GB/s

步骤 4:设置 Swap 文件权限(关键!)

 

为了安全,必须把 Swap 文件的权限设为600—— 只有 root 用户能读写,其他用户没有权限(防止误修改或篡改),命令:

 

 

  •  
sudo chmod 600 /swapfile

执行后没有输出,说明权限设置成功。

 

 

步骤 5:格式化 Swap 文件

 

把刚才创建的空白文件格式化为“Swap 格式,让系统能识别为交换空间,命令:

 

 

  •  
sudo mkswap /swapfile

执行后会看到类似输出,包含 Swap 的 UUID(不用管 UUID,知道成功就行):

 

 

  •  
  •  
正在设置交换空间版本1,大小=8GiB(8589930496 个字节)无标签,UUID=C27ae28e-a3ea-47fa-ad81-7f4bc779fa8e

步骤 6:启用新的 Swap

 

格式化后,启用这个新的 Swap 文件,命令:

 

 

  •  
sudo swapon /swapfile

再用free -h验证,会发现交换” 的总计变成 8G,说明启用成功:

 

 

  •  
交换:       8.0Gi         0B       8.0Gi

步骤 7:配置开机自启(避免重启后失效)

 

默认情况下,重启系统后新的 Swap 会失效,所以要把 Swap 文件添加到/etc/fstab配置文件中,让系统开机自动加载。

 

 

1.用文本编辑器打开/etc/fstab

 

 

  •  
sudo nano /etc/fstab

1.在文件末尾添加一行(复制粘贴即可,注意不要写错):

 

 

  •  
/swapfile none swap sw 0 0

1.保存退出:按Ctrl+O(字母 O),再按回车确认,最后按Ctrl+X退出编辑器。

 

 

这样重启系统后,Swap 还是 8G,不会失效。

 

 

六、这些注意事项,新手一定要避开!

 

1.Swap 大小不是越大越好

 

 

一般建议 Swap 大小是物理内存的 1-2 倍(比如物理内存 16GSwap 设 16-32G);但如果是 SSD,不建议超过物理内存(避免频繁读写消耗 SSD 寿命)。

 

 

2.Swap 文件别放错位置

 

 

尽量把 Swap 文件放在空闲空间充足的分区,优先选 SSD(速度快),别放在机械硬盘的系统分区(会拖慢系统)。

 

 

3.关闭 Swap 要谨慎

 

 

如果系统正在高负载运行(比如有程序在用 Swap),突然执行swapoff -a会导致程序崩溃,建议在系统空闲时” 操作。

 

 

4.定期检查 Swap 使用情况

 

 

htopfree -h定期查看 Swap 使用率,如果长期超过 50%,说明物理内存真的不够用,建议升级内存条(Swap 只是 应急,不能替代物理内存)。

 

 

最后

 

Swap 是 Linux 系统的 内存缓冲垫,合理扩充能解决很多内存不足的问题,但也要注意它对堆内存和存储速率的影响 —— 不要过度依赖 Swap,升级物理内存才是根本解决方案。

 

 

如果觉得这篇教程有用,欢迎分享给身边用 Linux 的朋友~

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分