今天公司的 Kafka 突然挂了,上去检查状态如下:
可以看到异常的那行是:
这个错我们肯定知道是啥原因,就是文件描述符限制太低了呀,查看一下:
诶?怎么好像不是很低的样子,那为啥报错?
检查发现这个 65535
的值来源于 /etc/profile
中的这样一行:
也就是说在每次创建一个会话时都会执行这一行来设置当前会话下的 open files
的值为 65535
,但是目前 kafka 依旧报错了。。说明这个值是不是对 kafka 进程没有生效呢?
答案是肯定的,我们可以通过 /proc
伪文件系统查看 kafka 进程当前读取到的 open files
值:
上面的 17833
是 kafka 的进程号,通过这条命令可以实时看到 kafka 进程生效的 open files
值。
网上有很多常规的修改 open files
值的方法在这里都不合适,比如:
- 修改
/etc/security/limits.conf
,这种方式要重启系统,肯定是不适合正在运行的业务的; - 修改
/etc/profile
,这种方式就是我这原来使用的方式,它对通过 systemd 管理的进程是不生效的;
所以这里的解决办法是直接通过 systemd 来设置进程的 open files
限制,在 unit 文件中 Service
段下添加如下配置即可:
重启 kafka 服务,再次查看进程生效的 open files
值:
OK 啦。。
评论区