En quoi ulimit -n et / proc / sys / fs / file-max diffèrent-ils?

32

Je remarque que sur une nouvelle image CentOS que je viens de démarrer à partir de EC2, la valeur par défaut ulimit est de 1024 fichiers ouverts, mais que / proc / sys / fs / file-max est défini sur 761 408 et je me demande comment ces deux limites fonctionnent. ensemble. Je suppose que ulimit -n est une limite par utilisateur du nombre de descripteurs de fichier alors que / proc / sys / fs / file-max concerne l'ensemble du système? Si tel est le cas, disons que je me suis connecté deux fois sous le même utilisateur - chaque utilisateur connecté a-t-il une limite de 1024 pour le nombre de fichiers ouverts, ou s'agit-il d'une limite de 1024 fichiers ouverts combinés entre chacun de ces utilisateurs connectés? chez les utilisateurs?

Et y at-il un impact considérable sur les performances de la définition d’un nombre très élevé de descripteurs de fichiers max, si votre système n’ouvre jamais beaucoup de fichiers?

bantic
la source
Tags ajoutés: ressources système noyau noyau linux bash
Warner

Réponses:

28

file-maxest le maximum de descripteurs de fichier (FD) appliqués au niveau du noyau, qui ne peut pas être dépassé par tous les processus sans augmentation. Le ulimitest appliqué au niveau du processus, ce qui peut être inférieur au file-max.

Il n'y a pas de risque d'impact sur les performances en augmentant file-max. Les distributions modernes ont le FD maximum défini assez haut, alors que dans le passé, il fallait recompiler et modifier le noyau pour dépasser 1024. Je n'augmenterais pas à l'échelle du système, sauf si vous avez un besoin technique.

La configuration par processus doit souvent être réglée pour servir un démon particulier, qu’il s’agisse d’une base de données ou d’un serveur Web. Si vous supprimez entièrement la limite, ce démon pourrait potentiellement épuiser toutes les ressources système disponibles. ce qui signifie que vous seriez incapable de résoudre le problème sauf en appuyant sur le bouton de réinitialisation ou en redémarrant. Bien sûr, l’un ou l’autre de ceux-ci est susceptible de corrompre les fichiers ouverts.

Warner
la source
Si je comprends bien, les limites par utilisateur définies avec ulimit sont les mêmes pour tous les utilisateurs? Existe-t-il un moyen d'utiliser différentes valeurs par utilisateur ou non?
Oliver
Oui, les paramètres peuvent être définis globalement et par utilisateur.
Warner
Si je comprends bien votre message, ce n'est pas vrai. Il est par processus généré par l'utilisateur xy et est limité par le système de fichiers maximum défini dans /etc/sysctl.conf
Jeredepp
3
La ulimitlimite n'est pas par utilisateur, mais par processus! Voir unix.stackexchange.com/questions/55319/…
Tonin
@Tonin - Oui, cette réponse est tout simplement fausse.
Nemo
11

La limitation de ulimit est par utilisateur unique. Ainsi, l'utilisateur1, quel que soit le nombre de fois connecté ou le nombre de processus en cours d'exécution, serait limité à 1024. Il est combiné.

Je ne suis pas sûr de bien comprendre le sens de cette phrase (l'anglais n'est pas ma langue maternelle). Si cette phrase signifie que la configuration ulimit des descripteurs de fichier n'est pas une limitation par processus, la réponse acceptée (AFAIK) est fausse.

Ce que je veux dire, c’est que si un utilisateur a lancé 4 processus et que la configuration ulimit pour les FD est de 1024, chaque processus peut ouvrir 1024 FD. L'utilisateur ne sera pas limité à 1024 FD, mais aux processus qui sont lancés par cet utilisateur.

Par exemple:

me@superme:~$ ulimit -n
1024
me@superme:~$ lsof | grep $USER | wc -l
8145

Voici un exemple de Perl où nous atteignons la limite (c'est une limite par processus):

#!/usr/bin/perl

$count = 0;
@filedescriptors;

while ($count <= 1024) {
    $FILE = ${count};
    open $FILE, ">", "/tmp/example$count" or die "\n\n FDs: $count $!";
    push(@filedescriptors, $FILE);
    $count ++;
}

Résultat:

FDs: 1021 Too many open files at ./test.pl line 8.

1021 car il y avait 3 descripteurs de fichier ouverts avant d'atteindre la boucle while (stdout, stdin et stderr)

Désolé si je me trompe complètement ou si j'ai mal compris la réponse.

Gooseman
la source
Alors tu as raison. La réponse de @ Warner est fausse dans ce sens car la limite est fixée pour chaque processus et non pour chaque utilisateur
filipenf