一、问题描述
今天使用 IDEA 连接 Apache Doris 的JDBC 的时候 频繁发生中断,报错如下:
Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
推断是网络出现问题没导致 无法收到 数据库服务器的响应,但是通过检查本地电脑到 服务器的 网络链接呢很稳定,并没有发现问题。想到 Doris 的 JDBC 端口是通过 NGINX 转发的 ,于是从排查 NGINX 日志着手,发现如下错误日志:
00:06:20 [alert] 949543#0: *10410607 socket() failed (24: Too many open files) while connecting to upstream, client: 10.xxx.xx.xxx, server: 0.0.0.0:9030, upstream: “192.168.xxx.xxx:9030”, bytes from/to client:0/0, bytes from/to upstream:0/0
二、问题定位
错误日志很明显, Too many open files 导致 socket连接中断,自然数据库连接失败。 Too many open files 是Linux 常见的错误,表示 程序打开的文件数太多(在linux中一切皆文件),当然在这里表示 打开的 socket 连接数。
三、问题分析
引发该 错误的原因是 Nginx 进程 打开的文件数(socket连接)超过了单个进程默认可以打开的句柄数上限。
如下图可以看到当前系统 单个进程默认可以打开的句柄数上限为 1024:
而此时Nginx 文件打开数远大于 1024
四、解决方案
4.1 通过修改系统的文件描述符限制来增加允许打开的文件数
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
4.2 调整Nginx的配置,增加worker_rlimit_nofile参数的值,并适当增加 worker_connections这个参数
- nginx.conf
worker_rlimit_nofile 65535;
events {
worker_connections 20480;
}
4.3 重启 Nginx
- nginx配置变更需要重启生效
- 文件描述符修改后需要退出当前shell重新进入才生效
systemctl restart nginx