打开的文件过多

打开的文件过多

当我打开 Lutris 然后打开 LOL 客户端时,就会发生这种情况。游戏总是无法正常运行。我尝试了很多方法,但始终无法改变打开文件限制。如何解决这个问题?

Waiting on children  
Waiting on children  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
esync: write: Bad file descriptor  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
esync: write: Bad file descriptor  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  

还有我的限制信息

~$ 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) 15106  
max locked memory       (kbytes, -l) 16384  
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) 15106  
virtual memory          (kbytes, -v) unlimited  
file locks                      (-x) unlimited  

答案1

当“打开文件过多”错误消息写入日志时,表明该进程的所有可用文件句柄都已被使用(这也包括套接字)。

在大多数情况下,这是由于应用程序的某些部分泄漏了文件句柄。 ulimit是 Unix/Linux 中的一个命令,允许为所有属性设置系统限制。对于您的情况,您需要将打开文件的最大数量增加到一个大数字(例如 1000000):

ulimit -n 1000000

或者

sysctl -w fs.file-max=1000000

或改变/etc/security/limits.conf/etc/sysctl.conf

fs.file-max = 1000000

要确定打开文件的数量是否在一段时间内增长,请lsof定期针对 PID 报告打开文件的数量。例如:

lsof -p [PID] -r [interval in seconds, 1800 for 30 minutes] > lsof.out

如果您无权访问该lsof命令,这将特别有用:

ls -al /proc/PID/fd

设置 ulimit 的指南

答案2

跑步

less /proc/PID/limits

检查最大打开文件数的实际软限制。如果您设置了 ulimits 但实际数字仍然很低 - 请检查您启动进程的方式。例如,systemd 接管了 ulimits,您应该使用显式设置(最好是在进程级别),以确保您的程序获得所需的运行时限制。

答案3

我认为,发生这种情况的原因有多种:

  1. 系统范围限制(运行cat /proc/sys/fs/file-max以查看限制,对我来说它是9223372036854775807
  2. 最大用户实例(运行cat /proc/sys/fs/inotify/max_user_instances:曾经是128
  3. 硬用户限制(运行ulimit -nH:)1048576
  4. 软用户限制(运行ulimit -nS:曾经是1024

1. 系统范围限制

可以通过以下方式调整系统范围的规则:

fs.file-max = 9223372036854775807

变成/etc/sysctl.conf。这个值对我来说不是问题。

2. 最大用户实例

对我来说,这个值太低了。要修复它,请在以下位置再次添加或编辑此行/etc/sysctl.conf

fs.inotify.max_user_instances = 1024

3. & 4. 硬或软用户限制

我的软用户限制也太低了。要修复此问题,请打开/etc/security/limits.conf(以 root 身份)并添加以下行:

<username>             soft    nofile 100000

(替换<username>为您的用户名,或替换*为所有用户)

soft可以通过将上面一行中的 替换为 来设置硬用户限制hard。当然,您可以为硬限制和软限制或不同用户设置多条规则。

付诸实施

也许注销并重新登录就足以使更改生效,但我只是重新启动了系统以确保无误。

相关内容