Linux运维】报toomanyopenfile错误 什么情况怎么解决

2021-09-08 09:49发布

4条回答
欧文诺啊
2楼 · 2021-09-08 15:12

用ulimit -a命令查看目前系统的所有限制,ulimit -n查看open files的限制

其中“open files (-n) 1024”就是Linux操作系统对一个进程打开的文件句柄数量的限制,也包含打开的SOCKET数量(特别是很讨厌close_wait和time_wait状态,用netstat命令查看),所以会影响MySQL或服务器的并发连接数目。这个值可用ulimit命令来修改,用ulimit命令要有root用户权限


可见,open files的最大值已经被修改了,但ulimit命令修改的数值只对当前登录用户的目前使用环境有效,系统重启或者用户退出后就会失效

一个Ai
3楼 · 2021-09-08 17:07

linux 上tomcat 服务器抛出socket异常“文件打开太多”的问题 
java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)
at java.net.ServerSocket.implAccept(ServerSocket.java:450)
at java.net.ServerSocket.accept(ServerSocket.java:421)
at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
at org.apache.tomcat.util.net.PoolTcpEndpoint.acceptSocket(PoolTcpEndpoint.java:407)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:70)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595) 
原本以为是tomcat的配置或是应用本身的问题,"谷歌"一把后才发现,该问题的根本原因是由于系统文件资源的限制导致的。
具体的解决方式可以参考一下:
1。ulimit -a 查看系统目前资源限制的设定。
[root@test security]# ulimit -a
core file size        (blocks, -c) 0
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
max locked memory     (kbytes, -l) unlimited
max memory size       (kbytes, -m) unlimited
open files                    (-n) 1024
pipe size          (512 bytes, -p) 8
stack size            (kbytes, -s) 8192
cpu time             (seconds, -t) unlimited
max user processes            (-u) 7168
virtual memory        (kbytes, -v) unlimited
[root@test security]# 
通过以上命令,我们可以看到open files 的最大数为1024
那么我们可以通过一下命令修改该参数的最大值
2. ulimit -n 4096
[root@test security]# ulimit -n 4096
[root@test security]# ulimit -a
core file size        (blocks, -c) 0
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
max locked memory     (kbytes, -l) unlimited
max memory size       (kbytes, -m) unlimited
open files                    (-n) 4096
pipe size          (512 bytes, -p) 8
stack size            (kbytes, -s) 8192
cpu time             (seconds, -t) unlimited
max user processes            (-u) 7168
virtual memory        (kbytes, -v) unlimited
这样我们就修改了系统在同一时间打开文件资源的最大数,基本解决以上问题。

报这个错误就在我那次登陆更新之后又报的,原来ulimit -n 4096 命令只能临时的改变open files 的值,当重新登陆后又会恢复,所以需要永久设置open files 的值才行啊,用ulimit -n 修改open files 总是不能保持。所以用下面一个简单的办法更好些。
修改/etc/security/limits.conf 
添加如下一行:* - nofile 65536

修改/etc/pam.d/login
添加如下一行session required /lib/security/pam_limits.so

退出shell登陆,重新登陆一次即生效(运行ulimit -n 检查)

py大白
4楼 · 2021-09-26 08:27
Tomcat Too Many Open Files ;Too many open files tomcat 6.0报“too many open files Too many open files 问题的解决 linux 故障解决,tomcat 故障处理,too many open files 故障处理
发表于 2011 年 01 月 06 日 由 admin 
Tomcat Too Many Open Files ;Too many open files tomcat 6.0报“too many open files Too many open files 问题的解决

linux 故障解决,tomcat 故障处理,too many open files 故障处理这个问题是第一次在Linux环境下碰到,把解决的方法记录下来。服务器配置:两个双核CPU 2.0G,4G内存
操作系统:CentOS,内核2.6.18

应用1、搜索服务器,负责全站的搜索和提供内容相关性接口应用服务器:Tomcat6.0.16+Apache2.2.8,其中两个Tomcat实例,一个对外提供服务,一个对内管理索引(创建、删除、检索等)
Web方案:Solr1.3(With Solr Client For Java)、Java Servlet(Web Service 接口)

