Jak zmienić limit liczby otwartych plików w systemie Linux? [Zamknięte]

194

Podczas uruchamiania mojej aplikacji czasami pojawia się błąd too many files open.

Uruchamianie ulimit -araportów, że limit wynosi 1024. Jak zwiększyć limit powyżej 1024?

Edytuj ulimit -n 2048 wyniki w błędzie uprawnień.

John Meagher
źródło
patrz również: unix.stackexchange.com/a/8949/231660
Guy Avraham
Właśnie przeszedł to na CentOS 7 (sam na RHEL) i wykonane blogu pokrycie go, ponieważ miałem tyle kłopotów nawet z tych wszystkich wypowiedzi: coding-stream-of-consciousness.com/2018/12/21/... . Często wraz z otwartymi plikami musisz zwiększyć nproc, który faktycznie znajduje się w wielu plikach ustawień ... a jeśli używasz systemd / systemctl, który ma własne oddzielne ustawienia. To trochę szalone.
John Humphreys - w00te
Jeśli używasz VSCode na Linuksie, to obejście może pomóc: stackoverflow.com/a/55027686/1190948
Juri Sinitson

Odpowiedzi:

153

Zawsze możesz spróbować zrobić ulimit -n 2048. Spowoduje to jedynie zresetowanie limitu dla bieżącej powłoki, a podana liczba nie może przekroczyć twardego limitu

Każdy system operacyjny ma inną twardą konfigurację w pliku konfiguracyjnym. Na przykład limit twardych otwartych plików w systemie Solaris można ustawić podczas rozruchu z / etc / system.

set rlim_fd_max = 166384
set rlim_fd_cur = 8192

W systemie OS X te same dane muszą być ustawione w /etc/sysctl.conf.

kern.maxfilesperproc=166384
kern.maxfiles=8192

W Linuksie ustawienia te są często w /etc/security/limits.conf.

Istnieją dwa rodzaje ograniczeń:

  • miękkie limity są po prostu obecnie obowiązującymi limitami
  • twarde limity oznaczają maksymalną wartość, której nie można przekroczyć przez ustawienie miękkiego limitu

Miękkie limity mogą być ustawione przez dowolnego użytkownika, podczas gdy twarde limity są zmieniane tylko przez root. Limity są własnością procesu. Są one dziedziczone po utworzeniu procesu potomnego, dlatego podczas inicjalizacji systemu należy ustawić limity ogólnosystemowe w skryptach inicjujących, a limity użytkownika należy ustawić podczas logowania użytkownika, na przykład przy użyciu pam_limits.

Często uruchamiane są ustawienia domyślne. Tak więc, nawet jeśli możesz zresetować swój ulimit w pojedynczej powłoce, może się okazać, że resetuje się do poprzedniej wartości po ponownym uruchomieniu. Możesz chcieć grepować skrypty rozruchowe dla istniejących komend ulimit, jeśli chcesz zmienić domyślne.

Hoyhoy
źródło
4
czy możesz mi powiedzieć, jak tego używać w systemie Windows?
Pritam
@ Hoyhoy Mogę to zmienić, 2048ale nie jako 4500dlaczego? zobacz to
alhelal
@GaneshKrishnan co dodać do wspomnianych plików linux?
aviral sanjay
@Pritam Windows nie ma żadnych ulimit. Musisz określić, czego używasz (np. WSL, Cygwin).
Melebius
99

Jeśli używasz Linuksa i wystąpił błąd uprawnień, musisz zwiększyć dozwolony limit w pliku /etc/limits.conflub /etc/security/limits.conf(gdzie plik znajduje się, zależy od konkretnej dystrybucji Linuksa).

Na przykład, aby umożliwić każdemu na komputerze zwiększenie liczby otwartych plików do 10000, dodaj wiersz do limits.confpliku.

* hard nofile 10000

Następnie wyloguj się i zaloguj ponownie do swojego systemu, a powinieneś być w stanie:

ulimit -n 10000

bez błędu pozwolenia.

Jonathan Stanton
źródło
6
UWAGA: Symbol wieloznaczny nie dotyczy rootużytkownika. Musisz określić, root hard nofile 10000czy chcesz dostosować rootlimit.
Joshua Pinter,
1
@JoshPinter Haha, właśnie spędziłem ostatnie 3 godziny, przechodząc przez każdy samouczek, jak to zmienić ulimiti wreszcie dowiedziałem się, że jestem zalogowany jako root. Dlatego ciągle widziałem 1024 ulimit -a. Zmieniłem wildcare i dodałem *wnętrze limits.conf. Teraz wszystko jest dobrze (używam kluczy ssh, nie martw się: P) - Dziękuję !!!
NiCk Newman
1
@NiCkNewman Cieszę się, że się z tego śmiejesz! To dobra cecha u programisty / sysopsa. Zrobiłem to samo i nie byłem taki miły. Cieszę się, że pomogło! :)
Joshua Pinter
Suplement: Można znaleźć również w tym katalogu config: /etc/security/limits.d/.
Waldemar Wosiński
2
Po raz pierwszy otworzyłem /etc/security/limits.conf i zauważyłem, że wszystko jest tam komentowane. Jaka jest zatem domyślna wartość „hard nofile”?
ka3ak
36

1) Dodaj następujący wiersz do /etc/security/limits.conf

webuser hard nofile 64000

następnie zaloguj się jako użytkownik sieci

su - webuser

2) Edytuj następujące dwa pliki dla użytkownika

Dołącz .bashrc i .bash_profile plik uruchamiając

echo "ulimit -n 64000" >> .bashrc ; echo "ulimit -n 64000" >> .bash_profile

3) Wyloguj się, a następnie zaloguj ponownie i sprawdź, czy zmiany zostały wprowadzone poprawnie:

$ ulimit -a | grep open
open files                      (-n) 64000

To i oni bum, bum bum.

Vikrant Telkar
źródło
9
Jeśli zmienisz linię w limit.conf z „trudnej” na „miękką”, powinna stać się nową domyślną i nie wymagać zmian w profilach bash.
RishiD
Wygląda na to, że powtarzasz dodatkowe kroki. Samo ustawienie limitów będzie działało tak samo jak profil, ale we wszystkich sesjach.
Eddie
6

Jeśli niektóre z twoich usług nie radzą sobie z ograniczeniami, czasem łatwiej jest wprowadzić odpowiednie polecenia w skrypcie inicjującym usługę. Na przykład, gdy raportuje Apache

[alert] (11) Zasób chwilowo niedostępny: apr_thread_create: nie można utworzyć wątku roboczego

Spróbować umieścić ulimit -s unlimitedw /etc/init.d/httpd. Nie wymaga to ponownego uruchomienia serwera.

Sysadmin
źródło