web-dev-qa-db-fra.com

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

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

Et y a-t-il un impact important sur les performances si vous définissez un nombre très élevé de descripteurs de fichiers maximum, si votre système n'ouvre jamais de très nombreux fichiers?

33
bantic

file-max est le nombre maximal de descripteurs de fichiers (FD) appliqué au niveau du noyau, qui ne peut pas être dépassé par tous les processus sans augmenter. ulimit est appliqué au niveau du processus, qui peut être inférieur à 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 élevé, alors que dans le passé, il fallait recompiler et modifier le noyau pour passer au-delà de 1024. Je n'augmenterais pas à l'échelle du système, sauf si vous avez un besoin technique.

La configuration par processus doit souvent être ajustée pour servir un démon particulier, que ce soit une base de données ou un serveur Web. Si vous supprimez complètement la limite, ce démon pourrait potentiellement épuiser toutes les ressources système disponibles; ce qui signifie que vous ne pourrez pas 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 est susceptible d'entraîner la corruption de tout fichier ouvert.

31
Warner

La limitation d'ulimit est par utilisateur unique. Ainsi, user1, quel que soit le nombre de connexions ou de processus en cours, serait limité à 1024. Il est combiné.

Je ne sais pas si je comprends parfaitement le sens de cette phrase (l'anglais n'est pas ma langue maternelle) Si cette phrase signifie que la configuration ulimit pour les descripteurs de fichiers 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 seront lancés par cet utilisateur.

Par exemple:

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

Voici un exemple 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 fichiers 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.

12
Gooseman