应用2、类似于百度知道的一个应用
应用服务器:与搜索服务器共享Apache2.2.8
Web方案:Php+Mysql

问题症状:搜索服务停止,应用2响应超时,牵连全站的搜索接口调用内容的输出,查看Catalina日志,大量的如下信息:


Java代码
org.apache.jk.common.ChannelSocket acceptConnections
WARNING: Exception executing accept
java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(Unknown Source)
at java.net.ServerSocket.implAccept(Unknown Source)
at java.net.ServerSocket.accept(Unknown Source)
at org.apache.jk.common.ChannelSocket.accept(ChannelSocket.java:295)
at org.apache.jk.common.ChannelSocket.acceptConnections(ChannelSocket.java:641)
at org.apache.jk.common.SocketAcceptor.runIt(ChannelSocket.java:852)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source) 

org.apache.jk.common.ChannelSocket acceptConnections
WARNING: Exception executing accept
java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(Unknown Source)
at java.net.ServerSocket.implAccept(Unknown Source)
at java.net.ServerSocket.accept(Unknown Source)
at org.apache.jk.common.ChannelSocket.accept(ChannelSocket.java:295)
at org.apache.jk.common.ChannelSocket.acceptConnections(ChannelSocket.java:641)
at org.apache.jk.common.SocketAcceptor.runIt(ChannelSocket.java:852)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)


使用如下命令查看系统对允许打开最大文件描述符的配置:
ulimit -u 查看open files设置
ulimit -a 查看所有设置
ulimit -u 65535(新的open files 值)修改设置
ulimit -n 65536 设置用户可以同时打开的最大文件数(max open files)

如果本参数设置过小,对于并发访问量大的网站,可能会出现too many open files的错误  
使用lsof -p pid [httpd进程的 pid、java的pid]来查看系统中apache进程和java运行时进程当前打开的文件资源,发现两者之和已经接近1024,大于了默认的设置。

修改配置:

修改/etc/security/limits.conf,在文件末加上
* soft nofile 65536
* hard nofile 65536

系统级文件描述符极限还可以通过将以下三行添加到 /etc/rc.d/rc.local 启动脚本中来设置:
# Increase system-wide file descriptor limit.
echo 65536 > /proc/sys/fs/file-max
echo 65536 > /proc/sys/fs/inode-max 
虽 然调整该参数解决了当前的问题,但并不是最好的方法,出现该错误说明该服务器承载了一定的并发连接,尤其是搜索服务,其中一个实例对外提供搜索,另一个实 例创建索引,两个实例之间也使用socket进行通信(httpclient for java),创建索引的时候会占用大量的文件描述符,如果描述符没有及时释放(不能完全依赖垃圾回收机制,要及时的close);全站的所有与搜索有关的 接口调用都会向其发出请求,而应用2也对外服务不少的请求,较好的办法是将搜索服务从该服务器中分离出来,这样可以分别对两者进行优化(包括调整 Linux系统参数,比如:/etc/sysctl.conf中对net.ipv4的优化),出了问题也容易debug


最大的可能是打开的文件或是socket没有正常关闭。

通过Java进程号查看当前进程占用文件描述符情况:


lsof -p $java_pid 每个文件描述符的具体属性  

lsof -p $java_pid | wc -l  当前Java进程file descriptor table中FD的总量  


lsof -p $java_pid 每个文件描述符的具体属性 lsof -p $java_pid | wc -l  当前Java进程file descriptor table中FD的总量


分析命令的结果,可判断问题是否由非正常释放资源所引起。


