Trop de fichiers ouverts sur Debian

15

J'ai un long processus en cours chez Debian. À un moment donné, lancez une erreur:

Trop de fichiers ouverts.

Fonctionnement:

ulimit -a

spectacles:

fichiers ouverts (-n) 1024

Je souhaite augmenter le nombre de fichiers ouverts en 2 fois. Après l'exécution

ulimit -n 2048

la limite est active jusqu'à la fin de ma session, ce qui n'est pas applicable à la tâche.

Comment puis-je augmenter de façon permanente le nombre de fichiers ouverts?

FoxyBOA
la source

Réponses:

12

Si votre processus est démarré via un script, vous pouvez placer l'appel à ulimit dans le script juste avant d'exécuter le démon.

Si vous souhaitez augmenter l'ulimit pour votre utilisateur ou pour tous les utilisateurs, vous pouvez définir des limites qui sont appliquées via pam_limitslors de la connexion. Ils sont installés /etc/security/limits.conf. Dans votre cas, vous pourriez faire quelque chose comme:

*               hard    nofile             2048

Notez que "dur" désigne une limite stricte - qui ne peut pas être dépassée et ne peut pas être modifiée. Une limite logicielle peut être modifiée par un utilisateur (par exemple, quelqu'un sans capacité root), mais pas au-delà de la limite matérielle.

Lisez le limits.confpour plus d'informations sur l'utilisation pam_limits.

Daniel Lawson
la source
Aux conf conf j'ai 2 lignes: * nofile souple 4096 * nofile dur 8192 qui n'ont aucun effet.
FoxyBOA
Et vous vous êtes déconnecté et reconnecté depuis les avoir testés? Cela signifie que vous vous déconnecterez directement de X / GNOME / KDE, etc., si vous essayez ceci sur une machine locale
Daniel Lawson
Oui. /etc/security/limits.conf ne fonctionne pas pour moi. J'essaierai la deuxième approche.
FoxyBOA
3
/etc/security/limits.conf ne fonctionne que pour les services qui utilisent pam et le module pam pam_limits (voir /etc/pam.d/ pour la configuration PAM de chaque service et /etc/pam.d/common-* en particulier) . Il concerne donc toutes les sessions utilisateur créées par sshd, gdm, login, etc. Il ne concerne pas tous les programmes démarrés au démarrage ...
Raphaël Hertzog
J'ai dit quelque chose à cet effet, mais merci de l'avoir clarifié. L'OP n'a pas précisé s'il s'agit d'un service ou d'un processus exécuté par son utilisateur.
Daniel Lawson
13

Il y a aussi un "total max" de fichiers ouverts défini dans le noyau, vous pouvez vérifier le paramètre actuel avec:

cat /proc/sys/fs/file-max 

Et définissez une nouvelle valeur avec:

echo "104854" > /proc/sys/fs/file-max

Si vous souhaitez conserver la configuration entre les redémarrages, ajoutez

sys.fs.file-max=104854

à

/etc/sysctl.conf

Pour vérifier l'utilisation maximale actuelle du fichier:

[root@srv-4 proc]# cat /proc/sys/fs/file-nr
3391    969     52427
|        |       |
|        |       |
|        |       maximum open file descriptors
|        total free allocated file descriptors
total allocated file descriptors
(the number of file descriptors allocated since boot)
rkthkr
la source
1
Notez que si des descripteurs de fichiers alloués gratuitement s'affichent 0, cela signifie simplement que le nombre de
mardi
Mine montre quelques chiffres obscènes ici: 49152 0 18446744073709551615 . Je ne comprends pas pourquoi les deux premières colonnes ne correspondent pas à la troisième. Et si j'ai 1 800 milliards de milliards disponibles, je ne vois pas comment je les ai tous utilisés.
mlissner
4

Comme d'autres l'ont dit, vous pouvez appliquer des limites spécifiques par utilisateur ou groupe dans /etc/security/limits.conf.

Remarque: ulimit -n affiche la limite souple.

ulimit -H -n 

vous montrera la limite stricte.

Cela rend la sortie ulimit -a et ulimit -n assez déroutante si, par exemple, vous augmentiez le nombre de fichiers de 1024 à 4096, comme vous vous attendez à voir la sortie de limite stricte, mais vous voyez toujours 1024, qui est le soft limite.

N'oubliez pas non plus que ces limites sont appliquées par connexion, alors reconnectez-vous dans un nouveau shell et vérifiez vos modifications, ne vous attendez pas à ce qu'elles soient propagées aux connexions existantes.

Tom Feiner
la source
2

Sachez que si vous exécutez votre processus en paramétrant start-stop-daemon, ulimits dans /etc/security/limits.conf ne fonctionne pas. Si vous souhaitez par exemple augmenter la limite de fichiers ouverts pour tomcat à 20000, vous devez les ajouter aux lignes /etc/default/tomcat:

ulimit -Hn 32768
ulimit -Sn 32768

J'ai rencontré ce problème sur debian 6.0.4. Pour les autres processus, les réponses données devraient aider.

Janning
la source
1

Cela dépend de la façon dont vous démarrez votre processus de longue durée. S'il est démarré au démarrage (via les scripts /etc/rcX.d/*), vous devez mettre un appel ulimit dans votre script de démarrage car la limite par défaut est définie par le noyau et n'est pas ajustable sans la recompiler.

L'utilisation /etc/security/limits.confpourrait fonctionner si vous l'utilisez cronpar exemple avec une entrée comme celle-ci:

@reboot $HOME/bin/my-program

Cela devrait fonctionner car /etc/pam.d/cron active pam_limits.so.

Raphaël Hertzog
la source
-1

Vous pouvez l'ajouter dans /etc/security/limits.conf

root soft nofile 100000
root hard nofile 100000

enregistrez puis redémarrez.

kxmp
la source
3
Y a-t-il quelque chose de nouveau ici qui ne figure pas dans la réponse acceptée à cette question vieille de 5 ans?
Andrew Schulman
-2

Une très bonne commande est ulimit -nmais il y a un problème avec trop de connexion et trop de fichiers ouverts:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 519357
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
bavarder
la source
J'ai essayé de nettoyer votre réponse, mais je ne sais toujours pas ce que vous essayez de dire à la question des affiches originales. Pouvez-vous essayer de nettoyer cela davantage?
slm
C'est aussi la sortie de ulimit -a, non ulimit -n.
Yvan