大家在使用Linux系统(比如常用的Ubuntu)时,是不是偶尔会遇到“内存不足”的弹窗?比如运行大型编译任务、多开虚拟机、做数据分析,或者把Linux当服务器用的时候,物理内存一旦“告急”,系统就会卡顿甚至崩溃。这时候,Swap交换空间就成了“救场神器”。
今天就带大家全面搞懂Swap:它是什么、什么时候需要扩充、扩充后对堆内存和存储速率有啥影响,最后附上一步到位的Ubuntu扩充教程,新手也能跟着做!
一、先搞懂:Swap交换空间到底是什么?
简单说,Swap就像Linux的“虚拟内存”,和Windows的虚拟内存原理类似——当物理内存(就是你电脑里插的内存条)不够用的时候,系统会把内存中暂时用不上的数据,临时存到硬盘(或SSD)的Swap分区/文件里,腾出物理内存给急需的程序使用。
比如Ubuntu系统默认的Swap大小通常是2G,如果你物理内存是8G,运行一个占10G内存的程序,这时候Swap就会“接手”剩下的2G,避免程序直接崩溃。
二、这些场景下,一定要扩充Swap!
不是所有情况都需要扩充Swap,关键看你的使用场景和系统状态。以下3种情况,建议立刻检查并扩充Swap:
1.物理内存不足,频繁触发“内存告警”
•比如物理内存8G,却要运行占12G内存的大型软件(如Matlab、Docker容器集群、视频渲染工具);
•多任务并发时(比如开着代码编辑器、浏览器、虚拟机、数据库),系统卡顿明显,用free -h命令查看时,“可用内存”接近0,Swap却已经占满。
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的7步详细教程
以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为例),命令如下:
sudoddif=/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用户能读写,其他用户没有权限(防止误修改或篡改),命令:
sudochmod600 /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倍(比如物理内存16G,Swap设16-32G);但如果是SSD,不建议超过物理内存(避免频繁读写消耗SSD寿命)。
2.Swap文件别放错位置:
尽量把Swap文件放在空闲空间充足的分区,优先选SSD(速度快),别放在机械硬盘的系统分区(会拖慢系统)。
3.关闭Swap要谨慎:
如果系统正在高负载运行(比如有程序在用Swap),突然执行swapoff -a会导致程序崩溃,建议在“系统空闲时”操作。
4.定期检查Swap使用情况:
用htop或free -h定期查看Swap使用率,如果长期超过50%,说明物理内存真的不够用,建议升级内存条(Swap只是“应急”,不能替代物理内存)。
最后
Swap是Linux系统的“内存缓冲垫”,合理扩充能解决很多内存不足的问题,但也要注意它对堆内存和存储速率的影响——不要过度依赖Swap,升级物理内存才是根本解决方案。
如果觉得这篇教程有用,欢迎分享给身边用Linux的朋友~


