Nginx 「Too many open files」问题排查

这两天业务部门反馈流量下降的很厉害,我看了一下Nginx的日志,提示「768 worker_connections are not enough」,很明显768对于百万级的PV来说少了太多,打开nginx.conf将其中的连接数量从768更改到了65535。

隔了一小会,发现日志中这个错误已经消失,另外一个错误「Too many open files」又出现了。从字面来看,是服务器的句柄数量不足导致。查看一下nginx的配置

user root root;
# 1.
worker_processes auto; 
# 2.
worker_rlimit_nofile 65535;
...
events {
        use epoll;
		# 3.
        worker_connections 65535;
}
...

  1. worker_processes从自动获取变成了实际的服务器CPU核心数量
  2. 调整Nginx worker进程的最大打开文件数为65535
  3. 这个参数是用来控制Nginx单个进程所允许的客户端最大连接数。上面从768调整到了65535。在设置这个连接数量的时候,注意一点,进程的最大连接数受制于Linux系统进程的最大打开文件数限制

那么系统的最大连接数是多少呢?ulimit -a可以查看

> ulimit -a
...
open files                      (-n) 65536
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
...

如果open files 数量不够,通过ulimit -n xxx设置最大连接数。修改完Nginx配置后,nginx -s reload重启Nginx即可。