Limity deskryptora pliku Ulimit nie są stosowane do określonego procesu

14

Niedawno sprawdziłem jeden z naszych procesów redis do jakich limitów zastosowano przy użyciu:

cat /proc/<redis-pid>/limits

Był zaskoczony, gdy dowiedział się, że ma niską wartość domyślną:

Limit                     Soft Limit           Hard Limit           
Max open files            4016                 4016 

Byłem zaskoczony, ponieważ skonfigurowaliśmy następujące ustawienia:

# /etc/sysctl.conf 
fs.file-max = 100000

.

# /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000

.

# /etc/ssh/sshd_config
UsePAM yes

.

# /etc/pam.d/sshd
session required pam_limits.so

Czy ktoś może mi powiedzieć, dlaczego zwiększona ulimit nie jest stosowana do uruchomionego procesu redis?

Proces redis działa jako użytkownik „redis”, serwer został zrestartowany, ponieważ limity zostały zwiększone. Jesteśmy na Debian Squeeze.

UpTheCreek
źródło

Odpowiedzi:

19

W systemie Linux limity zasobów można ustawiać w różnych lokalizacjach w zależności od rodzaju wymagania.

  1. /etc/security/limits.conf plik.
  2. /etc/sysctl.conf plik.
  3. ulimit Komenda

/etc/security/limits.confjest częścią pam_limits, więc limity ustawione w tym pliku są odczytywane przez moduł pam_limits podczas sesji logowania. Sesja logowania może odbywać się do sshlub przez terminal. I pam_limits nie wpłynie na procesy demona, jak wspomniano tutaj .

/etc/sysctl.confjest globalną konfiguracją całego systemu, nie możemy tutaj ustawić konfiguracji specyficznej dla użytkownika. Określa maksymalną ilość zasobów, które mogą być używane przez wszystkich użytkowników / procesy, które zostaną połączone.

ulimitpolecenie służy do ustawiania limitów powłoki. I tak, gdy limit jest ustawiony ulimitna powłokę, proces, który jest spawnowany z powłoki, również otrzymuje tę wartość z powodu reguły, która child processdziedziczy parent processeswłaściwości.

I tak w twoim przypadku, ponieważ redisrozpoczęcie jest częścią initżadnego z powyższych, nie pomoże ci bezpośrednio. Właściwy sposób to zrobić, ponieważ musisz użyć ulimitpolecenia, aby ustawić nową wartość w samym skrypcie init. Jak poniżej w skrypcie,

ulimit -n 100000
if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS.

Na liście życzeń jest już zgłoszony błąd do dodania ulimitfunkcji start-stop-daemon .

Sprawdź także w rediskonfiguracji, czy istnieje jakiś sposób na zapewnienie limitów.

Kannan Mohan
źródło
Świetne podsumowanie Kannan! Teraz poszedłem naprzód i dodałem ulimit do skryptu uruchamiania. Szkoda, że ​​nie ma sposobu, aby ustawić limit dla użytkownika, który będzie pracował z procesami zdemonizowanymi (ponieważ mamy wiele skryptów startowych), ale to działa. Dziękuję Ci!
UpTheCreek,
Świetna odpowiedź. Zaskoczył mnie proces potomny dziedziczący właściwości procesu nadrzędnego, wszystkie granice wyglądały poprawnie dla użytkownika uruchamiającego proces potomny, ale był to limit od właściciela procesu nadrzędnego, który był używany.
zsynchronizowano
2

Parametr sysctl fs.file-max jest szerokim globalnym limitem systemowym, nie sądzę, że dobrym pomysłem jest ustawienie w ulimit tej samej wartości.

Jeśli ustawisz także w ulimit 100000 i sysctl.conf 100000, jeden użytkownik może zablokować system

W każdym razie, mówiąc o swoim problemie, musisz być pewien, że twój system używa pam_limits

man pam_limits
grep -i limit /etc/pam.d/*
c4f4t0r
źródło
Dzięki - rozważę wtedy podniesienie wartości fs.file-max. Odnośnie pam - myślę, że tego używamy (dodałem dodatkową konfigurację do pytania). Nie jestem do końca pewien, czy rozumiem PAM, ponieważ nasze ustawienia wydają się odnosić do SSH, z którego nie korzysta ten użytkownik. Czy jest jakiś inny plik, który muszę skonfigurować? Zawsze mogłem umieścić ustawienie ulimit w skryptach inicjujących redis, ale wolałbym tego nie robić.
UpTheCreek
2

Włączyłeś pam_limits dla sshd, ale czy to polecenie jest wykonywane z sesji SSH? Może być konieczne dodanie tej samej linii do /etc/pam.d/logini / lub /etc/pam.d/sui / lub /etc/pam.d/sudo.

Wszechobecność
źródło
Dzięki. Podejrzewałem, że to nie w porządku. Proces jest uruchamiany ten wiersz w init.d skryptu: if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS. Który pam byłby odpowiedni w tym przypadku?
UpTheCreek
w skrypcie możesz użyć ulimit -n 100000
c4f4t0r
Czy skrypt init.d używa su [user] -cpolecenia do uruchomienia skryptu jako inny użytkownik, czy też twój program działa jako root? Jeśli to używa su, to byś to włożył /etc/pam.d/su. Jeśli działasz jako root, prawdopodobnie lepiej będzie, jeśli c4f4t0r zaproponuje dodanie ulimitpolecenia do skryptu init. rootmożesz ustawić dowolne limity, więc tak naprawdę nie musisz się martwić o pam.
Wszechobecność
1
Dzięki. Używa --chuid redis:redisna start-stop-daemon. Dodałem ulimit do skryptu uruchamiania.
UpTheCreek