開啟的文件太多

開啟的文件太多

當我打開 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

檢查最大開啟檔案的實際軟限制。如果您設定了 ulimit 但實際數量仍然很低 - 請檢查您如何啟動流程。例如,systemd 接管 ulimit,您應該在進程層級更好地使用明確設置,以確保您的程式獲得所需的執行時間限制。

答案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當然,您可以為硬限制和軟限製或不同的使用者設定多個規則。

將事情付諸實施

也許登出並重新登入就足以讓更改生效,但我只是重新啟動了系統才能確定。

相關內容