Czy jest możliwe, aby zmienić miękkie - i sztywny limit o konkretnym procesie?
W moim przypadku mój proces jest mongod
i 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?
Odpowiedzi:
Proces może zmienić swoje ograniczenia za pomocą
setrlimit(2)
wywołania systemowego. Po uruchomieniuulimit -n
powinieneś zobaczyć liczbę. To jest obecny limit liczby otwartych deskryptorów plików (w tym plików, gniazd, potoków itp.) Dla procesu.ulimit
Komenda wykonana zgetrlimit(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łasetrlimit()
odpowiednio.Aby zmienić
mongodb's
limit 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 potomnymongodb
odziedziczył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.conf
i uruchomićsysctl -p
. Spójrz na wartośćfs.file-max
parametru w/etc/sysctl.conf
.źródło
Aby zmienić limity uruchomionego procesu, możesz użyć polecenia narzędzia
prlimit
.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/
źródło
too many files open
błędy. Twoja odpowiedź rozwiązała mój problem bez zatrzymywania procesu.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:
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.
źródło
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.
źródło