Définir la limite maximale de fichiers sur un processus en cours d'exécution

27

J'ai un long processus qui va finalement atteindre la limite maximale de fichiers ouverts. Je sais comment changer cela après un échec, mais existe-t-il un moyen de changer cela pour le processus en cours, à partir de la ligne de commande?

kāgii
la source

Réponses:

28

Sur les noyaux plus récents (2.6.32+) sur CentOS / RHEL, vous pouvez changer cela au moment de l'exécution avec / proc / <pid> / limits:

cd /proc/7671/
[root@host 7671]# cat limits  | grep nice
Max nice priority         0                    0                    
[root@host 7671]# echo -n "Max nice priority=5:6" > limits
[root@host 7671]# cat limits  | grep nice
Max nice priority         5                    6                    
Sig-IO
la source
C'est les règles! Je ne savais pas que vous pouviez écrire dans le fichier de limites.
clee
4
ne fonctionne pas pour moi sur ubuntu 12.04
Poma
5
Cela ne fonctionne pas sur mon noyau 3.2 . Je suppose que votre distribution a un patch non officiel spécifique pour cela car je ne vois aucune trace de ce patch dans fs / proc / base.c du noyau .
Totor
Cela pourrait être ... Je sais qu'il est présent dans les noyaux RHEL / CentOS. Il ne semble pas être présent dans les noyaux Debian.
Sig-IO du
2
'setprlimit' est le moyen à l'épreuve du temps et recommandé, voir la réponse suivante
Sig-IO
26

Comme indiqué ici , la prlimitcommande, introduite avec util-linux 2.21, vous permet de lire et de modifier les limites des processus en cours d'exécution.

Il s'agit d'une suite à l'écriture /proc/<pid>/limits, qui n'était pas intégrée au noyau principal. Cette solution devrait fonctionner.

Si vous ne l'avez pas prlimit(1)encore, vous pouvez trouver le code dans une version minimaliste dans la prlimit(2)page de manuel .

Sig-IO
la source
2
+1 pour la version minimaliste dans la page de manuel!
Totor
Avertissement: "memcached" segfault si vous modifiez "nolimit" sur son processus après avoir rencontré une limite. Pas toujours une bonne idée d'utiliser les limites inscriptibles
John
2

Vous pouvez essayer ulimit man ulimitavec l'option -n, mais la page mag ne permet pas à la plupart des OS de définir cela.

Vous pouvez définir une limite de descriptions de fichiers à l'échelle du système en utilisant sysctl -w fs.file-max=Net faire persister les modifications après le démarrage dans/etc/sysctl.conf

Cependant, je suggérerais également d'examiner le processus pour voir s'il doit vraiment avoir autant de fichiers ouverts à un moment donné, et si vous pouvez en fait fermer certains fichiers et être plus efficace dans le processus.

Oneiroi
la source
Le fichier ouvert est un bug, mais je n'ai pas pu le comprendre. Alors que j'adorerais le faire, la production se bloque périodiquement en milieu de journée.
kāgii
ulimitn'applique pas de paramètres aux processus en cours d' exécution .
try-catch-finally
0

Le processus peut modifier ses propres limites logicielles s'il est programmé pour le faire (ou si vous parvenez à le pirater), mais il ne peut pas augmenter ses limites matérielles à moins qu'il n'ait la capacité CAP_SYS_RESOURCE. Vous pouvez inspecter les limites lors de l'exécution dans /proc/$pid/limits.

Tobu
la source