ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Linux swap配置实战:分区与文件两种方式及避坑指南

Linux swap配置实战:分区与文件两种方式及避坑指南 前段时间帮朋友排查一台云服务器的问题现象是内存占用持续走高服务响应变慢最后直接把进程给 OOM 干掉了。登录上去一看swap 空间压根就没配。其实这类场景在 Linux 运维中太常见了——很多人要么完全忽略 swap要么只会跟着教程敲几条命令配完就再也没管过。今天就把 swap 分区的创建和使用一次性讲透包括我最推荐的两种创建方式以及很多人配置完才发现的各种坑。这篇文章适合谁看不管你是刚接触 Linux 的小白还是已经管着几十台服务器的运维只要你想搞明白 swap 到底怎么配、配多大、用哪种方式并且不希望在关键时刻被内存问题搞得焦头烂额那这篇文章应该能帮到你。我会从原理讲起穿插实际操作命令和踩坑记录尽量做到让你看完就能直接照着做。1. swap到底在解决什么问题我见过的三种典型场景1.1 swap的底层机制物理内存不够时的换页兜底先把概念捋清楚。swap 在中文里常被翻译成“交换空间”本质上就是一块磁盘空间被内核当成内存的扩展来用。当物理内存不够的时候内核会把内存里那些“暂时用不到”的内存页——比如某个进程已经分配了但很久没访问的数据——写到磁盘上的 swap 空间里腾出物理内存给真正活跃的程序用。这个过程叫 swap out。等程序需要用到那些数据时再从磁盘读回内存叫 swap in。这就好比你办公室工位物理内存坐满了人但有些人虽然占着座位实际上在玩手机摸鱼。这时候来了一批真正要干活的同事你总不能让他们站着吧于是你把摸鱼的人请到休息区swap先坐着把工位让给干活的人。等摸鱼的人真要干活了再让他回来。这个比喻虽然简单但足够说明 swap 的价值它不是用来无限制扩内存的而是给内存压力兜底用的避免系统在最需要内存的那一刻直接崩溃。swap 和虚拟内存不是一回事很多人把这两个概念混着用。虚拟内存是操作系统的内存管理抽象每个进程看到一片连续地址空间背后由物理内存和磁盘文件共同支撑而 swap 只是虚拟内存体系中负责“换出”的那部分磁盘后备。理解到这一层就够了日常运维我们直接关心 swap 的分配、启用和监控。1.2 三种必须考虑配置 swap 的业务场景根据我自己的运维经验以下几种场景你最好老老实实把 swap 配上物理内存本来就小的机器。比如 1GB 或 2GB 内存的云主机跑个 MySQL、Redis、Java 应用内存很容易见底。没有 swap 做缓冲系统会直接触发 OOM killer把最吃内存的进程给杀了。轻则服务中断重则数据损坏。存在内存突发峰值的应用。典型的是 Java 应用JVM 堆内存设置不合理时GC 前会出现明显的瞬时内存飙升还有构建服务器Jenkins、GitLab CI Runner在编译大型项目时内存高峰往往几倍于平时。有 swap 在系统能扛过这一波等进程自己把内存释放。需要支持休眠suspend to disk的设备。笔记本或部分服务器配置了休眠功能时内核会把整个内存镜像写入 swap 分区醒过来再读回。这种场景下 swap 大小必须不小于物理内存否则休眠会失败。虽然多数服务器不靠休眠但少部分私有云节点有这个需求。反过来也有可以不配 swap 的场景。比如高性能计算和数据库主节点这类环境追求极致的稳定和可预测的延迟一旦 swap 介入磁盘 IO 会成为明显的瓶颈反而拖垮性能。这类机器通常靠加大物理内存、优化内存分配策略来解决问题而不是靠 swap。1.3 swap大小怎么定别再套老一套的双倍内存规则早些年流行一个说法swap 大小 物理内存 × 2。这个规则在小内存时代姑且合理现在内存动辄 16GB、32GB、64GB你要是还按 2 倍去分配等于白白浪费一整块磁盘空间而且绝大多数场景根本用不上那么多。我建议参考以下思路结合发行版的官方建议来定物理内存大小推荐 swap 大小无休眠需求推荐 swap 大小有休眠需求2GB 以下内存的 1~2 倍内存的 1.5~2 倍2GB ~ 8GB等于或略大于内存内存的 1~1.5 倍8GB ~ 32GB4GB ~ 8GB略大于内存建议单独休眠分区32GB 以上2GB ~ 4GB甚至可以不要单独划分大小等于内存的休眠分区上面只是起步参考。更合理的做法是看你的实际工作负载观察系统的free -h和vmstat输出如果内存长期 70% 以下swap 配小一点甚至不配都行如果内存经常飙到 90% 以上swap 稍大点能救命。我自己在 16GB 内存的云主机上习惯配 2GB swap作用是“兜底”不是“扩容”。如果发现 swap 经常被用到很多那说明物理内存真的不够正确做法是升配内存而不是无限加大 swap。2. 分区方式创建swap用fdisk从磁盘切一块独立空间出来2.1 分区前先想清楚磁盘规划与分区工具选择创建 swap 的第一种方式是直接分一个磁盘分区出来专门当 swap 用。这种方式比较传统好处是 swap 区域位于磁盘的固定位置即使磁盘碎片化严重swap 区也不会受影响。在裸金属服务器和传统物理机上我一直推荐这种方式因为它足够稳定而且和系统盘、数据盘互不干扰。动手前要想清楚三件事要分哪个磁盘。可以是系统盘剩余空间也可以是独立的第二块数据盘甚至一整块磁盘做 swap。用lsblk看下磁盘现状再决定。分区类型 ID。Linux 环境下的 swap 分区在 MBR 磁盘上标识为82如果使用 GPT 分区表新版的 fdisk/gdisk 会用Linux swap这个名称自动标识。分区类型设置不对虽然部分系统也能识别但会造成管理混乱还是规范点好。操作不可逆。分区表修改属于危险操作能不丢数据就尽量别丢。操作前确认磁盘上没有重要数据或者已经做过备份。分区工具有很多fdisk 适合小磁盘、MBR 分区表gdisk 适合 2TB 以上磁盘和 GPTparted 可以脚本化操作。云环境里我一般先用lsblk和blkid看清楚磁盘是什么分区表类型再决定用哪个工具。2.2 fdisk创建分区并修改分区类型为82这里我用一块/dev/sdb的磁盘来演示假设它是一块用于扩展存储的空盘或者包含不需要保留的数据。目标是分出一个 2GB 的分区作为 swap。# 查看当前磁盘和分区情况 lsblk # 进入 fdisk 交互模式对 /dev/sdb 进行操作 fdisk /dev/sdb进入 fdisk 后是一系列交互操作Command (m for help): n # 新建分区 Partition number (1-4): 1 # 输入分区号 First sector (2048-209715199, default 2048): # 直接回车取默认 Last sector, sectors or size{K,M,G} (...): 2G # 指定分区大小 Command (m for help): t # 修改分区类型 Selected partition 1 # 选择刚才的分区 Hex code (type L to list all codes): 82 # 82 是 Linux swap Command (m for help): p # 打印分区表确认 Command (m for help): w # 写入并退出如果你用的是 GPT 分区表的磁盘fdisk 里改类型的命令也是t但提示的代码可能显示为Linux swap比如输入19或直接用名字挑。因为 fdisk 版本不同交互略有差异但大方向一致。分区建好后让内核重新读取分区表partprobe /dev/sdb如果是在已有系统盘上操作这一步尤其重要。不执行的话内核可能还没看到新分区导致后面 mkswap 找不到设备。2.3 mkswap格式化与swapon启用的完整命令分区只是划好了地皮还得在上面格式化。格式化 swap 的命令是mkswap# 将分区格式化为 swap 文件系统 mkswap /dev/sdb1 # 查看格式化后的结果会显示 UUID 和大小格式化完成后直接启用# 启用 swap 分区 swapon /dev/sdb1 # 确认是否生效 swapon --show free -h到这一步swap 分区已经可用了free -h的 Swap 一栏会从 0 变成你分配的大小。注意这种启用方式是临时的重启系统后失效。要开机自动挂载还得写进/etc/fstab。2.4 持久化配置UUID与/etc/fstab以及开机自启验证/etc/fstab是 Linux 的静态文件系统挂载表开机时系统会读取它自动挂载。追加一行即可# 先获取 swap 分区的 UUID blkid /dev/sdb1输出类似/dev/sdb1: UUIDa1b2c3d4-1234-5678-abcd-1234567890ab TYPEswap然后编辑/etc/fstabvim /etc/fstab在文件末尾追加UUIDa1b2c3d4-1234-5678-abcd-1234567890ab swap swap defaults 0 0这里说几个关键点UUID 方式比直接写设备路径如/dev/sdb1更可靠。因为设备名在系统重启、新增磁盘时可能会变化而 UUID 唯一不变。四个字段分别是设备、挂载点swap 写成 swap、文件系统类型swap、挂载选项defaults。最后两个数字是 dump 和 fsck 检查开关swap 分区写0 0没有问题。编辑完成后务必执行swapon -a验证配置语法是否正确它能根据 fstab 把没启用的 swap 全部启用。如果这个命令报错说明 fstab 写错了赶紧改别等重启了才发现。验证完 fstab 配置正确后再用reboot或systemctl reboot重启机器然后执行free -h和swapon --show确认开机自动挂载已经生效。这一步是我每次配完 swap 必做的宁可多重启一次也不要在线上突然出问题。3. 文件方式创建swap不重分区的灵活办法3.1 什么时候选文件方式云主机不乱动磁盘时的首选第二种创建 swap 的方式是通过一个普通文件模拟成 swap 空间。这种方式的适用场景非常明确云主机/虚拟机上。大多数云主机的系统盘是云服务商下发好的数据盘可能需要自己挂载。有时候你只是临时需要一点 swap 空间或者磁盘上已经没有空闲分区可以调整了用文件方式最省事。不想动分区表。分区操作虽然不复杂但毕竟有风险尤其是不想影响现有数据布局时。文件方式只需要创建一个大文件不影响也不依赖任何分区结构。需要灵活调整大小。文件方式扩容、缩容都简单。想扩大就删掉重建或者加一个新文件不用重新分区。我在工作中给云服务器配 swap绝大部分情况都优先用文件方式。不是因为它比分区方式更“高级”而是因为它在风险可控的前提下解决了问题而且后续维护心智成本低。3.2 用dd还是fallocate创建文件性能和坑的区别创建 swap 文件有两种常用的系统工具dd和fallocate。它们的实现机制不同效果也有差异。先用dd# 创建一个 2GB 的空文件 dd if/dev/zero of/swapfile bs1M count2048 statusprogressdd是把/dev/zero无限零字节流逐块写入目标文件写多少算多少。这个命令的优点是它确实把数据写到了磁盘上生成的 swap 文件内容真实、没有空洞对后续 swap 使用的兼容性最好缺点是速度慢2GB 文件在普通机械硬盘上可能要等一会儿SSD 上相对快一些。再看fallocate# 用 fallocate 快速创建 2GB 文件 fallocate -l 2G /swapfilefallocate走的是文件系统的快速分配路径它直接在文件系统上为这个文件预留空间不需要逐字节写入所以速度非常快。但这里有个大坑部分文件系统不完全支持 fallocate 创建的 swap 文件。比如老版本的 ext4 直接在 swap 上可能会有问题而Btrfs 根本不能直接用 fallocate 创建 swap 文件需要特殊处理。在实际操作中如果你在 Btrfs 上执行mkswap /swapfile报错无法读取分区内容之类的大概率就是这个问题。所以我的建议是如果是云服务器的 ext4 或 xfs 文件系统fallocate通常没问题但如果你不确定文件系统类型或者遇到 mkswap 报错直接用 dd 重来一遍最稳妥。先用df -T /看下根文件系统的类型再决定用哪个命令。如果文件系统是 Btrfs需要在创建文件之前关闭 Copy-on-Write# Btrfs 上要先关闭 CoW chattr C /swapfile内核文档对 swap 文件的要求是“必须是普通文件不存在空洞且没有特殊属性影响 swap 页写入”。从稳定性的角度来说我默认给读者推荐dd因为它在任何文件系统上都最稳。3.3 mkswap文件并写入fstab的完整流程无论用哪种方式创建文件后续步骤是一样的。先设好权限再格式化并启用# 设置严格权限避免普通用户读取 swap 文件内容造成信息泄露 chmod 600 /swapfile # 格式化为 swap 文件 mkswap /swapfile # 启用 swapon /swapfile # 查看生效情况 swapon --show free -h第三步写入/etc/fstab时和分区方式有一点区别。因为文件没有 UUID也可以有但路径更直观我们可以直接写文件路径/swapfile none swap sw 0 0注意第三列是swap第四列我用的是sw这个选项的意思是“启用 swap”。有些教程里写defaults也能生效但我习惯写sw因为它语义更明确历史兼容性也更好。两种写法都能用不用太纠结。同样改完 fstab 后执行一次swapon -a验证配置。如果没有任何输出、没有报错基本就是没问题了。3.4 文件swap的删除与扩容操作步骤文件方式最方便的地方就是可以随时调整。我讲讲删除和扩容的完整流程这里有很多初学的朋友容易翻车。先看正确的关闭顺序# 关闭这个 swap 文件只针对 /swapfile swapoff /swapfile # 确认 swap 已经移除 swapon --show然后从/etc/fstab里删掉对应的一行最后再删除文件rm -f /swapfile这里有几个容易踩的坑如果你直接rm -f /swapfile而没先执行swapoff文件看起来删掉了但内核还在把它当 swap 用。因为内核持有的是 inode 引用不是文件名。这种状态很危险free -h显示 swap 还在用但磁盘上已经找不到这个文件了后续想关闭都难。我看到不止一个人在这个操作上翻车。如果系统当前内存压力很大swapoff /swapfile可能会非常慢甚至卡住。因为关闭 swap 意味着把 swap 里所有内容搬回物理内存物理内存不够时内核就会一直等待。这种情况下先想办法释放内存比如重启应用、杀掉持有大量内存的进程或者临时再加一块 swap再执行 swapoff。扩容的做法也简单假设你原来有 2GB想扩到 4GB。不用去改原文件直接再加一个新文件就行。或者干脆 swapoff 后删掉旧文件重新创建一个 4GB 的新文件再走一遍 mkswap、swapon。通常我倾向于新增第二个 swap 文件而不是反复折腾旧文件后面讲到多 swap 优先级时你就知道为什么了。4. 多swap并存时的优先级和日常监控4.1 swap优先级想让系统优先用哪个swap一台机器完全可以同时有多个 swap 空间比如一个是分区一个是文件。内核决定先往哪个 swap 里写数据靠的是优先级priority。优先级越高的 swap 空间会先被使用高优先级的写满了才会轮到低优先级的。优先级值是一个整数越大越优先。默认情况下所有 swap 的优先级都是负数大致由内核按启用顺序分配。设置优先级有两种方式。第一种启用时指定# 给 /dev/sdb1 设置优先级 100 swapon -p 100 /dev/sdb1 # 给 /swapfile 设置优先级 50 swapon -p 50 /swapfile第二种在/etc/fstab里配置UUIDa1b2c3d4-1234-5678-abcd-1234567890ab swap swap defaults,pri100 0 0 /swapfile none swap sw,pri50 0 0那什么时候需要设置优先级呢我举两个实际场景服务器同时有 SSD加速盘和 HDD数据盘。你想让内核优先用 SSD 上的 swap因为 SSD 快得多。那就在 SSD 上的 swap 设高优先级HDD 上的设低优先级。内核设计上推荐越快的设备优先级越高。想控制某些大内存应用先使用哪块扩展空间。虽然这种情况比较少见但知道怎么配总有用到的一天。4.2 查看swap状态的命令组合与输出解读日常巡检时我一般是一套命令组合着看# 第一组free free -h # 第二组swap 明细 swapon --show # 或老命令 cat /proc/swaps # 第三组实时内存交换情况 vmstat 1 5 # 第四组进程级别的 swap 占用需要 root for f in /proc/*/status; do awk /VmSwap|Name/{printf %s , $2} /VmSwap/{print $2} $f 2/dev/null; done | sort -k2 -rn | head -10我看到很多朋友只盯着free -h的 Swap used 那一栏。其实这里有个误区free -h只看“当前 swap 用了多少”并不代表“系统从开机到现在一共交换了多少数据”。要判断系统是否频繁交换应该看 vmstat 的si和so两列。vmstat 1 5输出的siswap in和soswap out表示每秒从 swap 读回内存和写入 swap 的数据量。如果这两个值持续很高说明内核在“颠簸”——一边往 swap 写一边又从 swap 读。这种状态非常伤性能因为磁盘和内存的速度差距摆在那里。这时候千万不要想着再加 swap而是应该查一查物理内存是不是真的不够了、哪个进程在疯狂吃内存或者某些内存参数设置是否合理。4.3 swap空间回收swapoff安全操作与内存不足处理swap 空间是可以回收的。我上面提过 swapoff 可能遇到内存不足卡死的情况这里展开讲讲怎么安全操作。当你执行swapoff /dev/sdb1时内核会尝试把该 swap 空间上所有内容搬回物理内存。如果物理内存空闲够用很快就完成。但如果你在内存快满的状态下执行内核会一直等待表现就是命令长时间卡住不动。安全的回收姿势# 先看当前内存使用情况 free -h # 建议先释放或清理一些大内存进程再执行 swapoff # 比如重启一下占用高的服务 systemctl restart mysqld # 或者先加一块临时的 swap 作为中转再执行 swapoff # 比如临时创建 swapfile fallocate -l 1G /temp_swap chmod 600 /temp_swap mkswap /temp_swap swapon /temp_swap # 执行目标 swap 的回收 swapoff /dev/sdb1 # 撤销临时 swap swapoff /temp_swap rm -f /temp_swap如果你的服务器上部署着 MySQL、Redis 这类不可轻易重启的进程我强烈建议用“临时 swap 中转”的方式而不是直接重启业务。为了回收一个 swap 把整个业务重启了那就得不偿失了。4.4 磁盘IO和swap性能为什么SSD和HDD上的swap体验完全不同这是个很实际的问题。swap 是在内存不够时的兜底但兜底并不意味着性能无损。内存访问速度以纳秒计SSD 以微秒计机械硬盘以毫秒计。如果 swap 落在机械硬盘上当内核频繁交换时你的系统会变得难以忍受地卡。我见过一个服务器因为内存不足又很不幸地把 swap 配在了一台旧机械硬盘上结果每次高峰期就卡成“假死”状态IO 使用率 100%CPU 大量时间在等待 IO。如果硬件条件允许务必把 swap 放到 SSD 上。NVMe SSD 的随机读写性能比机械硬盘高出一两个数量级swap 对延迟的影响会小很多。云服务器上如果你的数据盘是高效云盘/SSD 云盘而系统盘是普通的云盘尽量把 swap 文件放在 SSD 盘上。另外内核提供了vm.vfs_cache_pressure和vm.page-cluster这类参数会影响内核回收缓存和 swap 换页的倾向。对一般应用来说默认值已经不错了不建议为了调优而调优。先保证磁盘设备和 swap 位置合理比在后台参数上花心思要有效得多。5. 实战踩坑与调优从重启失效到swappiness参数5.1 开机不生效问题排查fstab、systemd、UUID配好 swap 以后重启完却发现 swap 没挂上。这是很多新手最常见的困惑也是我自己这些年踩过不少次的坑。我总结一下排查链路希望你遇到问题时能按这个顺序走。第一步先看 fstab 内容有没有语法错误grep swap /etc/fstab # 期望看到类似/swapfile none swap sw 0 0fstab 每一行的字段顺序是设备 | 挂载点 | 文件系统类型 | 选项 | dump | fsck。任何一列错位、忘写都可能导致开机时不生效。空格和 Tab 不能乱打建议每一列之间用空格或 Tab 分隔即可。第二步用findmnt --verify验证所有挂载点配置findmnt --verify --verbose这个命令会检查 fstab 里每一项挂载配置是否合法比人眼强很多。如果它对 swap 行报错说明 fstab 写的有问题。第三步确认是不是 systemd 相关的 swap unit 没生成或冲突了。现代 Linux 发行版使用 systemd它在开机时会读取 fstab 并生成.swap单元。你可以手动执行systemctl daemon-reload swapon -a如果swapon -a能正常启用交换空间但重启后还是失效那很可能是 systemd 没有正确识别 fstab 项。这时看一眼/etc/fstab里是否有多余空格或非 UTF-8 字符有些编辑器保存时会在行尾塞入奇怪的转义符这都会导致 systemd 解析失败。第四步检查是否 Secure Boot 或内核参数影响。个别定制内核或者云主机镜像会默认关闭 swap 支持这种情况比较少见但可以在/proc/swaps里看内核当前视图。反正记住一条swapon -a是检查 fstab 配置最直接的工具任何时候配完 fstab 都先跑一遍。5.2 swappiness参数的合理设置0/10/60/100到底怎么选vm.swappiness是控制内核使用 swap 积极程度的参数。它的范围是 0 到 100值越大内核越倾向于把不常用的内存页换到 swap 空间值越小越倾向于保留在物理内存。很多人看到网上说“为了提高性能把 swappiness 设为 0”于是不管三七二十一就改了。这个做法其实已经过时了而且在部分内核版本上还会带来副作用。新的内核Linux 5.8 之后的建议里swappiness 更准确的语义是“内核回收文件缓存和匿名内存swap 页的权重比”。把 swappiness 设成 0 确实会让内核尽量不用 swap但它的代价是内核会更激进地回收 page cache也就是文件缓存。每次读文件都要重新读磁盘对数据库这类依赖文件缓存的负载反而更不利。我的建议是根据场景来场景合理 swappiness原因普通云主机/开发机10 ~ 30内存压力大时允许适度 swap避免 OOMJava 应用服务器10 ~ 30避免 JVM 堆内存被换出影响 GC 停顿数据库MySQL/PostgreSQL1 ~ 10优先保留文件缓存减少 SQL 查询抖动高性能计算/低延迟场景0 ~ 1容忍 OOM也不希望 swap 导致延迟抖动临时生效sysctl vm.swappiness10永久生效写入/etc/sysctl.confvm.swappiness10配完执行sysctl -p载入。关于 swappiness 有一条经验非常关键如果你发现系统在物理内存明明还剩很多的情况下swap 就开始被大量使用你先把 swappiness 调低到 10 甚至 1。如果你发现系统内存余量很小、swap 也不用了反而是频繁触发 OOM那适当调高 swappiness让内核早点把冷页换出去。这里补充一个容易混淆的参数vm.vfs_cache_pressure它控制的是内核回收 inode 和 dentry 缓存的速度和 swap 是两回事。别混着调否则你会得到一份谁也看不懂的“魔改系统”。5.3 swap与OOM killer的关系swap越大会不会更安全聊 swap 就绕不开 OOM killer。很多人以为swap 配大了 OOM 就不会发生。这个直觉只对了一半。OOM killer 的触发逻辑是当系统物理内存和 swap 都用尽仍然无法满足内存分配请求时内核会选择一个“得分最高”的进程杀掉释放内存。所以 swap 越大系统的“缓冲垫”越厚OOM 触发的时间越晚。但是如果某个进程泄漏内存的速度非常快它完全可以在极短的时间内把内存和 swap 一起耗尽。这时候 swap 大只能延缓 OOM不能杜绝 OOM。换句话说swap 是缓冲不是解药。反过来swap 也不是越大越安全因为 swap 空间本身也要占用磁盘空间和内核管理开销。更大的 swap 还意味着 OOM 之前系统会经历更长的“颠簸期”这段时间服务性能会极其拉胯用户感受到的就是“卡死了”。所以我坚持一个理念swap 大小的设计目标是让系统在内存突发尖峰时扛过“一段时间”而不是让你把 swap 当内存用。如果你的业务经常吃满 swap正确的操作是加内存或优化应用内存使用而不是无限扩大 swap。另外说一句和 OOM 相关的还有一个参数vm.overcommit_memory它控制的是内核是否允许进程过度分配内存。在很多服务端应用上默认的0基于启发式拒绝明显过大的分配就挺好不建议乱调。如果特殊应用需要改到1或2务必先弄明白含义否则进程可能拿到“假内存”落地时反而触发 OOM。5.4 对swap使用的几个常见误区最后分享几个我常看到的认知偏差顺便说说我的实际操作判断。误区一只要看到 swap used 超过 0就觉得系统内存紧张。不一定。内核按自己的算法和 swappiness 参数来决定是否换页即使物理内存还有富余也可能会把一些冷页挪到 swap来优化整体内存效率。判断内存紧张要看物理内存的 available 和 vmstat 的 si/so单看 swap used 是不靠谱的。误区二swap 在 SSD 上就万无一失。SSD 的随机读写确实远好于 HDD但和内存比仍然差很多。而且频繁的 swap in/out 会加速 SSD 的写磨损虽然现在 SSD 寿命问题弱化了但延迟仍然是实打实的。所以 SSD 上配 swap 是“备而少用”不是让你天天疯狂交换。误区三配置 swap 可以替代监控。有些团队觉得配完 swap 就万事大吉放任内存一直涨。我在实际运维中看到的教训是swap 的基本职责是兜底你仍然需要监控内存水位、swap 使用率、进程内存占用。swap 使用率长时间持续走高本身就该是一个告警信号提示你该扩容或优化了。误区四分区 swap 一定比文件 swap 性能好。这个说法有一定历史背景但也得看文件系统。最初的 swap 文件因为可能存在碎片、文件系统层可能引入额外开销确实比分区慢。但现代内核2.6 之后对 swap 文件做了很多优化文件内尽量按连续块分配。配合 SSD文件 swap 的性能损失已经很小。至少在我自己服务器上分区 swap 和文件 swap 的差异几乎感觉不到。强烈建议不要把“性能”作为选型的主要理由而是看运维上的便利性。写在最后的一点个人经验说了这么多核心就是一句话swap 是个兜底机制不是性能加速器。最健康的 Linux 内存状态应该是“物理内存基本够用swap 常年躺枪但几乎没用”。如果你发现自己不得不频繁依赖 swap先审视业务部署和内存规划而不是急着加一块更大的 swap。配 swap 时我个人的习惯是能不动分区表就不动所以我大概率会用文件方式文件放在 Linux 根目录下命名为/swapfile或/swap.img。不能偷懒省略的步骤一个都别省先看系统磁盘类型和内存规模确定大小创建文件后立刻chmod 600mkswap 完先临时启用验证通过再写 fstab写完 fstab 跑一遍swapon -a和findmnt --verify必要的话重启确认。这套流程走下来基本上不会再被 swap 问题夜里叫醒。
返回列表