现场是这样的。业务报句柄不足,运维把系统总上限调大后依旧报错,查下来进程自己的限制还停留在原来的值。

把日志和配置对完,能解释这个现象的基本就这几处。系统总上限和单进程上限是两套独立参数;调整后没有对所有服务生效;限制配置被服务的启动方式绕过。

第一件事是看系统级上限和已用数量

cat /proc/sys/fs/file-max /proc/sys/fs/file-nr

调大系统级上限

sysctl -w fs.file-max=2000000

给服务单独设进程级上限

systemctl set-property app.service LimitNOFILE=65535

末了核对进程实际限制

grep files /proc/$(pidof app)/limits

这台环境是别人交接的,不少默认值被动过,只能一项项核。

同事提醒我看一下最近一次发布,时间点确实对得上。

怎么算真的好了,看的是同一批现象。系统与进程两级上限都已放开,业务高峰不再出现句柄耗尽。

补一句。系统级上限是所有进程共享的,单进程设太大会挤占别人;按业务实际需要分级设置更稳妥。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189