银河麒麟V10SP1Nginx代理转发故障socket() failed (24: Too many open files)修改操作系统ulimit值解决实战
一、事故描述
Nginx转发失败,转发代理服务器宕机!
翻看Nginx日志
/var/log/nginx
日志大量报错如下:
socket() failed (24: Too many open files) while connecting to upstream
这个是操作系统的openfiles值没有配置,达到了最大值,解决方法就是要调整操作系统的参数了!
ulimit 值过小,可能导致压力测试遇到瓶颈,比如通过nginx建立tcp长链接时,链接数量受限。需要修改ulimit值,Linux默认为1024。
Linux open files 限制什么?
在 Linux 中,“open files 限制”指的是对每个进程可以同时打开的文件数量的限制,也称为文件描述符限制。这个限制会影响到系统的性能和稳定性,如果设置太低可能会导致某些应用程序无法正常运行。
Linux 系统中的 open files 限制涉及到单个进程和系统总体两个方面:
单个进程的 open files 限制:可以使用 ulimit -n 命令查看当前用户进程可以同时打开的文件数限制。默认情况下,这个限制通常是 1024。要更改单个进程的文件描述符限制,可以使用 ulimit 命令。例如,执行 ulimit -n 10000 可将文件描述符限制设置为 10000,但这种更改通常只对当前会话生效。若要永久更改此限制,可以编辑 /etc/security/limits.conf 文件,添加类似如下的行:myuser hard nofile 10000 ,这将确保用户 myuser 在登录时可以同时打开最多 10000 个文件。其中,“soft nofile”表示软限制,即用户可以自行修改的最大值;“hard nofile”表示硬限制,是系统设定的最大值,软限制应小于等于硬限制。
系统总 open files 限制:通过查看 /proc/sys/fs/file-max 文件可以得知系统所有进程一共可以打开的文件数量。
当程序(特别是高并发或处理大量文件、网络连接的程序)需要打开的文件数量超过限制时,可能会出现“Too many open files”等错误。常见的解决方法是根据实际需求,适当增大文件描述符限制。但需要注意的是,修改这些参数可能会影响系统性能和稳定性,因此需要谨慎操作,并在修改前备份相关文件和数据。
二、解决方法步骤
(1)查看当前操作系统的配置值
ulimit -a
(2)调整参数
vi /etc/security/limits.conf
补下下面的内容:
# End of file
# open files (-n)
* soft nofile 20480
* hard nofile 20480
root soft nofile 20480
root hard nofile 20480
#
# # max user processes (-u)
* soft nproc 20480
* hard nproc 20480
root soft nproc 20480
root hard nproc 20480
关闭当前SSH会话,重新登录
在执行
ulimit -a
上图的没有配置值:
下图值已经变了!
(3)重启Nginx服务
systemctl start nginx.service #启动服务
再观察翻看日志是否还存在socket() failed (24: Too many open files)报错问题解决
/var/log/nginx
再观察翻看日志是否还存在socket() failed (24: Too many open files)报错问题解决!
当 Nginx 出现socket() failed (24: Too many open files) while connecting to upstream
错误时,通常是因为系统设置的可打开文件描述符数量限制过小,导致 Nginx 进程在尝试打开更多文件时遇到了限制。可以通过以下方法来解决:
-
修改系统的 ulimit 限制:
- 直接执行命令
ulimit -n 65535
,将同一时间最多可开启的文件数修改为 65535,可以根据自身情况适当调整该数值。但此方法只对当前 shell 有效,退出后失效。 - 若要永久生效,需要修改
/etc/security/limits.conf
文件,在底部加入以下配置:
* soft nproc 65535 * hard nproc 65535 * soft nofile 65535 * hard nofile 65535
其中,
*
代表全局;soft
表示软件限制;hard
表示硬件限制;nproc
是最大进程数;nofile
是最大文件打开数。修改后需要重启系统才能生效。 - 直接执行命令
-
修改 Nginx 的配置:在 Nginx 的主配置文件(通常是
nginx.conf
)中加入或修改以下行:worker_rlimit_nofile 65535;
然后重新加载 Nginx 配置,使修改生效,例如使用
nginx -s reload
命令。
worker_rlimit_nofile 参数用于为 Nginx 工作进程改变打开最多文件描述符数目的限制,可在不重启主进程的情况下增加限制。
修改系统文件描述符数量时,应根据实际情况进行调整,过大的数量可能会对系统性能造成影响。同时,还需注意检查 Nginx 上游服务器或相关服务是否存在异常,以确保问题得到彻底解决。如果问题仍然存在,可以进一步查看系统日志和相关指标,以确定是否还有其他潜在的问题。另外,也可以使用lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
命令查看当前系统打开的文件句柄情况,帮助分析是否有其他进程占用了过多的文件描述符。
额外方法
补充nginx的配置
vi /etc/nginx/nginx.conf
worker_rlimit_nofile 65535;
在 Nginx 配置中,worker_rlimit_nofile 65535;
用于指定一个 Nginx 进程可以打开的最多文件描述符数目。这里将其设置为 65535,表示每个 Nginx 进程最多可以同时打开 65535 个文件。
文件描述符是操作系统用于标识和跟踪打开文件或网络连接等资源的一种机制。当 Nginx 作为服务器处理大量并发连接时,它需要打开许多文件或连接,因此需要足够的文件描述符来支持这些操作。
user nginx ;
worker_processes 8;
error_log logs/nginx_error.log crit;
pid logs/nginx.pid;
worker_rlimit_nofile 65535; # 配置 worker 进程可以打开的最大描述符数目为 65535
events {
use epoll;
worker_connections 204800;
}
http {
include mime.types;
default_type application/octet-stream;
# 其他 http 相关的配置
}
Nginx这个值配置也是受限于操作系统的最大值,所以,还是先配置操作系统的比较靠谱!