
很多人问过我一个问题Linux 的 swap 交换分区到底设置多大才合适这个看似简单的问题坑过不少新手也坑过不少老手。我见过有人拿着一台 64G 内存的数据库服务器swap 还按老规矩划了 128G结果业务高峰时系统反而被 swap 拖垮也见过嵌入式设备上内存只有 1Gswap 干脆没配跑服务时直接 OOM Kill。今天就专门把这个话题聊透从 swap 的本质、不同场景的推荐值、到实际配置和故障排查一次说清楚。1. swap 到底是干什么的先搞清楚它在内存管理中的位置1.1 内存和 swap 的关系频繁被误读的细节swap 在 Linux 里的角色简单说就是一块“后备内存”当物理内存不够用或者内核觉得某些内存页“不活跃”时会把这些页的内容搬到磁盘上的交换空间里腾出物理内存给更需要的进程。很多人把 swap 理解成“内存不够时的应急仓库”这个说法基本对但不完整。实际上就算物理内存还有富余内核也可能主动把一部分冷数据换出这取决于系统的内存压力和vm.swappiness参数。这里要澄清一个常见的误解Linux 的内存使用率并不等于“物理内存耗尽率”。你看到free -h里 used 很高、available 很低并不代表马上就要用 swap因为 Linux 会尽量用空闲内存做缓存。真正触发 swap 的是内核根据内存紧缺程度计算出的压力值。当这个压力值超过一定阈值内核才开始回收内存页回收顺序是先回收缓存中的干净页再换出匿名页进程的堆栈数据等。所以 swap 使用量高往往意味着内存是真的紧张了而不是内核闲着没事乱用。1.2 什么情况下 swap 真的会被用到最典型的情况是物理内存不够用。内存占满后内核必须把部分进程的内存页换到磁盘否则新进程无法分配内存。这时候如果 swap 也没有内核就会启动 OOM Killer杀掉一些进程来释放内存。所以 swap 的底层意义是“最后一道防线”给系统多留一口气。第二种情况是内存碎片化。虽然总内存还有剩余但连续的大块内存无法分配内核也可能通过换出部分页面来整理内存。不过这种情况在现代 Linux 的伙伴系统里已经比较少见更多发生在内存压缩和 CMA 共存的环境里。第三种情况是系统休眠suspend-to-disk。如果你使用 sleep 或 hibernation 模式系统会把内存的全部镜像写入 swap 分区或 swap 文件然后关机。这时候 swap 大小必须大于内存大小否则休眠无法完成。这一点是很多人在桌面 Linux 上容易忽略的。还有第四种情况虽然不那么明显但非常重要内存压力下内核可以选择性回收。即使物理内存消耗在 90% 左右只要内核认为需要保持一定的空闲页面来应对突发分配它也会通过后台回收线程kswapd提前把部分页面换出。这也是为什么你有时候明明free -h显示还有几个 G 空闲但swapon -s却看到 swap 已经用了不少。这不是故障而是内核在预判性地做内存管理。2. 传统“swap 等于内存两倍”的公式是怎么来的现在还适用吗2.1 历史源头与物理服务器时代的逻辑很多人一定听过“swap 大小 内存大小的 2 倍”这个说法。这个建议在早期 Linux 时代非常流行甚至现在的很多安装教程里还在沿用。它是有历史背景的那时候服务器物理内存普遍只有 128M、256M、512M内存非常昂贵而磁盘相对便宜。swap 设置为内存的两倍是为了让系统在大内存压力下依然能跑起来不至于频繁 OOM。同时在物理内存故障或某些进程发生内存泄漏时swap 可以兜底给管理员留出排查和处置的时间。另一个原因和核心转储有关。早期系统中当程序崩溃时内核会生成 core dump 文件如果放到 swap 区域在进程退出后再转储到磁盘可以避免磁盘临时空间不足。这个功能现在已经基本不用了但“2 倍”的说法却一直传了下来导致很多人拿着一台 32G 内存的服务器愣是给它开了 64G swap结果磁盘被占用不说性能反而更差。2.2 现代服务器、云主机和桌面场景下的真实需求如今内存动辄几十 G、上百 G磁盘也变成了 SSD 或者 NVMe成本和性能特征都变了。swap 的无脑翻倍策略带来了三个问题第一浪费磁盘空间。64G 内存配 128G swap意味着拿一块不小的 SSD 空间去存放几乎用不到的冷数据空间白白浪费。对于按量计费的云服务器来说云盘成本是实打实的支出。第二性能损失放大。当内存压力大、swap 被大量使用时磁盘 IO 会成为新的瓶颈。尤其在机械硬盘上swap 的读写速度可能只有内存的万分之一触发 swap 后程序卡顿会非常明显。SSD 虽然快一些但频繁交换会消耗写入寿命。第三延迟敏感业务难以容忍 swap 带来的抖动。数据库、消息队列这类应用一次 swap 换入换出可能造成几十毫秒甚至上百毫秒的延迟比一次磁盘同步写还慢这在业务高峰期是不可接受的。所以现代环境下更合理的思考方式是不再追求“swap 多大”而是思考“这个系统允许出现多大程度的临时内存不足”。swap 不是越大越好也不是越小越好而是要跟业务特征、内存余量、磁盘性能综合匹配。3. 不同场景下的 swap 大小配置建议3.1 个人桌面与开发机平衡体验与空间如果你用的是个人电脑、笔记本或者开发机主要跑浏览器、IDE、容器、虚拟机等建议按以下范围配置内存小于 2Gswap 设置为内存的 2 倍能有效防止系统因内存不足而卡死。内存 2G 到 8Gswap 设置为内存的 1 倍到 1.5 倍兼顾休眠和临时内存压力。内存 8G 到 16Gswap 设置为内存的 0.5 倍到 1 倍即可比如 8G 内存配 8G swap。内存 16G 以上如果不用休眠功能swap 设置 8G 到 16G 就足够了甚至可以不用 swap只依赖 OOM Killer 来兜底。这里要注意桌面环境特殊之处在于“休眠”需求。如果你打算用系统的 suspend-to-disk 功能那么 swap 大小必须不小于内存大小否则休眠会失败。很多 Linux 发行版在安装时如果检测到你内存太大会自动创建一个和内存大小差不多的 swap 文件就是为了兼容休眠。如果你不需求休眠可以放心减少 swap。3.2 云主机与虚拟机谨慎预留避免 OOM云主机和虚拟机的情况比较微妙。很多云厂商会默认给实例配一个 swap 分区但大小往往很保守比如 2G 内存的机器只配 2G swap。我的建议是云主机不要完全关闭 swap但也不宜过大通常控制在内存的 0.5 倍到 1 倍之间。因为云主机上你往往无法再物理插入内存扩展条内存不足时唯一的兜底手段就是 swap。如果你在虚拟化平台上跑 Linux 虚拟机比如 PV