相关问题推荐

  • 回答 6

    1.重新在linux下编写脚本;2.vi :% s/r//g :% s/^M//g (^M输入用Ctrl+v, Ctrl+m)

  • 回答 15
    已采纳

    1、cd命令这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。如:cd /root/Docements # 切换到目录/root/Docementscd ./path          # 切换到当前目录下的path...

  • 回答 7
    已采纳

    目录/bin存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里。/etc存放系统管理和配置文件/home存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示 /usr用于存放系统应用程序,比较重要的目录/u...

  • 回答 12
    已采纳

    Linux 最主要的应用是在 大型网站 和 嵌入式设备(如手机)的开发行业。因为现今的业务处理系统一般都是基于网站+浏览器的方式来开发的,因此,在比较大的企业、事业单位、政府机关都在使用。如果想以计算机技术为资本找高薪的工作,非精通 Linux 不可。...

  • 回答 9
    已采纳

    利用vmware工具可以快速备份VMware有两种备份的方式:快照和克隆。快照:又称还原点,保存快照时的系统状态,每次还原成这个状态,所以快照时必须打开系统。常用于短期的备份,频繁的备份。克隆:就是复制,克隆的时候必须关闭系统。常用于长期备份,偶尔的备...

  • 回答 9
    已采纳

    1、高安全性  安装Linux能有效避免病毒的倾入。Linux系统下除非用户以root身份登录,否则程序无法更改系统设置和配置。因此,下载的文件/恶意软件的权限将受到限制。也就是说,除非你进入超级用户状态,不然你连软件都安装不上,病毒/恶意软件更不能自动安...

  • 回答 8
    已采纳

    1. 开源:公开源代码,盈利方式为卖服务,技术大拿无偿维护升级2. 闭源:不公开源代码,盈利方式为卖产品和服务,技术大拿各种攻击

  • 回答 10
    已采纳

    运维的工作方向比较多,随着业务规模的不断发展,越成熟的互联网公司,运维岗位会划分得越细。当前很多大型的互联网公司,在初创时期只有系统运维,随着服务质量的要求,也逐渐进行了工作细分。一般情况下运维团队的工作分类和职责如下。...

  • 回答 10

    用最简单的说法表达就是负责设备的运行和维护

  • 回答 1

    那么在root下,使用mkdir /home/user1建立文件夹chown user1 /home/user1给文件夹指定拥有者chmod 700 /home/user1指定只有所有者有权限,其他人不能访问。|要让他不能访问其他文件的话。。。不好办因为你看一个文件的访问权限-rwxrwxrwx分别表示 拥有者读写...

  • 回答 2

    1.检查是否设置口令长度至少8位,并包括数字,小写字符、大写字符和特殊符号4类中至少2类。在文件/etc/login.defs中设置 PASS_MIN_LEN 不小于标准值修改/etc/pam.d/system-auth文件, 在ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 选3种,追加到password re...

  • 回答 4
    已采纳

    (1)重启机器,用光盘或USB引导进入救援模式的shell(2) 查看硬盘信息,找出/boot分区和根分区(3)找到根分区之后就可以重新写/etc/fstab文件了(4)重新进入救援模式的shell(5)修复grub修复完grub之后,重启!...

  • 回答 7
    已采纳

    (1)Tab,补充命令:不用输入完整的命令,输入命令前几个字母后Tab键,会自动补全命令提示。(2)移动光标命令Ctrl+A:移动光标到开头Ctrl+E:移动光标到结尾Ctrl+F:往光标后面移动一个字符Ctrl+B:往光标前面移动一个字符(3)剪切字符Ctrl+K:剪切光标处...

  • 回答 7
    已采纳

    1.1 pwd命令该命令的英文解释为print working directory(打印工作目录)。输入pwd命令,Linux会输出当前目录。1.2 cd命令cd命令用来改变所在目录。cd / 转到根目录中cd ~ 转到/home/user用户目录下cd /usr 转到根目录下的usr目录中-------------绝对路径cd tes...

  • 回答 3

    使用ifconfig命令配置网卡的ip地址。此命令通常用来零时的测试用,计算机启动后ip地址的配置将自动失效。具体用法如下。Ipconfig ethx ipadd netmask x.x.x.x。其中ethx中的x代表第几快以太网卡,默认第一块为0.ipadd代表ip地址。x.x.x..x为子网掩码。例如给...

没有解决我的问题,去提问