现场是这样的。CentOS 7.9 上按文档加了几个内核参数,执行 sysctl -p 报 sysctl: cannot stat /proc/sys/net/ipv4/tcp_abort_on_overflow: No such file or directory,参数根本没生效。
中间走过弯路,把「配置放在了 /etc/sysctl.conf 之外的文件,但没被 systemd-sysctl 读取」当成主因,改完现象没变。
把日志和配置对完,能解释这个现象的基本就这几处。参数名写错,内核里没有对应的 sysctl 节点;模块没加载,节点要等 modprobe 之后才出现在 /proc/sys 下;文件里用了等号两边的空格或者中文标点,解析直接跳过。
第一件事是确认节点是否存在
ls /proc/sys/net/ipv4/ | grep -i abort
随后加载对应模块再写参数
modprobe tcp_abort_on_overflow 2>/dev/null; sysctl -a | grep abort_on_overflow
然后放到标准目录并修正格式
printf 'net.ipv4.tcp_abort_on_overflow = 0\n' > /etc/sysctl.d/99-tcp.conf
等前面都确认过,再重新加载并逐条核对
sysctl --system 2>&1 | grep -i error; sysctl net.ipv4.tcp_abort_on_overflow
这类问题以前遇到过,但这次的触发条件和上次不一样。
这类改动我都写进变更记录,过两周再出问题时能对上号。
别只看报错消失,验证要多做一步。sysctl --system 不再输出 error,sysctl 读取该键返回设定值,/etc/sysctl.d 下的文件都能被正确解析。
提醒一点。sysctl -p 只读 /etc/sysctl.conf,drop-in 目录要用 sysctl --system;写参数前先用 sysctl -a 确认键存在。这类问题最好一次改到位,反复小改反而容易把原因搅混。
