Comment résoudre l’erreur « Trop de fichiers ouverts » sous Linux

Comment résoudre l’erreur « Trop de fichiers ouverts » sous Linux

Sur les ordinateurs Linux, les ressources système sont partagées entre les utilisateurs. Essayez d’utiliser plus que votre juste part et vous atteindrez la limite supérieure. Vous pouvez également devenir un goulot d’étranglement pour d’autres utilisateurs ou processus.

Ressources système partagées

Parmi d’innombrables tâches, le noyau d’un ordinateur Linux est toujours occupé à surveiller qui utilise la quantité de ressources système finies telles que la RAM et les cycles du processeur. Un système multi-utilisateurs nécessite une attention constante pour s’assurer que les personnes et les processus n’utilisent aucune ressource système plus que nécessaire.

Par exemple, il est injuste que quelqu’un utilise tellement de temps CPU que l’ordinateur semble lent pour tout le monde. Même si vous êtes la seule personne à utiliser votre machine Linux, des limites sont imposées aux ressources que vos processus peuvent utiliser. Après tout, vous n’êtes qu’un autre utilisateur.

Certaines ressources système sont bien connues et évidentes, telles que la RAM, les cycles du processeur et l’espace disque. Mais il existe de nombreuses autres ressources qui sont surveillées et pour lesquelles chaque utilisateur ou chaque processus appartenant à un utilisateur a une limite supérieure définie. L’un d’eux est le nombre de fichiers que le processus peut ouvrir en même temps.

Si vous avez déjà vu le message d’erreur « Trop de fichiers ouverts » dans une fenêtre de terminal ou si vous l’avez trouvé dans les journaux système, cela signifie que la limite supérieure a été atteinte et que le processus n’est plus autorisé à ouvrir des fichiers.

Vous avez ouvert non seulement des fichiers

Il existe une limite à l’échelle du système sur le nombre de fichiers ouverts que Linux peut gérer. Comme nous le verrons, c’est un très grand nombre, mais il y a quand même une limite. Chaque processus utilisateur dispose d’une sélection qu’il peut utiliser. Chacun d’eux reçoit une petite part du montant total du système qui lui est alloué.

Ce qui ressort vraiment, c’est le nombre de descripteurs de fichiers. Un descripteur est requis pour chaque fichier ouvert. Même avec une allocation de ressources assez généreuse, les descripteurs de fichiers à l’échelle du système peuvent être utilisés plus rapidement que vous ne le pensez.

Linux résume presque tout pour que cela ressemble à un fichier. Parfois, il ne s’agira que d’anciens fichiers. Mais d’autres actions, telles que l’ouverture d’un répertoire, utilisent également un descripteur de fichier. Linux utilise des fichiers spéciaux en mode bloc comme une sorte de pilote pour les périphériques matériels. Les fichiers spéciaux de caractères sont très similaires, mais ils sont plus couramment utilisés avec des périphériques qui ont un concept de bande passante, tels que des canaux et des ports série.

Les fichiers de blocs spéciaux traitent des blocs de données en même temps, et les fichiers de symboles spéciaux traitent chaque caractère séparément. Ces deux fichiers spéciaux ne sont accessibles qu’à l’aide de descripteurs de fichiers. Les bibliothèques utilisées par un programme utilisent un descripteur de fichier, les threads utilisent un descripteur de fichier et les connexions réseau utilisent un descripteur de fichier.

L’abstraction de toutes ces différentes exigences afin qu’elles apparaissent sous forme de fichiers facilite l’interaction avec elles et permet à des éléments tels que les pipelines et les flux de fonctionner.

Vous pouvez voir dans les coulisses que Linux ouvre des fichiers et n’utilise que des descripteurs de fichiers pour s’exécuter – sans parler de vos processus utilisateur. Le nombre de fichiers ouverts n’est pas seulement le nombre de fichiers que vous avez ouverts. Presque tout dans le système d’exploitation utilise des descripteurs de fichiers.

Limites des descripteurs de fichiers

Avec cette commande, vous pouvez voir le nombre maximum système de descripteurs de fichiers.

cat /proc/sys/fs/file-max

Cela renvoie un nombre absurdement grand de 9,2 quintillions. C’est le maximum théorique du système. Il s’agit de la valeur maximale que vous pouvez stocker dans un entier signé 64 bits. Que votre pauvre ordinateur puisse gérer autant de fichiers ouverts en même temps est une tout autre affaire.

Au niveau de l’utilisateur, il n’y a pas de valeur explicite pour le nombre maximum de fichiers ouverts que vous pouvez avoir. Mais on peut grosso modo s’en sortir. Pour connaître le nombre maximum de fichiers qu’un de vos processus peut ouvrir, nous pouvons utiliser ulimitla commande avec l’ -noption (open files).

ulimit -n

Et pour trouver le nombre maximum de processus qu’un utilisateur peut avoir, nous utiliserons l’ ulimitoption -u(processus utilisateur) .

ulimit -u

Multiplier 1 024 par 7 640 donne 7 823 360. Bien sûr, bon nombre de ces processus sont déjà utilisés par votre environnement de bureau et d’autres processus d’arrière-plan. C’est donc un autre maximum théorique que vous n’atteindrez jamais.

Le chiffre important est le nombre de fichiers que le processus peut ouvrir. Par défaut, il s’agit de 1024. Il convient de noter qu’ouvrir le même fichier 1024 fois en même temps équivaut à ouvrir 1024 fichiers différents en même temps. Une fois que vous avez utilisé tous vos descripteurs de fichiers, vous avez terminé.

