现场是这样的。MySQL 需要 vm.swappiness=10,运维直接 sysctl -w 改完业务正常,机器重启后又回到 60,/etc/sysctl.conf 里明明写了这一行,systemctl status systemd-sysctl 也没有报错。

中间走过弯路,把「配置文件里有语法错误,后面的行全部不生效」当成主因,改完现象没变。

把日志和配置对完,能解释这个现象的基本就这几处。参数写在了 /etc/sysctl.conf,但系统用的是 /etc/sysctl.d 下的文件且后者优先;文件权限不是 644,systemd-sysctl 直接跳过;某些参数在 systemd 之后被服务自己的启动脚本覆盖。

第一件事是确认参数来自哪个文件

sysctl --system 2>&1 | grep -B1 swappiness

然后把配置拆到独立文件并规范权限

echo 'vm.swappiness = 10' > /etc/sysctl.d/99-tuning.conf && chmod 644 /etc/sysctl.d/99-tuning.conf

整体加载并看有没有报错

sysctl --system | grep -iE 'error|swappiness'

末了重启服务单元并验证当前值

systemctl restart systemd-sysctl && sysctl vm.swappiness

手上没有现成的复现脚本,就照着线上请求手工拼了一个。

恢复的判定其实很直接。重启后 sysctl vm.swappiness 返回 10,sysctl --system 的输出里能看到 99-tuning.conf 被加载。

补一句。/etc/sysctl.conf 软链到 /etc/sysctl.d/99-sysctl.conf 的情况也常见,改之前先 ls -l 看清指向再动手。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189