资讯动态

Linux swap 启停操作全解析:从原理到实战调优

发布时间:2026/10/22 8:41:45 来源:尧图企业网站定制
1. 从一次线上告警说起swap 到底该不该开凌晨两点某台跑了十几个容器实例的服务器突然开始疯狂告警内存使用率飙到 95% 以上SSH 登录进去敲个命令都要等好几秒。第一反应是某个服务内存泄漏结果free -h一看物理内存确实快满了但 swap 分区几乎没怎么用。当时脑子里冒出的第一个念头就是swap 是不是没开够或者根本没生效这个场景我相信不少做运维或者后端的朋友都遇到过。关于 Linux 上的 swap圈子里一直有两派观点一派认为 swap 是保命符物理内存不够时能顶上去避免进程被 OOM Killer 直接干掉另一派认为 swap 是性能杀手一旦用上磁盘交换延迟直接起飞还不如让进程干脆点被杀死然后快速重启。这两种说法都有道理但前提是你得先搞清楚 swap 到底是什么、怎么配、怎么启停、什么时候该调。这篇内容就围绕Linux swap 及启停操作这个主题把 swap 的底层逻辑、配置方法、启停流程、参数调优和常见坑一次性讲透。不管你是刚接触 Linux 的新手还是已经管过几十台机器的老手都能从中找到可以直接抄作业的操作步骤和排查思路。我会尽量用大白话把原理讲清楚同时给出完整的命令行操作保证你看完就能上手。2. swap 的本质它到底在解决什么问题2.1 物理内存不够时的缓冲垫先打个比方。物理内存就像你办公桌上的面积进程就是桌上的文件。桌子就那么大文件多了放不下怎么办你可以把暂时不看的文件先放到旁边的抽屉里等要用的时候再拿回来。swap 就是这个抽屉它位于磁盘上速度比内存慢得多但容量可以做得很大。Linux 的内存管理采用虚拟内存机制每个进程都以为自己拥有一整块连续的内存空间。当物理内存紧张时内核会把一些不常访问的内存页page写到 swap 空间腾出物理内存给更活跃的进程使用。这个过程叫换出swap out当进程再次访问这些页时再换入swap in回内存。整个机制对应用是透明的进程本身感知不到。关键点在于swap 不是用来提升性能的它是用来防止内存耗尽导致系统崩溃或进程被杀的。理解这一点后面很多决策就顺了。2.2 swap 的几种存在形式swap 在 Linux 上有两种常见形态选择哪种直接影响后续的启停操作方式。形式说明优点缺点swap 分区独立的分区类型为 Linux swap性能稳定不依赖文件系统创建后调整大小麻烦需要重新分区swap 文件普通文件通过 mkswap 格式化灵活随时可增可减性能略受文件系统影响需注意碎片早期大家习惯划一个独立分区因为机械硬盘时代分区连续性好性能有优势。现在 SSD 普及文件系统和裸设备的性能差距已经很小swap 文件的灵活性优势就凸显出来了。尤其是云服务器很多默认就是用 swap 文件扩容缩容都方便。提示如果你用的是 LVM 逻辑卷也可以创建 LV 作为 swap兼具灵活性和分区性能是折中方案。2.3 swappiness决定内核多积极使用 swapvm.swappiness是 swap 相关最重要的一个内核参数取值范围 0 到 100。它表示内核在回收内存时使用 swap 的倾向程度。值越高内核越倾向于把内存页换出到 swap值越低越倾向于保留在内存里必要时直接回收缓存。很多人误以为 swappiness0 就是完全禁用 swap这是错的。即使设为 0在内存极度紧张时内核仍然可能使用 swap只是积极性最低。真正禁用 swap 要用swapoff。不同场景的推荐值数据库服务器建议 1 到 10。数据库对延迟极其敏感宁可多用缓存也不愿换出。通用服务器建议 10 到 30。平衡内存利用和性能。桌面/开发机建议 60 左右默认值即可内存不够时能顶住。容器宿主机建议 0 到 10避免容器内存被换出导致抖动。这个值可以通过sysctl临时调整也可以写进配置文件持久化后面实操部分会详细讲。3. 查看当前 swap 状态先摸清家底再动手3.1 用 free 快速看全局最常用的命令就是free加上-h参数让数字带单位可读性更好。free -h输出大概长这样total used free shared buff/cache available Mem: 15Gi 12Gi 1.2Gi 300Mi 2.5Gi 2.1Gi Swap: 4.0Gi 512Mi 3.5Gi这里重点看 Swap 那一行。total 是 swap 总大小used 是已使用量free 是剩余量。如果 total 是 0说明当前系统没有启用任何 swap。available这一列也值得关注它表示在不使用 swap 的情况下还能给新进程分配多少内存。这个数字比 free 更有参考价值因为它把可回收的缓存也算进去了。3.2 用 swapon 看具体设备free只给总量想知道具体是哪个分区或文件在充当 swap用swapon命令。swapon --show或者老一点的写法swapon -s输出会列出每个 swap 设备的名称、类型、大小和已使用量。比如NAME TYPE SIZE USED PRIO /swapfile file 4G 512M -2 /dev/sda2 partition 2G 0B -3PRIO 是优先级数值越高越优先使用。多个 swap 设备时内核会先用在优先级高的设备上。如果优先级相同则会轮询使用类似 RAID0 的条带效果这在多块磁盘时能提升 swap 吞吐。3.3 用 /proc/swaps 看内核视角还有一个更底层的方式直接读内核暴露的接口cat /proc/swaps内容和swapon --show基本一致但这是内核实际识别的状态排查问题时更权威。有时候配置文件写了但没生效看这个文件就能确认。3.4 检查内存和 swap 的实时压力想知道 swap 到底有没有在被频繁读写可以用vmstat观察 si 和 so 两列。vmstat 1 5si 表示每秒从 swap 换入的内存页数so 表示每秒换出的页数。如果这两个值长期非零说明系统内存压力大正在频繁交换这时候性能大概率已经受影响了。单位是 KB如果 si/so 达到几万甚至几十万那基本可以确定内存严重不足。注意偶尔出现非零的 si/so 是正常的比如某个大进程刚启动时。关键是看是否持续。4. 创建 swap分区和文件两种方式4.1 创建 swap 文件推荐最灵活这是目前最常用的方式尤其适合云主机和容器环境。整个过程分几步创建文件、设置权限、格式化、启用、持久化。第一步用fallocate或dd创建一个指定大小的文件。fallocate速度更快因为它直接分配磁盘块不实际写入数据。sudo fallocate -l 4G /swapfile如果文件系统不支持fallocate比如某些老旧的 ext3 或特殊文件系统用dd兜底sudo dd if/dev/zero of/swapfile bs1M count4096bs1M count4096就是 4096 个 1MB 块合计 4GB。dd会实际写入零所以慢一些但兼容性最好。第二步设置权限。swap 文件里可能包含敏感的内存数据必须限制访问。sudo chmod 600 /swapfile第三步格式化为 swap。sudo mkswap /swapfile输出会显示 UUID 和大小确认无误。第四步启用。sudo swapon /swapfile第五步验证。swapon --show free -h第六步持久化。编辑/etc/fstab加一行/swapfile none swap sw 0 0这样重启后会自动挂载。注意不要写错字段否则可能导致开机失败。4.2 创建 swap 分区如果是在裸机或虚拟机上还有未分配的空间可以划一个分区出来。用fdisk或parted操作。sudo fdisk /dev/sdb进入交互界面后依次按n新建分区p选主分区设置起止扇区然后按t把分区类型改成82Linux swap最后w保存。分区创建后格式化和启用sudo mkswap /dev/sdb1 sudo swapon /dev/sdb1持久化同样写进/etc/fstab/dev/sdb1 none swap sw 0 0提示分区方式一旦确定调整大小比较麻烦需要删除重建。所以规划时留点余量。4.3 swap 大小怎么定这是个老生常谈的问题。传统建议是物理内存小于 2GB 时swap 设为内存的 2 倍2GB 到 8GB 时设为等于内存大于 8GB 时设为 4GB 到 8GB。但这套规则来自内存昂贵的年代现在参考价值有限。更实际的判断依据是否要休眠hibernate如果要支持休眠swap 必须大于等于物理内存因为休眠时要把整个内存内容写入 swap。内存是否经常吃紧如果监控显示内存长期在 80% 以上swap 可以给大一点比如内存的 50% 到 100%。是否有大内存机器128GB 以上的机器swap 给 8GB 到 16GB 通常够用主要作为应急缓冲。容器环境容器一般不单独配 swap由宿主机统一管理。我个人的习惯是通用服务器给 4GB 到 8GB数据库服务器给 2GB 到 4GB 并调低 swappiness桌面机给内存的一半。这个没有标准答案结合监控数据调整最靠谱。5. 启停 swap命令、顺序和注意事项5.1 启用单个 swap 设备启用用swapon后面跟设备路径或文件路径。sudo swapon /swapfile sudo swapon /dev/sdb1如果想一次启用/etc/fstab里所有 swap 条目可以用sudo swapon -a这个命令在开机脚本里会调用手动执行时也会读取 fstab把没启用的都启用。5.2 停用 swap 设备停用用swapoff同样跟路径。sudo swapoff /swapfile sudo swapoff /dev/sdb1停用所有sudo swapoff -a这里有个关键点停用 swap 时内核需要把 swap 里所有已使用的页换回物理内存。如果物理内存不够这个操作会失败甚至触发 OOM。所以停用前一定要确认内存有足够余量。可以先看free -h如果 swap used 比较大而物理内存 free 很小贸然swapoff风险很高。稳妥做法是先释放缓存、停掉非核心服务或者分批停用。5.3 调整 swap 优先级多个 swap 设备时可以用-p指定优先级。sudo swapon -p 10 /dev/sdb1 sudo swapon -p 5 /swapfile优先级高的先用。如果想让两块盘并行分担 swap 压力设成相同优先级即可。持久化优先级要写在 fstab 的 options 字段/dev/sdb1 none swap sw,pri10 0 0 /swapfile none swap sw,pri5 0 05.4 修改 swap 大小的完整流程假设原来的 swap 文件是 2GB想扩到 8GB。步骤是先停用删除旧文件创建新文件格式化启用。sudo swapoff /swapfile sudo rm /swapfile sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfilefstab 里的条目不用改因为路径没变。最后free -h确认新大小生效。注意停用前务必确认内存够用否则可能卡死。生产环境建议在低峰期操作并提前准备好回滚方案。6. 内核参数调优让 swap 用得更聪明6.1 调整 swappiness临时调整sudo sysctl vm.swappiness10持久化写入/etc/sysctl.conf或/etc/sysctl.d/下的配置文件vm.swappiness 10然后执行sudo sysctl -p生效。前面说过数据库服务器建议调低通用服务器适中。这个值不是一成不变的可以结合监控动态调整。比如发现 si/so 频繁但内存还有余量说明 swappiness 偏高可以降一点。6.2 调整 vfs_cache_pressure这个参数控制内核回收 inode 和 dentry 缓存的倾向默认 100。值越高越倾向于回收缓存值越低越倾向于保留。对于文件访问密集的服务适当调低比如 50能提升缓存命中率间接减少 swap 压力。sudo sysctl vm.vfs_cache_pressure506.3 调整 min_free_kbytes这个参数决定内核保留的最小空闲内存。值太小内存回收不及时容易触发直接回收导致卡顿值太大又浪费内存。默认值由内核根据内存大小自动计算一般不用动。特殊场景下可以微调比如内存很大的机器适当调大避免突发分配失败。cat /proc/sys/vm/min_free_kbytes6.4 关闭 swap 的几种场景有些场景确实建议关闭 swapKubernetes 节点kubelet 默认要求关闭 swap否则调度和资源计算会不准。新版本虽然支持 swap但配置复杂多数生产环境仍关闭。高性能数据库如某些内存数据库宁可 OOM 也不愿换出导致延迟抖动。实时性要求高的服务swap 换入换出的延迟不可控会影响响应时间。关闭方法就是swapoff -a然后注释掉 fstab 里的 swap 条目防止重启后恢复。7. 常见问题与排查技巧实录7.1 swap 没生效free 显示为 0可能原因有几个一是 fstab 写错字段不对或路径不对二是文件权限不对mkswap 后没 chmod 600三是文件系统不支持比如某些网络文件系统四是 SELinux 或 AppArmor 拦截。排查顺序先swapon --show看有没有识别再看dmesg | tail有没有报错然后检查 fstab 语法最后确认权限和文件系统类型。7.2 swapoff 卡住或失败多半是内存不够内核无法把 swap 里的页换回。解决办法先释放缓存echo 3 /proc/sys/vm/drop_caches停掉非核心服务或者分批停用多个 swap 设备。如果实在不行只能重启。7.3 swap 使用率居高不下说明内存长期不足。短期可以调大 swap 或调低 swappiness 缓解但根本解决要么加内存要么优化应用内存占用。用smem或ps aux --sort-rss找出吃内存大户。7.4 系统变慢但 CPU 不高这很可能是 swap 抖动。用vmstat 1看 si/so如果持续很高基本可以确定。进一步用iotop看磁盘 IOswap 设备的读写会很明显。解决办法是加内存或减少内存占用。7.5 常见问题速查表现象可能原因排查命令解决方向swap total 为 0未创建或未启用swapon --show创建并启用swapoff 失败内存不足free -h释放内存或分批停用si/so 持续高内存压力大vmstat 1加内存或调优开机 swap 未挂载fstab 错误dmesg修正 fstabswap 文件权限错误未 chmod 600ls -l重新设置权限提示排查 swap 问题时养成先看free -h、再看swapon --show、最后看dmesg的习惯大部分问题能快速定位。8. 实操心得与避坑经验8.1 云主机上的 swap 陷阱很多云厂商的默认镜像是不带 swap 的尤其是高内存机型。原因之一是云盘 IO 有额外计费频繁 swap 会产生成本。另一个原因是云厂商希望用户通过升配解决内存问题。所以拿到云主机后第一件事就是确认 swap 状态按需创建。另外云主机的系统盘通常不大创建 swap 文件时注意别把根分区撑满。建议单独挂一块数据盘做 swap或者控制文件大小。8.2 容器环境的 swap 处理Docker 默认容器可以使用宿主机的 swap但可以通过--memory-swap限制。Kubernetes 则默认禁用 swap。在容器里跑内存敏感服务时要特别注意宿主机 swap 的状态避免容器内存被换出导致性能抖动。如果宿主机 swap 很大而 swappiness 又高容器里的进程可能被换出表现为响应变慢但 CPU 不高。这时候调低宿主机 swappiness 或给容器设置内存限制更有效。8.3 SSD 寿命的顾虑有人担心 swap 频繁读写会缩短 SSD 寿命。实际上现代 SSD 的写入寿命TBW都很高正常 swap 使用量远达不到损耗阈值。真正伤 SSD 的是持续大量写入比如日志或数据库。swap 的写入量通常很小除非内存严重不足导致持续交换那种情况下性能问题比寿命问题更紧迫。8.4 监控 swap 的实用指标生产环境建议监控这几个指标swap 使用率、si/so 速率、swappiness 当前值、OOM 事件次数。swap 使用率持续超过 50% 就值得关注si/so 持续非零说明内存有压力OOM 事件则说明已经出过问题。可以用sar -S看历史 swap 使用用sar -W看换入换出速率。这些数据对容量规划很有价值。8.5 一个容易忽略的细节/etc/fstab里 swap 条目的 options 字段很多人只写sw其实还可以加nofail。这样即使 swap 设备不存在开机也不会卡住。对于云主机或经常调整磁盘的环境这个选项很实用。/swapfile none swap sw,nofail 0 0另外如果 swap 文件所在的分区是 XFSfallocate创建的文件可能有问题建议用dd。这是 XFS 的一个已知特性创建 swap 文件时要注意。8.6 关于 swappiness 的一个误区网上很多文章说 swappiness0 就是禁用 swap这是不准确的。前面提过0 只是最低倾向内核在必要时仍会使用 swap。真正禁用要用 swapoff。而且某些内核版本对 swappiness0 的处理有差异极端情况下可能导致 OOM 行为变化。所以如果目的是禁用 swap直接 swapoff 更明确。8.7 调整 swap 后的验证清单每次调整 swap 后建议按这个清单验证一遍free -h确认总量和可用量。swapon --show确认设备列表和优先级。cat /proc/swaps确认内核识别。sysctl vm.swappiness确认参数生效。重启一次确认持久化配置正确。这套流程走下来基本能覆盖所有配置点避免遗漏。9. 写在最后的一点个人体会swap 这个东西说简单也简单创建、启用、调参几条命令的事说复杂也复杂涉及内存管理、性能权衡、场景适配每个决策背后都有取舍。我自己的经验是不要迷信任何一种教条什么“必须开”或“必须关”都是片面的。关键是理解它的工作原理然后结合自己的业务特点、硬件配置和监控数据来做判断。对于大多数通用服务器开一个适中的 swap把 swappiness 调到 10 到 30基本就能兼顾稳定性和性能。数据库和容器节点则要更保守一些。至于那些内存充足、延迟敏感的服务关掉 swap 也完全合理。没有银弹只有适合当前场景的方案。最后分享一个小技巧如果你不确定该不该开 swap可以先开一个小一点的比如 2GB然后观察一段时间 si/so 和内存使用率。如果 swap 几乎没被用过说明内存充足开不开无所谓如果 swap 用得很多那要么加内存要么优化应用swap 只是给你争取时间的缓冲。数据不会骗人让监控说话比拍脑袋靠谱得多。

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

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

免费获取报价 →
↑