无名商城论坛

搜索
查看: 259|回复: 0

[其他技术] 【WD】浅谈日志中记录 too many open files

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32464
发表于 2022-5-8 15:12:38 | 显示全部楼层 |阅读模式

日志中记录too many open files 字样,导致打开网站、开启服务失败的原因以及解决方案:
1、文件句柄是什么?
        百度百科:
在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即文件句柄(file handle),该文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将文件句柄在内存中的地址和要拷贝的字节数传送给操作系统。当完成任务后,再通过调用系统函数来关闭该文件
2、为什么会报 too many open files?
默认情况下,Linux下默认的文件句柄是 1024,当服务器的并发高或者是打开的文件数量较多的时候,就会报 too many open files
查询:
ulimit  -n
复制代码

  
3、如何解决
修改进程打开的文件数量

1、临时解决方案:
ulimit -n 204800
复制代码

此方法不用重启服务器,当前环境变量下,临时生效,重启服务器后,无效
2、永久解决,需要修改/etc/security/limits.conf 文件
echo "* soft nofile 204800"  >> /etc/security/limits.conf
echo "* hard nofile 204800"  >> /etc/security/limits.conf
echo "* soft nproc 204800"  >> /etc/security/limits.conf
echo "* hard nproc 204800 "  >> /etc/security/limits.conf
复制代码

修改后,需要重启服务器,查看是否生效
ulimit -n
复制代码

上面修改的是一个进程打开的文件句柄数量,但是还需要修改系统的总限制才行。比如我们设置的每个进程打开文件句柄默认是1024个,但是系统限制的是500 ,最终一个进程打开的文件句柄数量也是 500
修改系统限制

1、临时解决方案:
echo  6553560 > /proc/sys/fs/file-max
复制代码

2、永久解决方案,需要重启生效:
echo   fs.file-max = 6553560  >> /etc/sysctl.conf
复制代码

查看是否生效:
sysctl -p
复制代码

知其然,也需知其所以然。如果您对本文有其他的建议和看法,请留言。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表