Zmodyfikuj ulimit (otwarte pliki) określonego procesu

27

Czy jest możliwe, aby zmienić miękkie - i sztywny limit o konkretnym procesie?

W moim przypadku mój proces jest mongodi wiele zasobów internetowych każe mi po prostu wykonać:

ulimit -n <my new value>

Moje obecne myśli:

  • W jaki sposób polecenie pozna limit procesu, który będę modyfikował? Czy to nie zmodyfikuje limitu otwartych plików dla całego systemu?
  • Zgaduję, że to polecenie zmienia tylko miękki limit. Czy jest więc sposób na zwiększenie twardego limitu?
test
źródło
Czy przeczytałeś tę cenną informację? docs.mongodb.org/manual/reference/ulimit
zadzwoń
Tak, nauczyłem się tego na pamięć. Nie jestem pewien, czy coś mi umknęło, ale ta strona mówi tylko, jak ZOBACZYĆ szczegóły. Mówi tylko o napisaniu ulimit -n <wartość> ...
test

Odpowiedzi:

29

Proces może zmienić swoje ograniczenia za pomocą setrlimit(2)wywołania systemowego. Po uruchomieniu ulimit -npowinieneś zobaczyć liczbę. To jest obecny limit liczby otwartych deskryptorów plików (w tym plików, gniazd, potoków itp.) Dla procesu. ulimitKomenda wykonana z getrlimit(2)połączenia systemu, aby dowiedzieć się, jaka jest obecna wartość.

Oto kluczowa kwestia: proces dziedziczy bieżący limit z procesu nadrzędnego. Więc jeśli uruchomisz ulimit -n 64, ustawisz limit otwartych deskryptorów plików tej powłoki na 64. Każdy proces uruchamiany przez powłokę będzie miał ten sam limit, chyba że nowy proces wywoła setrlimit()odpowiednio.

Aby zmienić mongodb'slimit deskryptorów otwartych plików, należy uruchomić ulimit -n 2048(lub dowolną dużą liczbę dozwoloną przez jądro) w powłoce. Następnie użyjesz tej powłoki, aby rozpocząć mongodb. Jako proces potomny mongodbodziedziczyłby (duży) limit otwartych deskryptorów plików.

Aby zmodyfikować limit otwartych plików w systemie, który bardziej przypomina sumę wszystkich limitów otwartych deskryptorów plików, musisz coś takiego zmodyfikować /etc/sysctl.confi uruchomić sysctl -p. Spójrz na wartość fs.file-maxparametru w /etc/sysctl.conf.

Bruce Ediger
źródło
Cóż za świetne wytłumaczenie! Dziękuję Ci bardzo. Spróbuję tego od razu!
test
Ta odpowiedź bardzo mi pomogła, ale problem polega na tym, że twardy limit wynosi 2048, a to w moim przypadku nie wystarczy. 1) Jak mogę znaleźć limit dozwolony przez moje jądro? 2) Czy można teraz zmienić HARD LIMIT? Dzięki jeszcze raz!
test
@test - Nigdy nie podniosłem twardego limitu. Znaleziono to: blog.samat.org/2011/04/05/... i ten wiki.brekeke.com/wiki/Increase-File-Descriptor-Limit-on-Linux Mówią to samo.
Bruce Ediger
18

Aby zmienić limity uruchomionego procesu, możesz użyć polecenia narzędzia prlimit.

prlimit --pid 12345 --nofile=1024:1024

To, co robi to wewnętrznie, to dzwonić setrlimit(2). Strona podręcznika prlimit powinna zawierać kilka użytecznych przykładów wywołania.

Źródło: https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/

użytkownik7610
źródło
To uratowało mi dzień, dzięki. Miałem długi proces Pythona, który powodował too many files openbłędy. Twoja odpowiedź rozwiązała mój problem bez zatrzymywania procesu.
Visionscaper,
1

Przynajmniej w systemie Linux większość dystrybucji wydaje się używać pam do uwierzytelniania. Jednym z modułów dostarczanych z pam jest moduł limitów . Cytowanie z README dla pam_limits:

The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. Users of uid=0 are affected by this limits, too.

W rezultacie możesz ustawić limity twarde dla użytkownika, grupy i domyślne w obu kategoriach (root to ustawia, a proces nie może żądać wyższych) i limity miękkie. Miękkie limity są zwykle ustawiane poniżej niż twarde limity, a aplikacja może je zwiększać w górę, aż osiągnie twardy limit.

W twoim przypadku, jeśli proces, który chcesz zwiększyć limity uruchomień jako zwykły użytkownik, możesz zwiększyć limity dla tego użytkownika lub grupy. Na przykład mam kilka zadań mysql cron na niektórych serwerach, które wymagają otwarcia dodatkowych uchwytów plików, więc ustawiłem to:

$ cat /etc/security/limits.d/mysql.conf
@mysql           soft    nofile          100000
@mysql           hard    nofile          200000

Nic nie wymaga ponownego uruchomienia; po zalogowaniu się do tego użytkownika możesz od razu zobaczyć, że nowe ograniczenia obowiązują.

Inną rzeczą, którą możesz zrobić, jeśli korzystasz z typowego systemu opartego na RedHat, jest umieszczenie wywołania ulimit w skrypcie / etc / sysconfig / $ SERVICE. Na przykład skrypt inicjujący Apache nazywa się /etc/init.d/httpd i jeśli to możliwe, pobiera plik konfiguracyjny / etc / sysconfig / httpd. Odkryłem, że łatwiej jest zarządzać, wykonując tę ​​czynność zamiast edycji samego skryptu init, ponieważ skrypty init są aktualizowane po uaktualnieniu rpm, ale pliki sysconfig są aktualizowane tylko wtedy, gdy nie są zmieniane z domyślnego.

Todd Lyons
źródło
Najlepsze i najbardziej praktyczne rozwiązanie.
nelaaro
0

W jaki sposób polecenie pozna limit procesu, który będę modyfikował? Czy to nie zmodyfikuje limitu otwartych plików dla całego systemu?

Polecenie zmieni limit bieżącego procesu (twojej powłoki) i dowolnego procesu potomnego (wszystkiego, co uruchomisz później z powłoki).

Procesy są zorganizowane w drzewo. Każdy proces ma element nadrzędny (który go wywołał). Proces nr 1, init, jest procesem specjalnym, ponieważ jest własnym rodzica. Narzędzia takie jak htop lub top mogą pokazywać procesy wyświetlane jako drzewo rodziców i dzieci.

użytkownik7610
źródło