ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux Swap分区添加、禁用与调优:从原理到实战避坑

Linux Swap分区添加、禁用与调优:从原理到实战避坑 前阵子帮一位做后端的朋友收拾他那台跑了三年的老服务器硬盘换了 NVMe内存从 16G 加到 64G硬件升级完他问我的第一句话是Swap 分区还要不要留着这个问题我被问过太多次了问的人里面有刚接触 Linux 的学生也有干了七八年的运维。有意思的是两边给的答案经常是相反的——新手怕删错东西老手往往一上来就swapoff -a然后清空 fstab。其实这两种做法都不算错前提是你得知道自己这台机器在干什么活。Swap 分区在 Linux 里叫交换空间Windows 那边习惯叫虚拟内存本质上都是把一部分磁盘空间当成内存的溢出缓冲区来用。它解决的是物理内存被吃满之后系统直接崩掉的问题同时也能让不常用的内存页腾出来给热点数据让路。这篇东西我打算把禁用、添加、修改 Swap 这三件事从头到尾讲清楚包括怎么看现状、怎么算大小、怎么改参数、怎么避开那几个经典的坑不管你是刚装完系统在配虚拟机还是在给生产服务器做调优都能直接照着操作。1. Swap分区到底是什么为什么到现在还有人纠结它1.1 从内存分配路径看Swap的真实角色很多人对 Swap 的理解停留在内存不够时拿来顶一顶这个说法不算错但太粗糙了。真实情况是Linux 的内存管理把物理内存切成一页一页通常 4KB内核有个叫页回收page reclaim的机制在后台跑。当空闲内存低于水位线时内核会开始找可以挪走的页面如果这页背后有文件比如可执行文件、mmap 的库直接丢弃需要时从磁盘重新读如果这页是匿名页比如 malloc 出来的堆、进程栈没地方落盘那就只能往 Swap 里写。所以 Swap 的真正价值有两个一是给匿名页提供一个临时存放点让内核在压力下有的选二是配合休眠hibernate功能把整个内存镜像落到 Swap 里再断电。这里有个关键点容易被忽略Swap 的读写速度远低于内存。哪怕你用 NVMe随机 4K 读也就几十万 IOPS 量级跟 DDR 的延迟差了三个数量级。所以一旦系统开始真·换页性能断崖式下跌几乎是必然的。那为什么还要留 Swap因为慢总比进程被 OOM Killer 一刀砍掉强。内核在内存耗尽时有两个选择要么杀掉占用最多的进程要么把冷页面换出去硬撑。对于数据库、构建服务这类进程被杀掉意味着事务中断、编译白跑换页只是慢。这个取舍才是留 Swap 的根本理由而不是简单的内存不够。还有一类场景必须留 Swap机器学习训练、视频渲染、大型 C 编译这类任务进程的峰值内存可能是常态的几倍但峰值只持续几分钟。给足物理内存成本太高留一块 Swap 兜住峰值是性价比很高的做法。我自己的编译机就留了 16G Swap平时使用率长期在 0.1% 以下只有在链接大型二进制的时候才动一动。1.2 什么场景必须动Swap什么场景最好别碰判断要不要动 Swap核心看两件事你的内存压力曲线是什么样的以及你的进程对延迟有多敏感。我给几个典型场景你可以直接对号入座。场景建议理由桌面开发机、内存 16G 以上留 4~8Gswappiness 调到 10~30兜住编译和浏览器峰值平时几乎不用数据库服务器MySQL/PG小 Swap 或禁用配合参数调优换页会引入不可控延迟尖刺Kubernetes 节点默认禁用kubelet 要求调度器按内存 request 分配Swap 会打破这个模型需要休眠的笔记本Swap 必须大于等于物理内存休眠要整份内存镜像容器宿主机宿主机可留少量容器限制用 cgroup靠 memory.swap.max 做隔离更精准内存 2G 以下的轻量 VPS强烈建议加一般给 1~2G不加很容易在装包时直接卡死我踩过最深的一次坑是在一台 2C4G 的云主机上跑 CI。当时觉得 4G 够用随手把 Swap 关了结果npm install拉一堆依赖的时候直接触发 OOMrunner 进程被杀任务失败但日志里啥也没留。后来加了 2G Swap同样的任务稳稳跑完虽然慢了几十秒但至少是成功的。所以禁用 Swap从来不是教条它是个基于场景的决定。反过来如果你的机器已经在持续换页了vmstat 1里si/so长期非零那说明内存确实不够加 Swap 只是缓解症状真正的解法还是加内存或者优化程序的内存占用。Swap 是缓冲垫不是扩容卡这个定位得摆正。2. 动手前先摸底把当前Swap状态看透2.1 四条命令看清Swap的真实使用情况动手改之前先花两分钟把现状摸清楚这能帮你少走很多弯路。第一条当然是free -h但它给的信息太浅只告诉你总量和已用量。真正有用的是下面这几条组合着看free -h swapon --show cat /proc/swaps grep -E SwapTotal|SwapFree|SwapCached /proc/meminfoswapon --show会列出每个激活的 Swap 设备包括类型file 还是 partition、大小、已用量和优先级PRIO。这一条最关键因为它能告诉你系统现在到底挂了几个 Swap是文件还是分区优先级各是多少。优先级高的先用优先级相同则轮询使用这个细节在多 Swap 场景下调优很有用。/proc/swaps给出的内容和swapon --show基本一致但它是原始数据脚本里解析用这个更稳。而/proc/meminfo里的SwapCached是个经常被忽略的指标它表示曾经被换出、但后来又被读回内存、同时 Swap 里还留着一份副本的页大小。这个值高说明系统在反复换入换出属于典型的内存真的不够信号。我一般的判断逻辑是这样先看SwapTotal是不是 0是 0 就说明压根没启用然后看SwapFree和SwapTotal的比例长期低于 50% 说明压力不小最后看si/so是否持续非零。三步下来基本能判断出这台机器是缺内存还是闲置 Swap 占地方。2.2 vm.swappiness决定内核多急着用Swap的那个旋钮vm.swappiness是这套体系里最有争议的一个参数取值 0~100默认 60。它的含义经常被误解为内存使用到 60% 就开始用 Swap这是错的。准确的说法是它控制内核在回收内存时倾向于回收文件页还是换出匿名页的相对权重。值越高内核越愿意把匿名页换出去值越低内核越倾向于丢弃文件缓存来腾空间。为什么这个区分重要因为文件缓存丢了可以重新读代价是磁盘 IO匿名页换出去再读回来也是磁盘 IO而且往往更随机。所以对于大多数服务器把 swappiness 调到 10 到 30 之间能让内核优先牺牲缓存而不是换出进程内存整体表现更平稳。我自己的经验是数据库机器给 1 到 10普通应用服务器给 20 到 40桌面机保持默认 60 也没太大问题。临时修改很简单sysctl vm.swappiness10立即生效重启失效。永久修改要写进/etc/sysctl.d/99-swap.conf这类文件里然后sysctl -p加载。这里有个不太常见的坑有些发行版的默认配置在/usr/lib/sysctl.d/里而/etc/sysctl.d/的加载顺序靠后所以你在/etc里的配置会覆盖它但文件名如果排序靠前可能被后面的覆盖。稳妥做法是文件名用99-开头。2.3 定位到底是哪个进程在吃Swap知道Swap 用了 3G和知道是哪个进程用的完全是两回事。定位方法我常用两个。第一个是遍历/proc/*/smaps统计写起来略麻烦但最准第二个简单粗暴直接用smem或者ps排序for f in /proc/*/status; do awk /^Name:/{n$2} /^VmSwap:/{if($20) print $2, n} $f done | sort -rn | head -20这条命令会把所有进程的 Swap 占用按大小排出来。实测在排查服务器莫名很卡的时候特别有效经常能发现某个 Java 进程吃了几百兆 Swap而它在top里按 RES 排序根本排不上号。因为top默认显示的是物理内存占用Swap 占用默认是不显示的那一列。还有一点值得说一个进程的 Swap 占用不是固定不变的它会随着访问模式变化被换入换出。所以你看VmSwap的时候看趋势比看快照更有意义连续采样几次再下结论。3. 添加Swap的两条路Swap文件与Swap分区3.1 方案选型文件、分区、zram、zswap怎么选要在 Linux 上加 Swap主流有四种做法各有各的适用面。Swap 分区是最传统的做法独立分区性能略好少了文件系统的间接层但扩容麻烦需要动分区表。Swap 文件是现在更常见的选择创建删除都方便扩容就是删了重建云主机基本都用这个方案Ubuntu 现在的默认安装也用的是/swap.img这个文件。zram是另一条完全不同的路子。它不占用磁盘而是在内存里划一块区域把要换出的页面压缩后存进去。压缩比通常在 2:1 到 3:1 之间相当于用 CPU 换内存。对于内存紧张的轻量 VPS 或者树莓派这类设备zram 的效果非常好。Debian 和 Fedora 现在都支持zram-generator一键配置。zswap则是内核层面的前端压缩缓存它不是独立的 Swap 设备而是挂在某个真实 Swap 设备前面的加速层页面先尝试压缩进内存池压缩失败或者池满了才写到真正的 Swap 设备。它需要在内核启动参数里开启。选型上我的建议很直接普通服务器和云主机用 Swap 文件简单可控内存小于 2G 的设备优先考虑 zram需要休眠的机器必须用真实 Swap 设备文件或分区都行但大小要够K8s 节点按 kubelet 的要求处理一般是不开。这几种方案也可以叠加比如 zram 打底加一个小的磁盘 Swap 兜底。3.2 用Swap文件扩容的标准流程这是最常用的一套操作我按顺序写清楚每一步都说明为什么。假设要创建一个 4G 的 Swap 文件放在根目录实际生产中更推荐放在独立的数据盘上避免和系统盘抢 IO。第一步是创建文件。这里有两种写法fallocate和dd性能差很多但行为不太一样# 方式一快但某些文件系统如 btrfs、部分 zfs上会创建空洞文件导致后续 mkswap 报错 sudo fallocate -l 4G /swapfile # 方式二慢但兼容性最好任何文件系统上都能用 sudo dd if/dev/zero of/swapfile bs1M count4096 statusprogressfallocate是直接分配块秒级完成dd是真的往磁盘写 4G 的零机械盘上要等一两分钟。我一般先用fallocate如果后面对不上再换dd。btrfs 用户注意即使 fallocate 成功也要执行chattr C /swapfile关闭 CoW否则 mkswap 大概率失败。第二步是权限。这一步看着小但漏了会直接导致启动失败sudo chmod 600 /swapfile sudo chown root:root /swapfile为什么必须是 600因为 Swap 文件里可能有进程内存的快照包含密码、密钥这类敏感数据如果被别人可读等于内存泄露。内核在swapon的时候会检查权限过于宽松会直接拒绝报insecure permissions之类的错。第三步格式化和启用sudo mkswap /swapfile sudo swapon /swapfile swapon --show free -hmkswap会往文件头部写入交换空间签名并生成一个 UUID。这里有个细节值得记住每次 mkswap 都会生成新的 UUID所以如果你在 fstab 里用 UUID 引用 Swap 文件重建之后必须同步更新否则重启会挂载失败。这是很多人在扩容 Swap 之后重启进不了系统的原因后面第 4 章会展开讲。3.3 划一块真正的Swap分区如果你的机器上还有未分配空间或者你就是偏好分区方案那流程是这样。先用lsblk和parted -l看清磁盘布局确认有空闲空间或者可以压缩的分区。假设要在/dev/sdb上新建一个 4G 的 Swap 分区sudo parted /dev/sdb # 在交互界面里依次执行 # (parted) mkpart primary linux-swap 0% 4G # (parted) set 1 swap on # (parted) quitparted里分区类型的写法在不同版本略有差异旧版本用mkpart primary linux-swap新版本可能是mkpart swap如果报错就按提示调整。分完之后内核可能还没刷新分区表可以sudo partprobe /dev/sdb或者干脆reboot生产环境慎用。接下来格式化和启用sudo mkswap /dev/sdb1 sudo swapon /dev/sdb1如果你用的是fdisk记得把分区类型改成82Linux swap虽然内核对类型码不太挑但工具链和后续维护会认这个标记。另外提一句 GPT 磁盘GPT 的分区类型 GUID 对 Swap 有专门的定义但同样不影响内核识别主要是给工具看的。分区方案的优势是性能略好、可以整块磁盘用劣势是扩容痛苦。我现在的习惯是只要不是有特殊性能要求都优先用 Swap 文件省心。3.4 Swap大小到底该给多少几种可落地的口径这个问题没有标准答案但有几套流传比较广的经验值可以参考。Red Hat 的官方建议是内存小于 2G 时给内存的 2 倍2G 到 8G 之间给等于内存大小8G 到 64G 之间给 4G 到 0.5 倍内存超过 64G 给 4G 就够。Ubuntu 的思路更保守一些桌面版历史上推荐等于内存加一点余量为了休眠服务器版给 1G 到 4G。但这些经验值都是十多年前定的那时候内存和磁盘的价格比跟现在完全不一样。我自己的算法更贴近实际先看这台机器会不会跑内存峰值远高于常态的任务会的话按峰值的 20% 到 30% 给不会的话给 2G 到 8G 兜底就行。比如一台常驻 8G、峰值 20G 的构建机我会给 4G Swap一台常驻 20G、峰值 24G 的数据库机我给 2G 甚至直接不开。还有一个硬性约束不能忘如果要支持休眠Swap 大小必须大于等于物理内存因为休眠时要把整份内存镜像写进去。这一点在处理笔记本的时候特别重要很多人内存加到 32G 之后发现休眠失效了就是因为原来的 Swap 只有 8G。最后提醒一句不要因为反正磁盘便宜就无脑给几百 G。Swap 太大有个隐性代价它会让 OOM Killer 触发得更晚系统可能长时间处于卡到不能用但也不崩的状态运维排查起来更痛苦。够用就好是这里的原则。4. 修改与调优让Swap按你的想法工作4.1 调整已有Swap大小的正确顺序扩容或者缩小 Swap顺序非常关键搞反了会出问题。正确顺序是先swapoff关闭再删除或重建文件最后swapon启用。绝对不能反过来也不能一边启用一边改文件内容。# 1. 先关闭 sudo swapoff /swapfile # 2. 确认已经关闭SwapTotal 应该减少了对应大小 free -h # 3. 删除旧文件重新创建想要的尺寸 sudo rm -f /swapfile sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile # 4. 重新启用 sudo swapon /swapfile这里最大的风险在第一步swapoff关闭 Swap 意味着要把 Swap 里所有还在用的页面读回物理内存。如果当前 Swap 用了 6G而物理内存只剩 2G 空闲swapoff会失败报Cannot allocate memory。遇到这种情况别硬来要么先加内存要么先杀掉一些不重要的进程腾出空间要么逐个 Swap 设备关闭多设备场景下。还有一点swapoff在繁忙系统上可能耗时很久因为它要逐页读回。我在一台 Swap 用了 10G 的机器上执行过一次花了将近两分钟期间 IO 打满。所以生产操作最好安排在低峰期并且提前准备好回滚方案。4.2 /etc/fstab 的写法与几个容易翻车的细节要让 Swap 开机自动挂载得写/etc/fstab。标准的两种写法是这样# 按设备路径写Swap 文件用这种 /swapfile none swap sw 0 0 # 按 UUID 写分区常用UUID 用 blkid 查 UUIDxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx none swap sw 0 0这里面有几个坑我得单独拎出来。第一个是UUID 会变每次mkswap都会重新生成 UUID所以如果你改了 Swap 分区大小并重新格式化fstab 里旧的 UUID 就失效了开机时会卡在等待 Swap 设备或者进入紧急模式。稳妥做法是改完立刻blkid确认新 UUID 并更新 fstab。第二个坑是加nofail参数。如果 Swap 是可有可无的比如你只是拿它兜底强烈建议写成/swapfile none swap sw,nofail 0 0nofail的含义是设备不存在也继续启动。没有这个参数一旦 Swap 文件被误删或者磁盘没挂上系统会直接进不了正常启动流程对于远程服务器来说这就等于失联只能走救援模式。这个参数救过我不止一次。第三个细节是pri优先级。多 Swap 设备时优先级数字大的先用。要指定就写成sw,pri10。同一优先级会做条带化性能略好但可能造成 SSD 磨损不均一般不建议。改完 fstab 之后别急着重启先用sudo mount -a或者sudo swapon -a验证一下语法能正常执行说明大概率没问题。这个习惯我建议每个人都养成因为 fstab 写错的代价实在太大。4.3 内核参数调优swappiness、vfs_cache_pressure与zswap除了 swappiness还有几个参数值得一起看。vm.vfs_cache_pressure控制内核对 dentry 和 inode 缓存的回收倾向默认 100。适当调高比如 150 到 200能让内核更积极地回收这些缓存把内存让给其他用途但调太高会导致文件系统元数据频繁重读反而变慢。这个参数我一般在文件数量特别多、内存又紧张的机器上调普通机器保持默认。vm.overcommit_memory也常被和 Swap 一起讨论。它控制内核对内存申请的过度承诺策略默认 0 表示启发式判断。改成 1 表示永远答应这在跑 Redis 这类会 fork 大量内存的进程时有用但风险是可能触发 OOM。除非明确知道自己在干什么否则别动它。如果要用 zswap配置方式是在内核启动参数里加# /etc/default/grub 里修改 GRUB_CMDLINE_LINUX_DEFAULT... zswap.enabled1 zswap.compressorlz4 zswap.max_pool_percent20然后sudo update-grub sudo reboot。压缩算法 lz4 速度快、压缩比一般zstd 压缩比更好但更吃 CPU可以按机器情况选。max_pool_percent是压缩池最多占物理内存的百分比给 10 到 25 之间比较常见。对容器场景更精准的控制在 cgroup v2 里memory.swap.max可以限制某个 cgroup 能用多少 Swap。这比全局调 swappiness 精确得多K8s 里就是通过这个机制做隔离的。如果你的机器上跑容器优先用这条路子。5. 禁用与删除Swap关得干净才算数5.1 临时禁用与永久禁用的区别禁用 Swap这个说法其实包含两个层次很多人只做了第一层就以为完事了重启之后发现 Swap 又回来了。临时禁用就是关掉当前会话重启后失效sudo swapoff -a swapon --show # 应该没有任何输出 free -h # SwapTotal 应该变成 0swapoff -a会关闭 fstab 和 /proc/swaps 里所有已知的 Swap 设备。永久禁用则要在临时禁用的基础上把 fstab 里的 Swap 条目注释掉或者删掉有些发行版还要检查/etc/initramfs-tools/conf.d/resume这个文件Debian/Ubuntu 系因为如果那里还写着 resume 设备启动时会重新激活。# 注释掉 fstab 里的 Swap 行 sudo sed -i.bak /\sswap\s/s/^/#/ /etc/fstab # Debian/Ubuntu 检查 resume 配置 cat /etc/initramfs-tools/conf.d/resume # 如果有内容且指向 SWAP 分区改成 RESUMEnone sudo update-initramfs -u还有一个地方容易漏某些发行版用 systemd 的 swap unitsystemctl list-units --typeswap能看到。如果看到有dev-sdb1.swap这类活动单元systemctl mask一下更保险。另外K8s 环境下禁用 Swap 是硬性要求kubelet 启动时会检查如果检测到 Swap 启用会直接拒绝启动。这时除了上面的操作还要确保没有 zram 之类的方案在偷偷启用 Swap。5.2 删掉Swap文件和分区把空间还回来如果确定不要 Swap 了可以把空间真正回收掉。Swap 文件的操作最简单sudo swapoff /swapfile sudo rm /swapfile sudo sed -i.bak /swapfile/d /etc/fstab执行完用df -h确认空间回来。要注意如果 Swap 文件是稀疏文件fallocate 创建的ls -lh显示的大小可能和实际占用不一致用du -h --apparent-size对比一下更准。删除 Swap 分区要复杂一些因为涉及分区表修改。安全顺序是先swapoff再用parted或fdisk删除分区然后partprobe刷新最后从 fstab 里移除条目。千万不要在分区还在用的时候直接删分区表那样会导致内核持有的块设备引用失效轻则报错重则 IO 卡死。如果是把 Swap 分区改作他用比如合并进相邻分区还要考虑 LVM 的情况。LVM 里的 Swap 逻辑卷可以直接lvremove但扩容根分区涉及的步骤更多lvextend、resize2fs操作前一定要备份重要数据。5.3 关掉Swap之后系统行为会发生哪些变化关掉 Swap 之后最直观的变化是 OOM Killer 会变得更活跃。以前内存压力大时内核会换出冷页面来拖延时间现在没地方可去只能直接杀进程。所以如果你的机器本来内存就紧张关 Swap 之后可能会发现进程偶尔莫名消失dmesg里能看到 OOM 记录。第二个变化是内存利用率会上升。原来被换出去的页面现在都留在物理内存里free -h里的 available 会减少。这在内存充足的机器上是好事缓存命中率更高在内存紧张的机器上就是灾难。第三个变化是延迟更稳定。这听起来矛盾但确实如此有 Swap 时如果系统突然开始换页会出现几百毫秒级别的延迟尖刺这种抖动对实时性要求高的服务很致命没有 Swap 时延迟是稳定的只是在内存耗尽时直接失败。所以我见过一些金融交易系统宁愿关 Swap 加严格的内存限制也不要那种不可预测的抖动。判断标准很简单如果你的服务对偶发长尾延迟容忍度低对进程重启容忍度高那可以关反过来如果你的服务是长时间跑批、编译、训练的任务被杀掉损失很大那就留着。没有绝对的对错。6. 踩坑实录与常见问题速查6.1 五个我真实踩过的坑坑一fallocate 生成的稀疏文件导致 mkswap 失败。在一台 btrfs 的机器上fallocate -l 4G /swapfile秒完成mkswap却报read swap header failed加-f强制也没用。原因是 btrfs 不支持在 fallocate 之后自动关闭 CoW。解法是先truncate -s 0清空再chattr C然后用dd写入。这个坑让我浪费了半小时最后在dmesg里看到 CoW 相关提示才反应过来。坑二改完 Swap 忘了更新 fstab 的 UUID。有一次给客户扩容 Swap 分区mkswap之后所有命令都正常swapon --show也漂亮。结果客户重启之后服务器起不来进紧急模式。原因就是 fstab 里还写着旧 UUID。从那以后我给自己定了个规矩任何涉及mkswap的操作最后一步必须是核对 fstab 或者加上nofail。坑三swapoff 时内存不够直接失败。在一台 Swap 用了 12G 的构建机上做扩容swapoff报Cannot allocate memory因为物理内存只剩 6G。最后是先停了几个不重要的 job又手动 drop 了缓存echo 3 /proc/sys/vm/drop_caches才勉强关掉。教训是关闭 Swap 前一定先看free -h确保空闲内存大于 Swap 已用量。坑四容器里 swapoff 把宿主机也影响了。早期在 Docker 容器里做实验容器里执行swapoff -a竟然影响到了宿主机因为默认共享了内核命名空间的关键部分。正确做法是用 cgroup 的memory.swap.max0做限制而不是在容器内直接操作全局 Swap。坑五误以为 swappiness0 就是完全禁用 Swap。这个误解流传很广。实际上 swappiness0 只是在还有文件缓存可回收时优先回收缓存当内存压力足够大、没有文件页可回收时内核依然会换出匿名页。真正禁用要用swapoff或者在 cgroup 里把 swap 限制设为 0。6.2 故障与命令速查表现象可能原因排查与解决swapon: /swapfile: read swap header failed文件是稀疏文件或 CoW 未关闭用 dd 重建btrfs 加 chattr Cswapon: /swapfile: insecure permissions 0644, 0600 suggested文件权限太宽chmod 600 /swapfile chown root:root重启后进紧急模式fstab 里 Swap 条目无效核对 UUID、加 nofail、用swapon -a预验证swapoff: Cannot allocate memory空闲内存不足先腾内存或加内存必要时逐个关闭Swap 用满但系统没 OOMswappiness 过高导致过早换出调低 swappiness检查内存是否真的够swapon --show为空但 fstab 有配置没设置自动启用或配置格式错检查 fstab 第四列是否为sw休眠功能失效Swap 小于物理内存扩到大于等于内存大小并配置 resume这张表里的每一条我都在真实环境里遇到过尤其是前三行属于每次换新机器都可能重演的经典问题。建议收藏下来遇到报错先对一遍。6.3 几条不太写在文档里的经验第一条是动手前一定备份 fstab。cp /etc/fstab /etc/fstab.bak这个动作花不到一秒但能救命。很多发行版的救援模式都支持手动挂载并改回 fstab但如果你连原始内容都不记得了恢复起来会很麻烦。第二条是在虚拟机里先演练一遍。改分区表、改 Swap 配置这类操作在 VirtualBox 或者云厂商的一次性实例上先跑一遍确认整个流程通了再到生产环境做。我现在的习惯是任何涉及磁盘的操作都在测试机走一遍全流程包括重启验证。第三条是别迷信网上的调优模板。网上流传的 sysctl 配置动辄几十行很多是从别的场景抄来的参数之间还可能冲突。我见过一份配置把 swappiness 设成 1 同时又把 overcommit_memory 设成 1这两个组合在一起在某些负载下会触发奇怪的 OOM。参数要一个一个加加完观察一两天再继续。第四条是记录你的变更。什么时候加了多少 Swap、swappiness 从多少改到多少、原因是什么写在运维日志里。Swap 这类配置的变更往往在几个月后才体现出问题没有记录的话根本无从追溯。我自己用的是最简单的文本文件每台机器一个比任何复杂系统都实用。最后分享一个我常用的小技巧判断一台机器是不是真的需要 Swap可以临时开一个小的 Swap 文件比如 1G观察一周内si/so是否有活动。如果一周下来这个 Swap 几乎没被用过那就说明内存充足可以考虑关掉如果经常有几十兆的换入换出说明峰值确实存在那就把 Swap 加到一个合理的尺寸并长期保留。这个方法比任何公式都靠谱因为它测的是你自己业务的真实行为。
返回列表