Comment résoudre l’erreur « Too Many Open Files » sous Linux ?

By Corentin BURTIN

Sur les ordinateurs Linux, les ressources du système sont partagées entre les utilisateurs. Essayez d’utiliser plus que votre part équitable et vous atteindrez une limite supérieure. Vous risquez également de gêner d’autres utilisateurs ou processus.

Ressources système partagées

Parmi ses milliards d’autres tâches, le noyau d’un ordinateur Linux est toujours occupé à surveiller qui utilise combien des ressources limitées du système, comme 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 pas plus de ressources système que nécessaire.

Il n’est pas juste, par exemple, qu’une personne accapare tellement de temps CPU que l’ordinateur semble lent pour tous les autres. Même si vous êtes la seule personne à utiliser votre ordinateur Linux, il existe des limites aux ressources que vos processus peuvent utiliser. Après tout, vous n’êtes qu’un utilisateur parmi d’autres.

Certaines ressources système sont bien connues et évidentes, comme la mémoire vive, les cycles du processeur et l’espace du disque dur. Mais il y a beaucoup, beaucoup d’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’une d’entre elles est le nombre de fichiers qu’un processus peut avoir ouvert en même temps.

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

COMMENT UTILISER LA COMMANDE NOHUP SOUS LINUX

Il n’y a pas que les fichiers que vous avez ouverts

Il y a une limite au niveau du système au nombre de fichiers ouverts que Linux peut gérer. C’est un très grand nombre, comme nous allons le voir, mais il y a quand même une limite. Chaque processus utilisateur dispose d’une allocation qu’il peut utiliser. Ils reçoivent chacun une petite part du total du système qui leur est allouée.

Ce qui est réellement alloué est un nombre de handles de fichiers. Chaque fichier qui est ouvert nécessite un gestionnaire. Même avec des allocations assez généreuses, à l’échelle du système, les gestionnaires de fichiers peuvent être utilisés plus rapidement que vous ne l’imaginez.

Linux fait abstraction de presque tout pour que cela apparaisse comme un fichier. Parfois, il ne s’agit que de simples fichiers. Mais d’autres actions, comme l’ouverture d’un répertoire, utilisent également un gestionnaire de fichier. Linux utilise les fichiers spéciaux de 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 souvent utilisés avec des périphériques qui ont un concept de débit, comme les tuyaux et les ports série.

Les fichiers spéciaux de blocs traitent des blocs de données à la fois et les fichiers spéciaux de caractères traitent chaque caractère séparément. On ne peut accéder à ces deux fichiers spéciaux qu’en utilisant des poignées de fichier. Les bibliothèques utilisées par un programme utilisent un gestionnaire de fichiers, les flux utilisent des gestionnaires de fichiers et les connexions réseau utilisent des gestionnaires de fichiers.

A lire également :   Comment partager et collaborer avec Google Drive

L’abstraction de toutes ces exigences différentes pour qu’elles apparaissent comme des fichiers simplifie l’interfaçage avec elles et permet à des choses comme le piping et les flux de fonctionner.

Vous pouvez voir qu’en coulisse, Linux ouvre des fichiers et utilise des gestionnaires de fichiers juste pour s’exécuter lui-même, sans tenir compte 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 gestionnaires de fichiers.

Limites des gestionnaires de fichiers

Le nombre maximal de gestionnaires de fichiers à l’échelle du système peut être visualisé à l’aide de cette commande.

cat /proc/sys/fs/file-max

Trouver le maximum du système pour les fichiers ouverts

Cette commande renvoie un chiffre grotesque de 9,2 quintillions. C’est le maximum théorique du système. C’est la plus grande valeur possible que vous pouvez contenir dans un entier signé de 64 bits. La question de savoir si votre pauvre ordinateur peut réellement faire face à autant de fichiers ouverts en même temps est une toute autre question.

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 l’évaluer grossièrement. Pour connaître le nombre maximum de fichiers qu’un de vos processus peut ouvrir, nous pouvons utiliser la commande ulimit avec l’option -n (fichiers ouverts).

ulimit -n

Trouver le nombre de fichiers qu’un processus peut ouvrir

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

ulimit -u

Trouver le nombre de processus qu’un utilisateur peut avoir

En multipliant 1024 et 7640, on obtient 7.823.360. Bien sûr, beaucoup de ces processus seront déjà utilisés par votre environnement de bureau et d’autres processus d’arrière-plan. Il s’agit donc d’un autre maximum théorique, que vous n’atteindrez jamais de manière réaliste.

Le chiffre important est le nombre de fichiers qu’un processus peut ouvrir. Par défaut, il est de 1024. Il convient de noter qu’ouvrir le même fichier 1024 fois simultanément revient à ouvrir 1024 fichiers différents simultanément. Une fois que vous avez utilisé tous vos gestionnaires de fichiers, vous avez terminé.

Il est possible d’ajuster le nombre de fichiers qu’un processus peut ouvrir. Il y a en fait deux valeurs à prendre en compte lorsque vous ajustez ce nombre. La première est la valeur actuelle ou celle à laquelle vous essayez de la fixer. C’est ce qu’on appelle la limite souple. Il existe également une limite stricte, qui est la valeur maximale à laquelle vous pouvez porter la limite souple.

