Comment contourner «Trop de fichiers ouverts» dans Debian

8

Si je veux voir tous les fichiers journaux pertinents de mon serveur apache2 à la fois, j'utilise

tail -f /var/kunden/logs/*log /var/kunden/logs/*log /var/log/apache2/*log |grep -v robots|grep -v favicon

Mais comme ce sont trop de fichiers à ce jour, je voudrais augmenter cette limite.

Comment puis-je l'augmenter pour une session ssh? Et comment pourrais-je l'augmenter globalement à l'échelle du système?

Je peux voir que la limite de fichiers ouverts est de 1024 sur ma machine:

ulimit -n
1024
rubo77
la source
Dépasser la limite de fichiers est souvent le signe d'un problème. Comme déjà indiqué, vous pouvez avoir un problème avec la rotation des journaux. (Le journal pivoté peut supprimer votre commande.) En dehors de / var / log / apache2, il ne devrait pas y avoir beaucoup (tout) journaux liés à votre serveur Apache. En fonction de votre modèle grep, vous souhaiterez probablement restreindre votre accès aux journaux d'accès.
BillThor
merci pour l'astuce, mais mon logrotaion fonctionne bien. J'ai tellement de journaux, car tous les 1025 domaines sur mon serveur ont leur propre fichier journal;)
rubo77
1
Vos modèles semblent récupérer également les journaux d'erreurs ainsi que les journaux d'accès. Cela devrait être un problème mineur si vous avez un seul journal des erreurs. Si vous laissez cela s'exécuter dans un shell, vous voudrez peut-être utiliser à la -Fplace de -fsorte que les journaux soient rouverts lorsqu'ils sont tournés.
BillThor

Réponses:

15

Il est important de savoir qu'il existe deux types de limites:

  • Une limite stricte est configurable uniquement par root. Il s'agit de la valeur (limite) la plus élevée possible pour la limite souple.
  • Une limite souple peut être définie par un utilisateur ordinaire. Il s'agit de la limite réelle en vigueur.

Solution pour une seule session

Dans la coque, définissez la limite souple:

ulimit -Sn 2048

Cet exemple augmentera la limite réelle à 2048 mais la commande réussira uniquement si la limite stricte (vérifier:) ulimit -Hnest identique ou supérieure. Si vous avez besoin de valeurs plus élevées, augmentez la limite stricte en utilisant l'une des méthodes ci-dessous. Les limites sont définies par processus et elles sont héritées par les processus nouvellement générés, donc tout ce que vous exécutez après cette commande dans le même shell aura les nouvelles limites.

Modification de la limite stricte en une seule session

Ce n'est pas facile car seul root peut modifier une limite stricte et après avoir basculé sur root, vous devez revenir à l'utilisateur d'origine. Voici la solution avec sudo:

sudo sh -c "ulimit -Hn 9000 ; exec su \"$USER\""

Solution à l'échelle du système

Dans Debian et de nombreux autres systèmes utilisant, pam_limitsvous pouvez définir les limites à l'échelle du système dans /etc/security/limits.confet dans les fichiers dans /etc/security/limits.d. Le fichier conf contient une description. Exemples de lignes:

@webadmins       hard     nofile     16384
@webadmins       soft     nofile      8192

Cela définira la limite fixe et la limite souple par défaut pour les utilisateurs du groupe webadminsaprès la connexion.

Autres limites

La valeur de limite stricte est limitée par la limite globale de la valeur des descripteurs de fichiers ouverts, /proc/sys/fs/file-maxqui est assez élevée par défaut dans les distributions Linux modernes. Cette valeur est limitée par la NR_OPENvaleur utilisée lors de la compilation du noyau.

N'y a-t-il pas une meilleure solution?

Vous pourriez peut-être vérifier si tous les *logfichiers que vous alimentez tail -fsont des fichiers vraiment actifs qui doivent être surveillés. Il est possible que certains d'entre eux soient déjà fermés pour la journalisation et vous pouvez simplement ouvrir un plus petit nombre de fichiers.

pabouk
la source
ulimit -Sn 4096 -bash: ulimit: fichiers ouverts: Kann die Grenze nicht ändern: Das Argument ist ungültig - signifie que l'argument n'est pas valide
rubo77
@ rubo77: J'ai ajouté des informations sur la limite stricte qui est probablement la cause du problème.
pabouk
@ rubo77: Il est également possible de définir la limite stricte dans une session shell, mais est-ce difficile car vous devez surooter et surevenir à l'utilisateur:su -c "ulimit -Hn 6000 ; su $USER"
pabouk
OK, donc pour un changement temporaire de la limite, j'utiliserai alors en ulimit -Hn 6000; ulimit -Sn 6000tant que root
rubo77
1
@amenthes Je suppose que vous voulez dire les fichiers de configuration /etc/limits.*. Ces limites sont appliquées à chaque pam_limits.soappel du module PAM . Normalement, c'est au début d'une session. Par exemple , dans Ubuntu 14.04 , il est dans ces outils / commandes: cron, login(texte connexion de la console), lightdm(la connexion GUI), su. Vous pouvez définir où est pam_limitsutilisé /etc/pam.*. Voir par exemple: faqs.org/docs/securing/chap5sec44.html
pabouk
0

J'ai eu l'avertissement PHP dans mon error.log Apache:

failed to open stream: Too many open files in ...

J'ai donc découvert qu'apache définit cette valeur individuellement lors du démarrage (sur mon Ubuntu 14.04). Il est configuré dans /etc/apache2/envvars. Ça dit:

## If you need a higher file descriptor limit, uncomment and adjust the
## following line (default is 8192):
#APACHE_ULIMIT_MAX_FILES='ulimit -n 65536'

j'ai donc dû ajuster la troisième ligne.

Michael
la source