too many open files(打开的文件过多)解决方法

这篇具有很好参考价值的文章主要介绍了too many open files(打开的文件过多)解决方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

https://www.cnblogs.com/conanwang/p/5818441.html

SU: failed to execute /bin/bash:系统中打开的文件过多文件使用后不应该关闭吗 为什么出现 too many open files,linux,tomcat,服务器,运维,java

一、产生原因

too many open files(打开的文件过多)是Linux系统中常见的错误,从字面意思上看就是说程序打开的文件数过多,不过这里的files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端口等等,所以有时候也可以叫做句柄(handle),这个错误通常也可以叫做句柄数超出系统限制。
引起的原因就是进程在某个时刻打开了超过系统限制的文件数量以及通讯链接数,通过命令ulimit -a可以查看当前系统设置的最大句柄数是多少:

[root@localhost ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 126906
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024  <==文件数
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 126906
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

open files那一行就代表系统目前允许单个进程打开的最大句柄数,这里是1024。
使用命令lsof -p 进程id可以查看单个进程所有打开的文件详情,使用命令lsof -p 进程id | wc -l可以统计进程打开了多少文件:

[tomcat@localhost bin]$ jps
3092 Bootstrap
3197 Jps
[tomcat@localhost bin]$ lsof -p 3092 | wc -l
108

以裸启动的tomcat为例,可以看到它目前打开了108个文件数,如果文件数过多使用lsof -p 进程id命令无法完全查看的话,可以使用lsof -p 进程id > openfiles.log将执行结果内容输出到日志文件中查看。

二、解决方法

1、增大允许打开的文件数——命令方式

ulimit -HSn 102400 //这只是在当前终端有效,退出之后,open files又变为默认值。当然也可以写到/etc/profile中,因为每次登录终端时,都会自动执行/etc/profile

ulimit -HSn 102400 临时终端生效,切换终端失败
[root@localhost 20221108]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 126906
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 126906
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@localhost 20221108]# 
[root@localhost 20221108]# ulimit -HSn 102400  
[root@localhost 20221108]# 
[root@localhost 20221108]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 126906
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 102400  
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 126906
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
2、增大允许打开的文件数——修改系统配置文件
2.1.修改file-max

/proc/sys/fs/file-max中指定了系统范围内所有进程可打开的文件句柄的数量限制

# echo  6553560 > /proc/sys/fs/file-max  //sysctl -w "fs.file-max=34166",前面2种重启机器后会恢复为默认值
或
# vim /etc/sysctl.conf, 加入以下内容,重启生效
fs.file-max = 6553560

fs.file-max = 6815744
fs.file-max指系统能够打开最大的文件句柄数
建议设置:fs.file-max=512processes=6.51024*1024=6.5MOracle系统内核参数、资源限制及ipcs相关命令总结

2.2.修改ulimit的open file,系统默认的ulimit对文件打开数量的限制是1024
# vim /etc/security/limits.conf  //加入以下配置,重启即可生效

#在最后加入  
* soft nofile 65535 
* hard nofile 65535

或者只加入
 * - nofile 8192

最前的 * 表示所有用户,可根据需要设置某一用户,例如
roy soft nofile 8192  
roy hard nofile 8192

注意”nofile”项有两个可能的限制措施。就是项下的hard和soft。 要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用”-“字符设定, 则hard和soft设定会同时被设定。

3、检查程序问题

如果你对你的程序有一定的解的话,应该对程序打开文件数(链接数)上限有一定的估算,如果感觉数字异常,请使用第一步的lsof -p 进程id > openfiles.log命令,获得当前占用句柄的全部详情进行分析,

1)打开的这些文件是不是都是必要的?
2)定位到打开这些文件的代码
3)是否程序操作了文件写入,但是没有进行正常关闭
4)是否程序进行了通讯,但是没有正常关闭(也就是没有超时结束的机制)

如果程序中存在这些问题的话,无论系统句柄数设置的多么大,随着时间的推移,也一定会占用完。

附录:

附录1.
为了让一个程序的open files数目扩大,可以在启动脚本前面加上ulimit -HSn 102400命令。但当程序是一个daemon时,可能这种方法无效,因为没有终端。

附录2.
如果某项服务已经启动,再动态调整ulimit是无效的,特别是涉及到线上业务就更麻烦了。
这时,可以考虑通过修改/proc/’程序pid’/limits来实现动态修改!!!文章来源地址https://www.toymoban.com/news/detail-596802.html