A lire également :   Que signifie "optimiser" sur Telegram ?

La façon de voir les choses est la suivante : la limite souple est en fait la « valeur actuelle » et la limite supérieure est la valeur la plus élevée que la valeur actuelle peut atteindre. Un utilisateur normal, non root, peut augmenter sa limite douce à n’importe quelle valeur jusqu’à sa limite dure. L’utilisateur root peut augmenter sa limite stricte.

Pour voir les limites douce et dure actuelles, utilisez ulimit avec les options -S (douce) et -H (dure), et l’option -n (fichiers ouverts).

ulimit -Sn

ulimit -Hn

Trouver la limite douce et dure pour les handles de fichiers du processus

Pour créer une situation dans laquelle nous pouvons voir l’application de la limite souple, nous avons créé un programme qui ouvre des fichiers de manière répétée jusqu’à ce qu’il échoue. Il attend ensuite une frappe de touche avant de renoncer à tous les gestionnaires de fichiers qu’il a utilisés. Ce programme s’appelle open-files.

./open-Files

Le programme open-files atteint la limite souple de 1024 fichiers.

Il ouvre 1021 fichiers et échoue lorsqu’il essaie d’ouvrir le fichier 1022.

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

Nous pouvons les voir en utilisant la commande lsof avec l’option -p (process) et l’ID du processus du programme open-filesprogram. Pratiquement, il affiche son ID de processus dans la fenêtre du terminal.

lsof -p 11038

Les flux stdin, stdout, et stderr et les poignées de fichiers dans la sortie de la commande lsof.

Bien entendu, dans une situation réelle, il se peut que vous ne sachiez pas quel processus vient de s’emparer de tous les gestionnaires de fichiers. Pour commencer votre enquête, vous pouvez utiliser cette séquence de commandes pipées. Elle vous indiquera les quinze utilisateurs les plus prolifiques de handles de fichiers sur votre ordinateur.

lsof | awk ‘{ print $1  »  » $2 ; }’ | sort -rn | uniq -c | sort -rn | head -15

Affichage des processus qui utilisent le plus de gestionnaires de fichiers

Pour voir plus ou moins d’entrées, ajustez le paramètre -15 de la commande head. Une fois que vous avez identifié le processus, vous devez déterminer s’il s’est rebellé 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 sa limite de traitement des fichiers.

Augmentation de 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 allons utiliser la commande ulimit et l’option -n (fichiers ouverts) avec une valeur numérique de 2048. Ceci sera la nouvelle limite souple.

A lire également :   Les 10 meilleures versions d'Android

ulimit -n 2048

Définition d’une nouvelle limite souple pour les processus

Cette fois, nous avons réussi à ouvrir 2045 fichiers. Comme prévu, c’est trois de moins que 2048, à cause des handles de fichiers utilisés pour STDIN , STDOUT , et STDERR.

Modifications permanentes

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 soit persistante et survive aux redémarrages.

Des conseils dépassés vous 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 graphiques.

La technique montrée ici est la manière de faire cela sur les distributions basées sur systemd. Il y a deux fichiers avec lesquels nous devons travailler. Le premier est le fichier « /etc/systemd/system.conf ». Nous devons utiliser sudo .

sudo gedit /etc/systemd/system.conf

Édition du fichier system.conf

Recherchez la ligne qui contient la chaîne « DefaultLimitNOFILE ». Supprimez le dièse « # » du début de la ligne, et modifiez le premier chiffre pour qu’il corresponde à ce que vous voulez comme nouvelle limite souple pour les processus. Nous avons choisi 4096. Le second nombre sur cette ligne est la limite stricte. Nous ne l’avons pas modifié.

La valeur DefaultLimitNOFILE dans le fichier system.conf

Sauvegardez le fichier et fermez l’éditeur.

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

sudo gedit /etc/systemd/user.conf

Modification du fichier user.conf

Faites les mêmes ajustements sur la ligne contenant la chaîne « DefaultLimitNOFILE ».

La valeur DefaultLimitNOFILE dans le fichier user.conf

Enregistrez le fichier et fermez l’éditeur. Vous devez soit redémarrer votre ordinateur, soit utiliser la commande systemctl avec l’option daemon-reexec pour que systemd soit réexécuté et intègre les nouveaux paramètres.

sudo systemctl daemon-reexec

Redémarrage de systemd

Ouvrir une fenêtre de terminal et vérifier la nouvelle limite devrait montrer la nouvelle valeur que vous avez définie. Dans notre cas, c’était 4096.

ulimit -n

Vérification de la nouvelle limite souple avec ulimit -n

Nous pouvons vérifier qu’il s’agit d’une valeur opérationnelle en relançant notre programme de traitement des fichiers.

./open-Files

Vérification de la nouvelle limite douce avec le programme open-files

Le programme ne parvient pas à ouvrir le fichier numéro 4094, ce qui signifie que 4093 fichiers ont été ouverts. C’est notre valeur attendue, 3 de moins que 4096.
Tout est un fichier

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

Laisser un commentaire