当我打开 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
答案2
跑步
less /proc/PID/limits
检查最大打开文件数的实际软限制。如果您设置了 ulimits 但实际数字仍然很低 - 请检查您启动进程的方式。例如,systemd 接管了 ulimits,您应该使用显式设置(最好是在进程级别),以确保您的程序获得所需的运行时限制。
答案3
我认为,发生这种情况的原因有多种:
- 系统范围限制(运行
cat /proc/sys/fs/file-max
以查看限制,对我来说它是9223372036854775807
) - 最大用户实例(运行
cat /proc/sys/fs/inotify/max_user_instances
:曾经是128
) - 硬用户限制(运行
ulimit -nH
:)1048576
- 软用户限制(运行
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
。当然,您可以为硬限制和软限制或不同用户设置多条规则。
付诸实施
也许注销并重新登录就足以使更改生效,但我只是重新启动了系统以确保无误。