10 jeux amusants à jouer dans le terminal Linux
Agence web » Actualités du digital » 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 une limite supérieure. Vous pouvez également engorger d’autres utilisateurs ou processus.

Ressources système partagées

Parmi ses autres millions de tâches, le noyau d’un ordinateur Linux est toujours occupé à regarder qui utilise combien de ressources système finies, telles que la RAM et les cycles CPU. Un système multi-utilisateurs nécessite une attention constante pour s’assurer que les personnes et les processus n’utilisent pas plus d’une ressource système donnée que ce qui est approprié.

Il n’est pas juste, par exemple, que quelqu’un accapare tellement de temps CPU que l’ordinateur semble lent pour tout le monde. Même si vous êtes la seule personne à utiliser votre ordinateur Linux, des limites sont fixées pour les 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, comme la RAM, les cycles CPU et l’espace disque dur. Mais il y a beaucoup, beaucoup plus de ressources qui sont surveillées et pour lesquelles chaque utilisateur – ou chaque appartenant à l’utilisateur traiter— a une limite supérieure définie. L’un d’eux est le nombre de fichiers qu’un 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 vos journaux système, cela signifie que la limite supérieure a été atteinte et que le processus n’est plus autorisé à ouvrir d’autres fichiers.

Ce ne sont pas seulement les fichiers que vous avez ouverts

Il existe une limite à l’échelle du système au nombre de fichiers ouverts que Linux peut gérer. C’est un très grand nombre, comme nous le verrons, 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é.

Ce qui est réellement alloué est un certain nombre de descripteurs de fichiers. Chaque fichier ouvert nécessite un handle. Même avec des allocations assez généreuses, à l’échelle du système, les descripteurs de fichiers peuvent s’épuiser plus rapidement que vous ne l’imaginez au premier abord.

Linux résume presque tout pour qu’il apparaisse comme s’il s’agissait d’un fichier. Parfois, il ne s’agira que de vieux 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 souvent utilisés avec des périphériques qui ont un concept de débit, tels que des canaux et des ports série.

Les fichiers spéciaux de blocs gèrent des blocs de données à la fois et les fichiers spéciaux de caractères gèrent 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 flux utilisent des descripteurs de fichier et les connexions réseau utilisent des descripteurs de fichier.

L’abstraction de toutes ces différentes exigences afin qu’elles apparaissent sous forme de fichiers simplifie l’interfaçage avec elles et permet à des éléments tels que la tuyauterie et les flux de fonctionner.

Vous pouvez voir que dans les coulisses, Linux ouvre des fichiers et utilise des descripteurs de fichiers uniquement 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 du descripteur de fichier

Le nombre maximum de descripteurs de fichiers à l’échelle du système peut être vu avec cette commande.

cat /proc/sys/fs/file-max

Trouver le maximum du système pour les fichiers ouverts

Cela renvoie un nombre ridiculement grand de 9,2 quintillions. C’est le maximum théorique du système. C’est la plus grande valeur possible que vous puissiez contenir dans un entier signé 64 bits. Que votre pauvre ordinateur puisse réellement gérer autant de fichiers ouverts en même temps est une 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 le ulimit commande avec le -n (fichiers ouverts).

ulimit -n

Recherche du 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 le -u (processus utilisateur).

ulimit -u

Trouver le nombre de processus qu'un utilisateur peut avoir

Multiplier 1024 et 7640 nous donne 7 823 360. Bien sûr, bon nombre de ces processus seront 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, et celui 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 s’agit 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 descripteurs 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 à considérer lorsque vous ajustez ce nombre. L’un est la valeur sur laquelle il est actuellement défini ou sur lequel vous essayez de le définir. C’est ce qu’on appelle le limite souple. Il y a un limite dure aussi, et c’est la valeur la plus élevée à laquelle vous pouvez augmenter la limite souple.

La façon de penser à cela est que la limite souple est vraiment la « valeur actuelle » et la limite supérieure est la valeur la plus élevée que la valeur actuelle peut atteindre. Un utilisateur régulier, non root, peut augmenter sa limite logicielle à n’importe quelle valeur jusqu’à sa limite stricte. L’utilisateur root peut augmenter sa limite stricte.

Pour voir les limites logicielles et strictes actuelles, utilisez ulimit avec le -S (doux) et -H options (difficiles) et les -n (fichiers ouverts).

ulimit -Sn
ulimit -Hn

Recherche de la limite souple et dure pour les descripteurs de fichiers de processus

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 une frappe avant d’abandonner tous les descripteurs de fichiers qu’il a utilisés. Le programme s’appelle open-files.

./open-Files

Le programme de fichiers ouverts atteint la limite souple de 1024

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

1024 moins 1021 est égal à 3. Qu’est-il arrivé aux trois autres descripteurs de fichiers ? Ils ont été utilisés pour la STDIN, STDOUTet STDERR ruisseaux. Ils sont créés automatiquement pour chaque processus. Ceux-ci ont toujours des valeurs de descripteur de fichier de 0, 1 et 2.

Nous pouvons les voir en utilisant le lsof commande avec le -p (processus) 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

Les flux stdin, stdout et stderr et les descripteurs de fichiers dans la sortie de la commande lsof

Bien sûr, dans une situation réelle, vous ne savez peut-être pas quel processus vient d’engloutir tous les descripteurs de fichiers. Pour commencer votre enquête, vous pouvez utiliser cette séquence de commandes canalisées. Il vous indiquera les quinze utilisateurs les plus prolifiques de descripteurs de fichiers sur votre ordinateur.

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

Voir les processus qui utilisent le plus de descripteurs de fichiers

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

Augmentation de la limite souple

Si nous augmentons la limite souple et exécutons à nouveau notre programme, nous devrions le voir ouvrir plus de fichiers. Nous utiliserons le ulimit commande et le -n (fichiers ouverts) avec une valeur numérique de 2048. Ce sera la nouvelle limite souple.

ulimit -n 2048

Définition d'une nouvelle limite souple de descripteur de fichier pour les processus

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 , STDOUT et STDERR.

Apporter des 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 maximal de fichiers ouverts qu’un processus peut avoir, qui sont persistants et survivent aux redémarrages.

Des conseils obsolètes 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 présentée ici est la façon de le faire 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 devrons utiliser sudo .

sudo gedit /etc/systemd/system.conf

Modification du fichier system.conf

Recherchez la ligne contenant la chaîne « DefaultLimitNOFILE ». Supprimez le dièse « # » du début de la ligne et modifiez le premier nombre selon ce que vous voulez que votre nouvelle limite souple pour les processus soit. Nous avons choisi 4096. Le deuxième nombre sur cette ligne est la limite stricte. Nous n’avons pas ajusté cela.

La valeur DefaultLimitNOFILE dans le fichier system.conf

Enregistrez 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

Effectuez 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 le systemctl commande avec le daemon-reexec option pour que systemd est réexécuté et ingère les nouveaux paramètres.

sudo systemctl daemon-reexec

Redémarrage de systemd

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

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

Nous pouvons tester qu’il s’agit d’une valeur opérationnelle en direct en réexécutant notre programme gourmand en fichiers.

./open-Files

Vérification de la nouvelle limite souple 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 descripteurs de fichiers. Maintenant, si vous commencez à en manquer, vous savez comment augmenter votre quota.