Limiti del descrittore di file Ulimit non applicati per un processo particolare


14

Recentemente ho verificato uno dei nostri processi di redis su quali ulimits erano applicati usando:

cat /proc/<redis-pid>/limits

Ed è stato sorpreso di apprendere che era al basso valore predefinito:

Limit                     Soft Limit           Hard Limit           
Max open files            4016                 4016 

Sono stato sorpreso, perché abbiamo configurato quanto segue:

# /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

Qualcuno può dirmi perché l'ulimit maggiore non viene applicato al processo di redis in esecuzione?

Il processo di redis è in esecuzione come "redis" dell'utente, il server è stato riavviato da quando i limiti sono stati aumentati. Siamo su Debian Squeeze.

Risposte:


19

In Linux i limiti delle risorse possono essere impostati in varie posizioni in base al tipo di requisito.

  1. /etc/security/limits.conf file.
  2. /etc/sysctl.conf file.
  3. ulimit comando

/etc/security/limits.conffa parte di pam_limits e quindi i limiti impostati in questo file vengono letti dal modulo pam_limits durante le sessioni di accesso. La sessione di accesso può essere eseguita da ssho tramite terminal. E pam_limits non influenzerà i processi daemon come menzionato qui .

/etc/sysctl.confè una configurazione globale a livello di sistema, non è possibile impostare una configurazione specifica dell'utente qui. Imposta la quantità massima di risorse che possono essere utilizzate da tutti gli utenti / processi messi insieme.

ulimitIl comando viene utilizzato per impostare i limiti della shell. E così quando viene impostato un limite ulimitsu una shell, il processo che viene generato dalla shell ottiene anche quel valore a causa della regola che child processeredita le parent processesproprietà.

E così per il tuo caso, dato che redisè stato avviato come parte di initnessuna delle precedenti ti aiuterà direttamente. Il modo corretto di farlo è che, è necessario utilizzare il ulimitcomando per impostare il nuovo valore nello script init stesso. Come sotto nello script,

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

C'è già un bug archiviato nella lista dei desideri a cui aggiungere ulimitfunzionalità start-stop-daemon .

Controlla anche la redisconfigurazione se esiste un modo per fornire limiti lì.


Grande sintesi Kannan! Ora sono andato avanti e ho aggiunto l'ulimit allo script di avvio. È un peccato che non ci sia modo di impostare il limite per l'utente che lavorerà con processi deamonizzati (dato che abbiamo più script di avvio), ma questo funziona. Grazie!
UpTheCreek

Bella risposta. Il processo figlio che eredita le proprietà del processo padre è stato ciò che mi ha sorpreso, i limiti sembravano tutti corretti per l'utente che esegue il processo figlio ma era il limite del proprietario del processo padre che veniva utilizzato.
sincronizza il

2

Il parametro sysctl fs.file-max è un limite di sistema globale ampio, non credo sia una buona idea impostare in ulimit lo stesso valore.

Se si imposta in ulimit 100000 e anche in sysctl.conf 100000, un utente può bloccare il sistema

Ad ogni modo, parlando del tuo problema, non devi essere certo, il tuo sistema usa pam_limits

man pam_limits
grep -i limit /etc/pam.d/*

Grazie - Prenderò in considerazione di aumentare il valore fs.file-max allora. Per quanto riguarda pam - credo che lo stiamo usando (ho aggiunto qualche ulteriore configurazione alla domanda). Non sono davvero sicuro di aver capito PAM, poiché le nostre impostazioni sembrano essere correlate a SSH, che non viene utilizzato da questo utente. C'è qualche altro file che devo configurare? Potrei sempre mettere un'impostazione ulimit negli script init per Redis, ma preferirei non farlo.
UpTheCreek

2

Hai abilitato pam_limits per sshd, ma questo comando viene eseguito da una sessione SSH? Potrebbe essere necessario aggiungere la stessa riga a /etc/pam.d/logine / o /etc/pam.d/sue / o /etc/pam.d/sudo.


Grazie. Sospettavo che non fosse del tutto giusto. Il processo è iniziato questa linea in uno script init.d: if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS. Quale pam sarebbe appropriato in questo caso?
UpTheCreek

nel tuo script puoi usare ulimit -n 100000
c4f4t0r

Lo script init.d utilizza un su [user] -ccomando per avviare lo script come un altro utente o il programma viene eseguito come root? Se lo sta usando su, lo inseriresti /etc/pam.d/su. Se stai funzionando come root, probabilmente stai meglio con il suggerimento di c4f4t0r di aggiungere il ulimitcomando nel tuo script init. rootè autorizzato a stabilire i limiti desiderati, quindi non è necessario preoccuparsi di pam per quel caso.
Onnipresenza,

1
Grazie. Si usa --chuid redis:redissu start-stop-daemon. Ho aggiunto ulimit allo script di avvio ora.
UpTheCreek
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.