起因
在对项目进行压测的时候,请求异常 java.net.SocketException: socket closed
,查看nginx代理服务器的日志。tail -f -n500 /var/log/nginx/error.log
显示 文件打开数太多socket() failed (24: Too many open files) while connecting to upstream
解决
通过查看linux系统限制命令ulimit 命令来查看系统文件限制
。
ulimit -Hn
ulimit -Sn
// 结果显示:1024,当前登陆用户不是root用户。
ulimit -Hn 是一个命令行命令,可以用来查看当前系统用户所能打开的最大文件描述符数量的硬限制。文件描述符是操作系统为了表示和操作文件而提供的一种机制,每个文件描述符都是一个非负整数,用来标识打开的文件或者管道。
-H 参数表示显示硬限制(hard limit),即系统管理员为当前用户设置的最大限制值。-n 参数表示显示文件描述符数量。通常情况下,硬限制是软限制(soft limit)的上限,也就是可以修改的最大。
-S 参数表示显示软限制(soft limit),即当前用户可以打开的文件描述符数量的默认值。-n 参数表示显示文件描述符数量。
软限制是当前用户可以打开的文件描述符数量的默认值,用户可以通过 ulimit -n 命令来查看和修改软限制。通常情况下,硬限制是软限制的上限,也就是可以修改的最大值。
如果想要修改软限制,一般可以使用 ulimit -n 命令进行修改。需要注意的是,软限制不能超过硬限制。如果软限制超过了硬限制,那么修改软限制时会失败。
编辑文件 /etc/security/limits.conf
修改用户打开文件数上限
* soft nofile 1048576
* hard nofile 1048576
⚠️ nginx服务器可以打开的文件数量受你操作系统的限制,编辑 /etc/sysctl.conf
fs.file-max = 6553560
最后 刷新文件配置
sysctl -p
当再次通过命令 ulimit -Sn
查看用户可以打开上限时,结果就是自己修改后的值。
⚠️ 如果是修改前的会话窗口 查看结果依然是 1024,可以重新打开一个窗口查看。
参考