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.