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?

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.


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)


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.


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.


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.


-1

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

root soft nofile 100000
root hard nofile 100000

zapisz, a następnie uruchom ponownie.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.