Modifica ulimit (file aperti) di un processo specifico


27

È possibile modificare il limite soft - e hard di un processo specifico ?

Nel mio caso, il mio processo è mongode molte risorse Web mi dicono di eseguire semplicemente:

ulimit -n <my new value>

I miei pensieri attuali:

  • Come farà il comando a conoscere il limite del processo che modificherò? Questo non modificherà il limite del file aperto dell'intero sistema?
  • Immagino che questo comando cambi solo il limite morbido. Quindi c'è un modo per aumentare anche il limite massimo?

Hai letto questa preziosa informazione? docs.mongodb.org/manual/reference/ulimit
tink

Sì, ho imparato tutto a memoria .. Non sono sicuro che mi manchi qualcosa, ma quella pagina ti dice solo come VISUALIZZARE i dettagli. Ti dice solo di scrivere ulimit -n <valore> ...
prova

Risposte:


29

Un processo può cambiare i suoi limiti tramite la setrlimit(2)chiamata di sistema. Quando corri ulimit -ndovresti vedere un numero. Questo è l'attuale limite al numero di descrittori di file aperti (che include file, socket, pipe, ecc.) Per il processo. Il ulimitcomando ha eseguito la getrlimit(2)chiamata di sistema per scoprire quale sia il valore corrente.

Ecco il punto chiave: un processo eredita il suo limite corrente dal suo processo genitore. Quindi, se eseguito ulimit -n 64, impostereste il limite di descrittori di file aperti di quella shell su 64. Qualsiasi processo avviato dalla shell avrebbe lo stesso limite, a meno che quel nuovo processo non venga chiamato in modo setrlimit()appropriato.

Per modificare mongodb'sil limite del descrittore di file aperto, eseguiresti ulimit -n 2048(o qualunque numero elevato consenta il tuo kernel) in una shell. Utilizzeresti quindi quella shell per iniziare mongodb. Come processo figlio, mongodberediterebbe il limite (grande) per i descrittori di file aperti.

Per modificare il limite del file aperto del sistema, che sembra più la somma di tutti i limiti del descrittore file aperto di tutti i processi, devi fare qualcosa come modificare /etc/sysctl.confed eseguire sysctl -p. Guarda il valore del fs.file-maxparametro in /etc/sysctl.conf.


Che grande spiegazione! Grazie mille. Ci proverò subito!
prova

Questa risposta mi ha aiutato molto, ma il problema ora è che il limite massimo è il 2048, e questo non è abbastanza nel mio caso. 1) come posso trovare il limite consentito dal mio kernel? 2) È possibile modificare il LIMITE DURO ora? Grazie ancora!
prova

@test - Non ho mai alzato il limite massimo. Trovato questo: blog.samat.org/2011/04/05/… e questo wiki.brekeke.com/wiki/Increase-File-Descriptor-Limit-on-Linux Dicono la stessa cosa.
Bruce Ediger,

18

Per modificare i limiti di un processo in esecuzione, è possibile utilizzare il comando utility prlimit.

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

Ciò che fa internamente è chiamare setrlimit(2). La pagina man di prlimit dovrebbe contenere alcuni utili esempi di invocazione.

Fonte: https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/


Questo mi ha salvato la giornata, grazie. Ho avuto un lungo processo Python che produceva too many files openerrori. La tua risposta ha risolto il mio problema senza interrompere il processo.
Visionscaper

1

Almeno su Linux, la maggior parte delle distro sembrano usare pam per l'autenticazione. Un modulo fornito con pam è il modulo limits . Citando dal README per 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.

Di conseguenza, è possibile impostare limiti per utente, per gruppo e predefiniti, in entrambe le categorie (il root lo imposta e il processo non può richiedere valori più alti) e i limiti soft. I limiti soft sono in genere impostati inferiori ai limiti hard e l'app può aumentarla verso l'alto fino a raggiungere il limite hard.

Nel tuo caso, se il processo che desideri aumentare i limiti delle esecuzioni come utente normale, puoi aumentare i limiti per quell'utente o quel gruppo. Ad esempio, ho alcuni lavori mysql cron su alcuni server che richiedono l'apertura di handle di file aggiuntivi, quindi ho impostato questo:

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

Non è necessario riavviare nulla; quando fai causa a quell'utente, puoi immediatamente vedere che i nuovi limiti diventano effettivi.

Un'altra cosa che puoi fare se ti trovi in ​​un tipico sistema derivato da RedHat è inserire la chiamata ulimit che vuoi nello script / etc / sysconfig / $ SERVICE. Ad esempio, lo script init di apache è chiamato /etc/init.d/httpd e genera il file di configurazione / etc / sysconfig / httpd se viene trovato. Ho trovato più facile gestire facendo questo invece di modificare lo script init stesso perché gli script init vengono aggiornati quando viene aggiornato l'rpm, ma i file sysconfig vengono aggiornati solo se non vengono modificati rispetto all'impostazione predefinita.


La soluzione migliore e più pratica.
nelaaro,

0

Come farà il comando a conoscere il limite del processo che modificherò? Questo non modificherà il limite del file aperto dell'intero sistema?

Il comando modificherà il limite per il processo corrente (la tua shell) e qualsiasi processo figlio (qualsiasi cosa tu esegua successivamente dalla shell).

I processi sono organizzati in un albero. Ogni processo ha un genitore (che lo ha invocato). Il processo numero 1, init, è un processo speciale in quanto è il suo genitore. Strumenti come htop o top possono mostrarti i processi visualizzati come un albero di genitori e figli.

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.