Vous pouvez ajuster le nombre de fichiers qu’un processus peut ouvrir. Il y a en fait deux valeurs à considérer lors de la définition de ce nombre. L’un d’eux est la valeur actuellement définie ou que vous essayez de définir. C’est ce qu’on appelle la limite souple. Il existe également une limite stricte, et c’est le maximum auquel vous pouvez augmenter la limite souple.

Vous pouvez y penser de cette façon : la limite souple est en fait la « valeur actuelle » et la limite supérieure est la valeur maximale que la valeur actuelle peut atteindre. Un utilisateur normal non root peut augmenter sa limite logicielle à n’importe quelle valeur jusqu’à sa limite stricte. L’utilisateur root peut augmenter sa limite stricte.

Pour afficher les limites logicielles et strictes actuelles, utilisez ulimitles options -S(soft) et -H(hard), ainsi que l’ -noption (open files).

ulimit -Snulimit -Hn

Pour créer une situation où nous pouvons voir la limite souple appliquée, nous avons créé un programme qui ouvre à plusieurs reprises les fichiers jusqu’à ce qu’il échoue. Il attend ensuite qu’une touche soit enfoncée avant de supprimer tout descripteur de fichier en cours d’utilisation. Le programme s’appelle open-files.

./open-Files

Il ouvre 1021 fichiers et échoue lors de la tentative d’ouverture du fichier 1022.

1024 moins 1021 égale 3. Qu’est-il arrivé aux trois autres descripteurs de fichier ? Ils ont été utilisés pour les flux STDIN, STDOUTet. STDERRIls sont créés automatiquement pour chaque processus. Ils ont toujours les valeurs de descripteur de fichier 0, 1 et 2.

Nous pouvons les voir en utilisant lsofla commande avec le -pparamètre (process) et l’ID de processus du open-filesprogramme. De manière pratique, il imprime son ID de processus dans la fenêtre du terminal.

lsof -p 11038

Bien sûr, dans une situation réelle, vous ne saurez peut-être pas quel processus a mangé tous les descripteurs de fichiers. Pour démarrer une enquête, vous pouvez utiliser cette séquence de commandes. Il vous indiquera les quinze utilisateurs de descripteurs de fichiers les plus actifs sur votre ordinateur.

lsof | awk '{ print $1 ""$2; }' | sort -rn | uniq -c | sort -rn | head -15

Pour voir plus ou moins d’entrées, ajustez le -15paramètre de commande head. Une fois que vous avez identifié le processus, vous devez savoir s’il est devenu illégal et ouvre trop de fichiers parce qu’il est hors de contrôle, ou s’il a vraiment besoin de ces fichiers. S’il en a besoin, vous devez augmenter la limite des descripteurs de fichiers.

Augmenter la limite souple

Si nous augmentons la limite souple et exécutons à nouveau notre programme, nous devrions voir qu’il ouvre plus de fichiers. Nous utiliserons ulimitla commande et le paramètre -n(fichiers ouverts) avec une valeur numérique de 2048. Ce sera la nouvelle limite souple.

ulimit -n 2048

Cette fois, nous avons réussi à ouvrir 2045 fichiers. Comme prévu, c’est trois de moins que 2048 en raison des descripteurs de fichiers utilisés pour STDIN, STDOUTet STDERR.

Faire des changements permanents

L’augmentation de la limite souple n’affecte que le shell actuel. Ouvrez une nouvelle fenêtre de terminal et vérifiez la limite souple. Vous verrez qu’il s’agit de l’ancienne valeur par défaut. Mais il existe un moyen de définir globalement une nouvelle valeur par défaut pour le nombre maximum de fichiers ouverts qu’un processus peut avoir, qui est constant et survit à un redémarrage.

Les conseils hérités recommandent souvent de modifier des fichiers tels que « /etc/sysctl.conf » et « /etc/security/limits.conf ». Cependant, sur les distributions basées sur systemd, ces modifications ne fonctionnent pas de manière cohérente, en particulier pour les sessions de connexion graphique.

La technique présentée ici est un moyen de le faire sur des distributions basées sur systemd. Nous devons travailler avec deux fichiers. Le premier est le fichier « /etc/systemd/system.conf ». Nous devrons utiliser sudo.

sudo gedit /etc/systemd/system.conf

Recherchez la ligne contenant la chaîne « DefaultLimitNOFILE ». Supprimez le signe dièse « # » au début de la ligne et remplacez le premier nombre par ce que vous voulez que votre nouvelle limite souple de processus soit. Nous avons choisi 4096. Le deuxième nombre sur cette ligne est la limite stricte. Nous ne l’avons pas réglementé.

Enregistrez le fichier et fermez l’éditeur.

Nous devons répéter cette opération avec le fichier « /etc/systemd/user.conf ».

sudo gedit /etc/systemd/user.conf

Apportez les mêmes modifications à la ligne contenant la chaîne « DefaultLimitNOFILE ».

Enregistrez le fichier et fermez l’éditeur. Vous devez soit redémarrer votre ordinateur, soit utiliser systemctlla commande avec un daemon-reexecparamètre pour le relancer systemdet accepter les nouveaux paramètres.

sudo systemctl daemon-reexec

L’ouverture d’une fenêtre de terminal et la vérification de la nouvelle limite devraient afficher la nouvelle valeur que vous avez définie. Dans notre cas, c’était 4096.

ulimit -n

Nous pouvons vérifier s’il s’agit d’une valeur de travail active en réexécutant notre programme gourmand en fichiers.

./open-Files

Le programme ne peut pas ouvrir le fichier numéro 4094, c’est-à-dire que 4093 fichiers ont été ouverts. C’est notre valeur attendue, 3 de moins que 4096.

Tout est un dossier

C’est pourquoi Linux est si dépendant des descripteurs de fichiers. Maintenant, si vous commencez à en manquer, vous savez comment augmenter votre quota.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *