当前位置: 首页 > 面试题库 >

打开文件错误太多,但lsof显示合法数量的打开文件

武功
2023-03-14
问题内容

我的Java程序失败了

Caused by: java.io.IOException: Too many open files
        at java.io.UnixFileSystem.createFileExclusively(Native Method)
        at java.io.File.createNewFile(File.java:883)...

这是来自的关键行/etc/security/limits.conf。他们将用户的最大文件数设置为500k:

root                     soft    nofile          500000
root                     hard    nofile          500000
*                        soft    nofile          500000
*                        hard    nofile          500000

我跑去lsof统计打开的文件数-
包括全局和jvm进程。我检查了中的柜台/proc/sys/fs。一切似乎还可以。我的进程仅打开了4301个文件,限制为500k:

:~# lsof | wc -l
5526
:~# lsof -uusername | wc -l
4301
:~# cat /proc/sys/fs/file-max
744363
:~# cat /proc/sys/fs/file-max
744363
:~# cat /proc/sys/fs/file-nr
4736    0       744363

这是Ubuntu 11.04服务器。我什至已经重新启动,所以我很肯定正在使用这些参数。

我不知道它是否相关,但是该过程由upstart脚本启动,该脚本使用setuidgid启动该过程,如下所示:

exec setuidgid username java $JAVA_OPTS -jar myprogram.jar

我缺少什么?


问题答案:

事实证明,问题在于我的程序正在作为新贵的初始化脚本运行,并且该exec节未调用shell。ulimitlimits.conf中的设置仅适用于Shell中的用户进程。

我通过将exec节更改为

exec sudo -u username java $JAVA_OPTS -jar program.jar

它在用户名的默认外壳中运行java。这使程序可以使用所需数量的打开文件。

我已经看到它提到您也可以ulimit -n在调用命令之前先进行调用。对于新贵的脚本,我认为您应该改用script节。

我发现了一个更好的诊断比lsofls /proc/{pid}/fd | wc -l,获得打开的文件描述符的精确计数。通过监视,我可以看到失败是在4096个打开的fds处发生的。我不知道4096的来源。它不在/
etc中的任何地方;我猜它已经编译进内核了。



 类似资料:
  • 我想知道太多文件打开错误的确切问题。我通过谷歌寻找解决方案,但我不知道为什么会出现这个问题以及如何解决这个问题。 堆栈错误:严重:套接字接受失败。网SocketException:java上打开的文件太多。网普通袜子。java上的socketAccept(本机方法)。网抽象素socketimpl。在java上接受(AbstractPlainSocketImpl.java:398)。网服务器插座。j

  • 我有一个错误:PHP无法打开流:打开的文件太多。 我在这里查看了stackoverflow的各种答案,但我无法解决这个问题。我主要尝试增加最大打开文件数的限制: 我已编辑/等/安全/限制。conf,其中我指定了: 保存并注销/重新启动该框后,命令: 仍打印出1024个。我不知道为什么这没有效果,我想这就是我得到php错误的原因。如果需要,我可以粘贴整个文件或任何其他配置文件。我使用的是PHP 5.

  • 我有一个在tomcat上运行的应用程序,有时会出现以下错误: .... 我检查了打开文件的限制,它是1024个,但是当我检查了lsof应用程序的打开文件数量时,它接近200个,如果它没有达到限制,为什么会发生这种情况?我应该增加限额吗?是否有其他原因导致此错误?让服务重新正常运行的唯一方法是重新启动tomcat,还有其他恢复正常的方法吗? 提前谢谢。 编辑:这里是处理doPost方法的servle

  • 我正在编写一个需要读取/写入大量文件的遗传算法。GA的适用性测试是调用一个名为的程序,该程序将文件作为输入并生成文件作为输出。 一切都在工作,除非我使遗传算法的种群规模和/或总代数太大。然后,经过这么多代人,我开始得到这个:(我为许多不同的文件反复得到它,索引 只是我上次运行它时首先出现的那个)。这很奇怪,因为我不是在第一代或第二代之后得到错误,而是在相当多的世代之后,这表明每一代都会打开更多它没

  • 我正试图运行Jest测试,但得到以下错误: 令我感兴趣的是,错误中列出的路径指向node_modules目录中的一个文件,由于TestPathIgnorePatterns中的node_modules条目,我预计该文件不会被读取。 我运行的是节点4.2.1,我的React-Native安装才一周,我今天安装了Jest(所以我想我对所有东西都是最新的)。我在Mac电脑上。 我运行了:,关闭了所有终端窗

  • 问题内容: 我使用多个文件来执行一些文件I / O(写入19个文件,确实如此)。写他们几百次后,我得到了。但实际上我一次只能打开几个文件。这里有什么问题?我可以验证写入是否成功。 问题答案: 在Linux和其他UNIX /类似UNIX的平台上,操作系统对进程在任何给定时间可能具有的打开文件描述符的数量进行了限制。在过去,此限制曾经是硬接线1,并且相对较小。如今,它要大得多(几百/千),并且受“软”