Ograniczenia liczby deskryptorów plików


34

Próbuję zainstalować 389-ds, a to daje mi to ostrzeżenie:

WARNING: There are only 1024 file descriptors (hard limit) available, which limit the number of simultaneous connections.

Rozumiem deskryptory plików, ale nie rozumiem miękkich i twardych limitów.

Kiedy biegnę cat /proc/sys/fs/file-max, wracam 590432. Powinno to oznaczać, że mogę otworzyć do 590432 plików (tzn. Mieć do 590432 deskryptorów plików).

Ale kiedy biegam ulimit, daje mi inne wyniki:

$ ulimit
unlimited

$ ulimit -Hn    # Hard limit
4096

$ ulimit -Sn    # Soft limit
1024

Ale od czego jest twardy / miękki limit ulimiti jak odnoszą się do liczby przechowywanej w /proc/sys/fs/file-max?

Odpowiedzi:


39

Zgodnie z dokumentacją jądra , /proc/sys/file-maxto maksymalna, łączna, globalna liczba deskryptorów jądro przydzieli przed zadławienia. To jest limit jądra, a nie twój aktualny użytkownik. Więc można otworzyć 590432, pod warunkiem, że jesteś sam w systemie bezczynności (tryb pojedynczego użytkownika, żadne demony uruchomiony).

Pamiętaj, że dokumentacja jest nieaktualna: plik był już proc/sys/fs/file-maxod dawna. Podziękowania dla Martina Jambona za zwrócenie na to uwagi.

Różnicę między miękkimi i twardymi limitami można znaleźć tutaj, na SE . Możesz podnieść lub obniżyć miękki limit jako zwykły użytkownik, pod warunkiem, że nie przekroczysz twardego limitu. Możesz także obniżyć twardy limit (ale nie możesz go ponownie podnieść dla tego procesu). Jako superużytkownik możesz podnosić i obniżać zarówno twarde, jak i miękkie limity. Schemat podwójnego limitu służy do egzekwowania zasad systemowych, ale umożliwia także zwykłym użytkownikom ustalanie limitów tymczasowych dla siebie, a następnie ich zmianę.

Pamiętaj, że jeśli spróbujesz obniżyć twardy limit poniżej miękkiego limitu (a nie jesteś superużytkownikiem), EINVALwrócisz (Nieprawidłowy argument).

Więc w twoim konkretnym przypadku ulimit(który jest taki sam jak ulimit -Sf) mówi, że nie masz miękkiego limitu na rozmiaru plików zapisywanych przez powłokę i jej podprocesy . (to prawdopodobnie dobry pomysł w większości przypadków)

Twój innych inwokacja, ulimit -Hnraporty dotyczące -nlimitu (maksymalna liczba otwartych deskryptorów plików), nie-f granicznego, dlatego miękkie ograniczenie wydaje się wyższy niż twardego limitu. Jeśli wejdziesz ulimit -Hf, otrzymasz również „nieograniczony”.


14
W systemie Linux 4.4.0 ścieżka do maksymalnego pliku to /proc/sys/fs/file-max.
Martin Jambon,

proszę, czy twardy limit jest ulimit -Hn ukierunkowany na sam limit systemu na przydzielone deskryptory plików?
Webwoman

2
@Webman: nie, nie ma. ulimitwpływa tylko na ograniczenia dla bieżącego procesu . Granice bieżącego procesu są także przekazywane procesom potomnym, ale każdy proces ma osobną liczbę. Np. Z ulimit -Hn 10, możesz mieć jednocześnie otwartych tylko 10 deskryptorów plików. Każdy utworzony proces potomny może mieć maksymalnie 10 deskryptorów plików. Tylko superużytkownik może zwiększyć limit raz ustawiony. Jeśli ustawisz jedną za niską, jedyną opcją może być zabicie procesu powłoki i rozpoczęcie nowej.
Alexios

0

Wywołanie systemowe „select” jest jedną z wielu okropnych decyzji dotyczących uniksowego projektowania uniksów, która sprawia, że ​​nawet Windows95 nadal wygląda tak dobrze w porównaniu.

Powinien zostać zbanowany 20 lat temu, a wtedy moglibyśmy mieć teraz możliwość nieograniczonej obsługi plików bez problemów.

Możesz łatwo zwiększyć liczbę deskryptorów plików dzięki konfiguracji jądra i ulimit, ALE pamiętaj, że jeśli jakaś biblioteka korzysta z wywołania systemowego „wybierz”, twój program stanie się niestabilny (uszkodzenie pamięci) i zawiedzie.

Select może obsługiwać tylko deskryptory plików od 0 do 1023, a jeśli podasz jeden z wyższą wartością, losowo wbije się w twoją pamięć, a select nigdy nie powtórzy deskryptora jako działającego. Niestety wiele bibliotek korzysta z select.


Twój komentarz jest użytecznym ostrzeżeniem, ale zamiast zabierać rażący ton, znacznie bardziej użyteczne byłoby zacytowanie strony podręcznika fd_set(3)i określenie limitu FD_SETSIZE. A najlepsza byłaby sugestia połączenia zastępczego, takiego poll(3)jak w tej odpowiedzi
Davor Cubranic
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.