Zbyt wiele otwartych plików w Debianie

15

Mam długi proces w Debianie. W pewnym momencie rzuć błąd:

Zbyt wiele otwartych plików.

Bieganie:

ulimit -a

przedstawia:

otwórz pliki (-n) 1024

Chcę zwiększyć liczbę otwartych plików 2 razy. Po wykonaniu

ulimit -n 2048

limit jest aktywny do końca mojej sesji, co nie dotyczy zadania.

Jak mogę trwale zwiększyć liczbę otwartych plików?

FoxyBOA
źródło

Odpowiedzi:

12

Jeśli proces jest uruchamiany za pomocą skryptu, możesz umieścić wywołanie ulimit w skrypcie tuż przed uruchomieniem demona.

Jeśli chcesz zwiększyć ulimit dla swojego użytkownika lub wszystkich użytkowników, możesz ustawić limity, które będą stosowane pam_limitsprzy logowaniu. Są one ustawione w /etc/security/limits.conf. W twoim przypadku możesz zrobić coś takiego:

*               hard    nofile             2048

Zauważ, że „twardy” oznacza twardy limit - taki, którego nie można przekroczyć i nie można go zmienić. Miękki limit może zostać zmieniony przez użytkownika (np. Kogoś bez możliwości rootowania), ale nie może przekraczać twardego limitu.

Przeczytaj limits.confwięcej informacji na temat korzystania pam_limits.

Daniel Lawson
źródło
Na limitach conf mam 2 linie: * miękki nofile 4096 * twardy nofile 8192 Które nie mają wpływu.
FoxyBOA
Wylogowałeś się i zalogowałeś od czasu ich przetestowania? Oznacza to wylogowanie bezpośrednio z X / GNOME / KDE itp., Jeśli próbujesz tego na komputerze lokalnym
Daniel Lawson
Tak. /etc/security/limits.conf nie działa dla mnie. Spróbuję drugiego podejścia.
FoxyBOA,
3
/etc/security/limits.conf działa tylko w przypadku usług korzystających z pam i modułu pam pam_limits (zobacz /etc/pam.d/, aby uzyskać informacje na temat konfiguracji PAM każdej usługi, aw szczególności /etc/pam.d/common-*) . Dotyczy to zatem wszystkich sesji użytkowników utworzonych przez sshd, gdm, login itp. Nie dotyczy wszystkich programów uruchomionych podczas rozruchu ...
Raphaël Hertzog
Powiedziałem coś na ten temat, ale dziękuję za wyjaśnienie. OP nie wyjaśnił, czy jest to usługa czy proces, który uruchamia jego użytkownik.
Daniel Lawson,
13

W jądrze znajduje się również „maksymalna liczba” otwartych plików, możesz sprawdzić bieżące ustawienie za pomocą:

cat /proc/sys/fs/file-max 

I ustaw nową wartość za pomocą:

echo "104854" > /proc/sys/fs/file-max

Jeśli chcesz zachować konfigurację między restartami, dodaj

sys.fs.file-max=104854

do

/etc/sysctl.conf

Aby sprawdzić bieżące maksymalne użycie pliku:

[root@srv-4 proc]# cat /proc/sys/fs/file-nr
3391    969     52427
|        |       |
|        |       |
|        |       maximum open file descriptors
|        total free allocated file descriptors
total allocated file descriptors
(the number of file descriptors allocated since boot)
rkthkr
źródło
1
Zauważ, że jeśli pokazuje się wolne deskryptory przydzielonych plików 0, oznacza to po prostu, że liczba uchwytów przydzielonych plików dokładnie odpowiada liczbie używanych uchwytów plików.
tacot wtorek
Kopalnia pokazuje kilka numerów obsceniczne tu: 49152 0 18446744073709551615 . Nie rozumiem, dlaczego dwie pierwsze kolumny nie sumują się do trzeciej. A jeśli mam 1,8 biliona trylionów, które są dostępne, nie widzę, jak je wszystkie wykorzystałem.
mlissner,
4

Jak powiedzieli inni, możesz zastosować określone limity dla użytkownika lub grupy w /etc/security/limits.conf.

Uwaga: ulimit -n pokazuje miękki limit.

ulimit -H -n 

pokaże ci twardy limit.

Powoduje to, że dane wyjściowe ulimit -a i ulimit -n są dość mylące, jeśli na przykład zwiększasz liczbę plików z 1024 do 4096, jak można oczekiwać na wyjściu z twardego limitu, ale nadal widzisz 1024, co jest miękkim limit.

Pamiętaj również, że limity te są wymuszane przy każdym logowaniu, więc zaloguj się ponownie w nowej powłoce i sprawdź zmiany, nie oczekuj, że zostaną one przeniesione na istniejące loginy.

Tom Feiner
źródło
2

Należy pamiętać, że jeśli uruchomisz proces przez ustawienie start-stop-daemon ustawienie ulimits w /etc/security/limits.conf nie działa. Jeśli na przykład chcesz podnieść limit otwartych plików dla tomcat do 20000, musisz dodać je do wierszy /etc/default/tomcat:

ulimit -Hn 32768
ulimit -Sn 32768

Ten problem napotkałem na Debianie 6.0.4. W przypadku innych procesów podane odpowiedzi powinny pomóc.

Janning
źródło
1

To zależy od tego, jak rozpoczniesz swój długotrwały proces. Jeśli jest uruchamiany w czasie rozruchu (za pomocą skryptów /etc/rcX.d/*), musisz umieścić w skrypcie startowym wywołanie ulimit, ponieważ jądro ustawia domyślny limit i nie można go regulować bez ponownej kompilacji.

Używanie /etc/security/limits.confmoże działać, jeśli używasz go crondo uruchomienia na przykład z wpisem takim jak ten:

@reboot $HOME/bin/my-program

To powinno działać, ponieważ /etc/pam.d/cron włącza pam_limits.so.

Raphaël Hertzog
źródło
-1

Możesz dodać to w /etc/security/limits.conf

root soft nofile 100000
root hard nofile 100000

zapisz, a następnie uruchom ponownie.

kxmp
źródło
3
Czy jest tu coś nowego, czego nie ma w zaakceptowanej odpowiedzi na to 5-letnie pytanie?
Andrew Schulman,
-2

Bardzo fajnym poleceniem jest, ulimit -nale jest problem z zbyt dużą liczbą połączeń i zbyt dużą liczbą otwartych plików:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 519357
max locked memory       (kbytes, -l) 32
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) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
czat
źródło
Próbowałem oczyścić twoją odpowiedź, ale wciąż nie jestem pewien, co próbujesz powiedzieć na pytanie dotyczące oryginalnych plakatów. Czy możesz spróbować to dalej posprzątać?
slm
Jest to również wynik działania ulimit -a, a nie ulimit -n.
Yvan