到了这里,关于too many open files(打开的文件过多)解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记一次Kafka 故障Too many open files问题

    查看日志发现,有kafka日志报错提示: 查看limit.conf文件,发现文件打开数设置的值也没问题,尝试增大值后,但就是提示Too many open files,报错就是文件打开数过多。 经不懈的百度百度,发现如下图两条关键信息; systemd 服务 模块 最大打开文件数默认为1024,查看其他没改动

    2024年02月13日
    浏览(46)
  • GATK BaseRecalibratorSpark 过程中因Too many open files终止

    Error: GATK BaseRecalibratorSpark 过程中因Too many open files终止 执行命令: 日志信息: 错误分析: GATK 集成的Spark运行过程中会打开多个文件,而我使用的服务器版RStudio的Terminal限制了打开的文件数量最多为4096 可以通过命令 ulimit -n 查看当前用户能打开的最多文件数量。 解决方法

    2024年02月13日
    浏览(39)
  • flink任务启动抛出mysql数据库连接过多异常message from server:“Too many connections“解决办法

    1. 异常现象 2. 现象分析 2.1 mysql数据库最大默认连接数是151 2.2 已用连接数超过了最大连接数导致的异常 3. 解决办法 3.1 修改mysql最大连接数配置文件 命令行修改最大连接数(max_connections),设置最大连接数为1000。 mysql set global max_connections = 1000; 这种方式有个问题,就是设置的最

    2024年02月14日
    浏览(54)
  • PostgreSQL 连接数过多报错(too many clients already)

    在使用 Navicat 连接 PostgreSQL 数据库时,突然遭遇到了一个报错:“FATAL: sorry, too many clients already”。这一错误提示表明数据库连接数已经达到上限,无法再创建新连接。为了解决这一问题,我采取了一系列查询和配置调整的步骤,从数据库和程序连接池两个方面入手。 数据库

    2024年02月21日
    浏览(42)
  • 解决TortoiseGit软件Git Show log时显示Too many files to display的问题

    有时代码提交修改的文件比较多,当查看log时无法显示出来修改的文件列表,如下所示: 将LogTooManyItemsThreshold尽可能配置得大一些。 https://gitlab.com/tortoisegit/tortoisegit/-/issues/3878

    2024年04月12日
    浏览(44)
  • MySQL提示“too many connections“的解决方法

     最近使用mysql8.0.23的时候连接数据库时发现提示报错,出现mysql too many connection 的异常。经过查询发现是mysql的系统自带的连接数太小,连接的线程超过系统配置导致出现错误。 1. 首先登录mysql终端,输入 show variables like \\\"max_connections\\\"; ,查看最大连接数。 修改最大连接数:

    2024年02月16日
    浏览(45)
  • Mysql报错:too many connections原因及解决方法

    1、原因是mysql连接数过多 解决方案: 1、linux登录mysql: 2、查看mysql允许的最大连接数 3、查看这次mysql服务启动到现在,同一时刻最多mysql有多少连接 4、修改mysql最大连接数 5、以上步骤修改后虽然能登录,但仍有隐患,我们应该把那些sleep的连接杀掉 (1)查看所有连接状态

    2024年02月10日
    浏览(59)
  • ElasticSearch|too_many_buckets_exception解决方法

    报错信息 ES 执行聚合查询时报错,报错信息如下: 原因定位 因为聚合查询的桶数超过了 ES 集群配置的最大桶数的上限。ES 聚合查询最大桶数的参数文档如下(地址): search.max_buckets (Dynamic, integer) Maximum number of aggregation buckets allowed in a single response. Defaults to 65,536. Requests t

    2024年02月04日
    浏览(40)
  • ssh 连接错误 Too many authentication failures 解决方法

    有时候使用 ssh 登录 或者 git ssh 方式连接 时会遇到: Too many authentication failures 这个错误的原因是客户端尝试连接次数大于服务端限制的次数。 默认情况下: ssh 客户端会按照认证顺序: 1. 依次尝试 ssh-agent 中的秘钥和配对~/.ssh 的秘钥对 2. 如果都失败了会尝试密码登录 如果

    2024年02月01日
    浏览(38)
  • Error connecting to MySQL: Too many connections(code 1040)的错误解决方法

    今天前端在调试接口时,报出 Too many connections 的错误。 于是,打开出 MySQL 数据库,报出的错误如下图所示: 即 Error connecting to MySQL: Too many connections(code 1040) 。 正赶上最近 ChatGPT 比较火,借助他来解决我的错误: ChatGPT 建议我增加 MySQL 的连接数,但首先通过如下命令查看连

    2024年02月03日
    浏览(93)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包