资讯动态

Linux swap分区与swap文件创建详解:从原理到实战

发布时间:2026/9/18 7:39:52 来源:尧图企业网站定制
在Linux服务器上摸爬滚打这么多年swap这块我踩过的坑绝对能排进Top 5。刚接手线上机器那会儿我一度以为swap就是“用磁盘假装内存”能不开就不开——直到一次深夜线上告警Redis进程因为内存耗尽直接挂了我才真正意识到swap在操作系统内存管理里的分量。今天借这个机会把swap分区的创建与使用一次性说透重点讲清楚两种主流方法传统swap分区和swap文件。不管你是刚装完虚拟机的新手还是维护着几十台生产环境的运维这篇文章都能给你一个可以直接照着做的完整方案。1. 先从本质说起swap到底是什么为什么Linux离不开它1.1 内核的“临时仓库”swap的工作原理把swap理解成办公桌上的抽屉就对了内存是桌面你正在处理的东西必须摊在桌面上但房间只有这么大东西堆满之后要么扔进垃圾桶清掉进程要么塞进抽屉swap要用的时候再翻出来。Linux内核里的页面回收机制page reclaim就是把不活跃的内存页挪到磁盘上腾出空间给真正热的数据整个过程由kswapd这个内核线程默默完成。很多初学者对swap有个误解觉得它就是个“慢速内存”甚至认为有swap就意味着性能差。实际上Linux内核的内存管理是分层的hot pages留在物理内存cold pages被换出到swap。当系统内存有富余时swap基本是闲置的只有内存压力上来swap才开始替物理内存分担压力。换句话说swap不是用来提升速度的它是内存的“安全垫”避免内存瞬间冲高时系统直接崩掉。还有一个容易忽略的点swap不仅能换出匿名页进程堆栈数据还能配合内存回收机制做页缓存page cache管理。在kswapd眼里物理内存的水位线watermark决定了一切——当空闲内存低于low水位线后台回收开始工作低于min水位线进程的页面分配就会被阻塞这时候如果一直得不到缓解内核就直接把OOM Killer拉出来点名了。1.2 没有swap会发生什么也就是为什么我不建议你关掉它网上有不少“内存够大就要关swap”的说法我强烈建议你谨慎跟风。内存再大的机器也有峰值的尤其是跑数据库、Java应用、构建任务的时候瞬时内存开销能把你的物理内存瞬间打穿。没有swap兜底内核就只能走极端——OOM Killer。OOM Killer的逻辑是挑选“最该杀”的进程杀掉评分标准包括内存占用、运行时间、进程优先级等等可它在多进程生产环境里并不总能做出“正确”选择。我见过一台没有swap的机器内存被Java进程和文件缓存挤爆结果OOM Killer反而把nginx给杀了业务直接断流。有swap的情况下系统还能勉强维持响应至少给你介入处理留出时间。当然过度依赖swap也是不行的。总内存swap被写满之后系统依然会OOM而且以swap为主的磁盘I/O风暴会让整个系统卡到让人绝望这时别慌按第5章的方法处理即可。一句话内存充足时swap是摆设内存紧张时swap是救命的但别把swap当成扩容内存的手段。1.3 swap分区和swap文件两种载体怎么选各有啥优劣Linux创建swap有两条路一是划一块独立分区二是直接用文件系统里的一个文件来做swap。这两种方式在功能上没有本质区别底层都是块设备读写但使用体验差异明显。对比项swap分区swap文件性能直接读写块设备少量开销经过文件系统层略有开销灵活性分区建完大小难改随时增删无需重新分区适用场景物理机、传统部署虚拟机、云主机、容器管理难度分区表操作相对复杂几个命令搞定适合新手开机自动挂载通过fstab或传统的挂载配置同样支持fstab特殊情况分区被占用时需谨慎操作磁盘格式需支持fallocate我个人的倾向是物理服务器、传统机房环境用swap分区更稳毕竟独立分区不会受文件系统碎片和权限影响云上、虚拟机、容器环境用swap文件更灵活随时能改大小、能清理不用重新走一遍分区流程。接下来的内容两种方法我都会带各位完整走一遍。2. 方法一传统swap分区适合物理服务器和多系统环境2.1 实操前准备看懂磁盘布局再动手别把数据盘毁了创建swap分区之前先看清楚机器当前的磁盘结构这是新手最容易出事的环节。我强烈建议先用lsblk看一眼整体布局lsblk输出里能看到vda、sda之类的磁盘设备以及下面挂载的分区。接着用fdisk进到目标磁盘交互界面p参数可以打印分区表确认要操作哪块盘。划swap分区不一定非要用一整块盘可以在空闲空间里划一个主分区也可以直接用独立的整个磁盘方式是灵活的。需要注意swap分区的大小规划直接关系到后期体验。老规矩“物理内存的1~2倍”其实已经不太适合大内存机器了——你一台256G内存的数据库服务器难道划512G磁盘给swap合理做法是看业务桌面和开发机建议给物理内存的1倍左右云上通用服务器给2~8G做兜底即可数据库或Java重内存应用可以按物理内存的50%~100%预留。我自己的经验是先按业务峰值评估宁可刚开始少分也别分太多挤占磁盘空间因为swap分区后期扩容很麻烦。2.2 用fdisk创建分区并设置类型82号类型别记错假设我现在要对/dev/sdb这块空盘划分区fdisk /dev/sdb交互界面里依次输入n新建分区按提示一路回车把整个磁盘作为一个分区t修改分区类型输入分区号通常就是1再输入代码82这是Linux swap的十六进制标识p打印确认一下分区类型显示为“Linux swap”w写入并退出很多教程在这儿就结束了但我要多提一句fdisk写完之后要确认内核是否已经识别到新分区比较保险的方法是运行partprobe /dev/sdb刷新分区表特殊情况下甚至需要重启才能让系统拿到分区信息。这一步在热扩容场景特别重要。2.3 mkswap格式化与swapon立即启用分区创建好之后下面这几个命令就是核心三条龙了mkswap /dev/sdb1 swapon /dev/sdb1 free -h第一条mkswap负责把分区初始化为swap文件系统注意它输出的UUID信息先记下来后面写fstab会用到。第二条swapon是让swap立即生效这时free -h里能看到Swap那一行的总量发生变化说明系统已经使用上这块swap了。如果这步操作的是已有分区而不是新盘一定要先确认分区是空数据或者已经备份mkswap等于格式化数据直接被覆盖没有后悔药。生产环境我一般还会先执行swapoff确保之前的swap资源先释放避免部分进程引用旧swap引发报错但日常创建全新分区没这个必要。2.4 开机自动挂载fstab到底怎么填才不会踩坑做完上面几步重启系统后swap信息就没了因为还没配置持久化。Linux开机挂载的核心是/etc/fstab文件需要把swap分区的信息写进去vim /etc/fstab在文件末尾加一行/dev/sdb1 none swap sw 0 0这里有个教训强烈建议别直接写设备名而是用UUID。因为设备名在重启后可能变化比如内核识别顺序变了UUID是固定的能避免开机时fstab找不到设备导致的启动问题。先用blkid查看分区的UUID再写进fstabUUIDxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx none swap sw 0 0写完fstab绝对不能急着重启。先跑一遍swapon -a试试这个命令会按fstab配置把所有swap挂载起来检查输出有没有报错。我在实际排障中发现很多莫名其妙的启动失败都是fstab某一行格式错了趁早验证比让机器在重启时卡住强得多。3. 方法二swap文件虚拟机和云主机场景的灵活解法3.1 为什么云环境我更推荐swap文件现在云主机和虚拟机场景我几乎很少用swap分区了原因很实际云主机的系统盘分区通常已经规划好想从里面再挖一块独立分区出来扩容和调整都受云平台限制而swap文件就是一个普通文件想要多大就多大不想要了直接删除完全不影响磁盘分区结构。如果用的是LVM逻辑卷也可以用lvcreate创建逻辑卷做swap但灵活性依然不如swap文件。尤其是容器场景很多基础镜像为了精简压根没有预先创建swap分区这时候用swap文件几乎是唯一选项。另外swap文件还适合那种“临时加个几G的swap顶一下峰值”的救急场景几分钟就能搞定验证完就可以撤。3.2 5分钟创建一个swap文件从dd到swapon全流程在root权限下创建swap文件非常简单一共四条命令dd if/dev/zero of/swapfile bs1M count2048 chmod 600 /swapfile mkswap /swapfile swapon /swapfile第一条命令生成一个大小为2048MB2G的文件bs1M表示每次写入1Mcount2048表示写2048次。这里有人爱用fallocate -l 2G /swapfile速度确实快很多但我实测过在一些文件系统比如老版本xfs上fallocate出来的文件可能带有空洞mkswap会拒绝或写入时出问题所以求稳就用dd虽然慢一点但绝对不踩坑。chmod 600是为了限制文件权限这点非常重要——swap文件里可能残留内存中的敏感数据如果不限制普通用户可读就存在信息泄露风险。第四步执行之后再用free -h验证看到swap总量增加就成功了。3.3 开机自动挂载和swap文件大小自由调整和swap分区一样swap文件也需要写fstab才能开机自动挂载注意这里不能写UUID文件没有稳定的UUID直接写路径即可/swapfile none swap sw 0 0因为路径是固定的只要文件还在重启就不会出问题。写完依然建议执行swapon -a验证一遍。swap文件最大的优势就是扩容灵活。假设我2G的swap文件不够用了想扩到4G标准的操作序列是swapoff /swapfile rm -f /swapfile dd if/dev/zero of/swapfile bs1M count4096 chmod 600 /swapfile mkswap /swapfile swapon /swapfile注意swapoff这步不能省略文件正在被内核使用的时候直接删会出问题。如果是临时扩容不想破坏原文件也可以再建一个新文件两个swap文件或分区同时swapon是完全支持的Linux允许你同时挂载多个swap设备。4. 调优与监控swap不只是创建就完事4.1 swappiness参数决定系统“多积极地使用swap”系统创建好swap之后还有一个关键参数要认识vm.swappiness取值范围0~100默认通常是60。这个值越高内核就越优先把内存页换到swap越低说明系统越倾向于复用物理内存尽量少用swap。很多网上的性能优化教程都会建议“把swappiness改成10甚至0”强调充分利用物理内存。这个观点本质上没错但不要无脑照搬。真正的思路是结合场景桌面Linux建议保留默认60兼顾交互流畅和内存释放内存充足的普通服务器可以设10左右减少不必要的磁盘I/O数据库、缓存类服务建议设成10以下甚至0数据能留内存就留内存内存偏小、又跑着批量任务的机器建议50以上防止内存瞬间打满临时调整用sysctl vm.swappiness10永久生效则写入/etc/sysctl.confvm.swappiness10然后执行sysctl -p加载配置。这里我要纠正一个常见认知偏差swappiness设置为0不代表绝不使用swap它只是降低内核换出内存页的倾向当内存压力极大时内核依然会调用swap兜底。4.2 日常监控内存够不够、swap执行了多少用这几条命令快速定位swap创建完不是放着不管了尤其是生产环境我每隔一段时间都会看一下系统内存和swap的状态。最常用的组合是free -h看总内存、已用、剩余以及swap总量、已用最直观vmstat 1每秒刷新一次看si和so列这两个值表示从swap换入换出的数据量如果持续很大说明内存压力已经到了值得关注的程度swapon -s列出当前所有swap设备和各自的使用情况排障时一眼看出哪个swap设备在起作用top/htop按字母键M按内存排序能看到各进程的RES和SWAP列判断哪个进程在大量消耗内存还有个进阶命令sar -S可以查看历史swap使用情况的统计适合做周期性巡检。这块内容虽然基础但很多线上故障都栽在“平时不看爆了才知”——养成固定巡检习惯比任何调优技巧都重要。4.3 常见问题速查表从挂载失败到性能暴跌下面这些是我在实际使用中最常遇到的问题整理成一张速查表方便大家直接对照排查。现象原因解决思路开机后swap没生效fstab配置错误或UUID不对检查fstab格式执行swapon -a验证swapoff提示“swapoff failed”系统当前内存实在不够无法一次性回收设置vm.swappiness调高或降负载后再操作创建swap文件时mkswap报错文件含空洞或权限不对用dd替代fallocate重新生成文件检查权限磁盘I/O突然飙高swap频繁换入换出内存压力过大查看vmstat的si/so定位进程扩容内存或swapOOM Killer随机杀进程swap也满了系统彻底无法分配内存紧急清理内存占用必要时加swap文件救急fstab里写设备名导致启动失败设备路径重启后变化改用UUID分区或路径文件5. 实操复盘我亲历的swap事故与维护心得5.1 案例swap分区用得好好的一次重启后“失踪”了之前帮一台物理机换内核重启之后登录上去发现系统卡到不能自理free -h一看swap整个没了。查了半天问题就出在fstab里写的设备路径/dev/sda3而新内核环境下盘符顺序变了系统没能按老路径挂载上swap。这个例子再次印证了用UUID替代设备路径的必要性。当时修复也很快blkid查出swap分区的UUID更新fstabswapon -a手动挂载系统立刻恢复正常。这个事故给我留下的习惯是每次配完swap都要在fstab里写下设备UUID并当场验证更换内核或硬件之后第一件事就是检查fstab和swap状态防患于未然。5.2 案例swap文件太多导致根分区吃紧还有一次某台机器根分区使用率莫名飙到90%排查半天才发现是前一个同事创建的8G swap文件还在而新加的16G swap分区并没有被替换掉。原来他当时的操作只做了重新mkswap和swapon忘了swapoff老的swap文件导致老的swap一直没释放。多个swap设备同时挂载本身没问题但要有清晰的规划和管理意识。我现在的习惯是每次开新swap先swapoff旧设备、在fstab里清理对应行再用swapon -s确认当前生效的swap设备只有预期的那几个。这样可以有效避免磁盘空间被不透明的swap文件长期占用。5.3 案例Redis频繁OOMswap成为了最后一根稻草处理过的一次线上故障让印象最深刻一台跑着Redis的内存型机器物理内存32G起初运维为了方便加了个16G的swap文件系统内存压力上来时大量冷数据被换到swap导致Redis处理请求出现很大的延迟尖刺。后来诊断发现对延迟敏感的应用来说换出无可避免但被换出页面再次被访问时的代价极大。因此对Redis这类应用我最终的建议是不碰swap文件的物理层而是把vm.swappiness调到极低甚至临时改vm.overcommit_memory和tcp_keepalive相关参数配合从应用层保证热数据留在内存里同时尽量避免OOM。这个案例说明swap是保底手段但不是性能优化工具二者一定要分清。5.4 维护经验小结经历过这些事故之后我给自己定了几条维护swap的约定也分享给各位参考每次创建swap后一定要写fstab并执行swapon -a验证观察swap使用率持续高占用优先排查内存压力而不是无限扩大swapswap文件定期检查权限和磁盘剩余空间防止根分区被吃满对延迟敏感的业务用swappiness等参数来控制swap的使用倾向而不是简单删除swap维护记录里明确标注swap的创建时间和大小方便后期变更时清理旧配置这些经验就像系安全带平时觉得多余事故来了才知道有多救命。每当有人问我swap该怎么配我都会说创建swap其实只需要几条命令真正能体现功力的地方在于对内存、swap和业务三者平衡的理解。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价