Descripteurs de fichier ouverts maximum pratiques (ulimit -n) pour un système à volume élevé


76

Nous avons récemment commencé à tester en charge notre application et avons constaté qu’elle manquait de descripteurs de fichier au bout de 24 heures environ.

Nous utilisons RHEL 5 sur un Dell 1955:

Processeur: 2 x Dual Core 2,66 GHz 4 Mo de RAM 5150 / 1333FSB: 8 Go de RAM Disque dur: 2 x 160 Go de disques durs SATA 2,5 "

J'ai vérifié la limite du descripteur de fichier et celle-ci a été fixée à 1024. Étant donné que notre application pourrait potentiellement avoir environ 1 000 connexions entrantes ainsi que 1 000 connexions sortantes, cela semble assez faible. Sans parler des fichiers réels qui doivent être ouverts.

Ma première idée était simplement d’augmenter le paramètre ulimit -n de quelques ordres de grandeur, puis de relancer le test, mais je voulais connaître les conséquences possibles de la définition de cette variable trop élevée.

Existe-t-il des pratiques recommandées pour définir cette option autrement que de déterminer le nombre de descripteurs de fichier que notre logiciel peut théoriquement ouvrir?

Réponses:


73

Ces limites provenaient d'une époque où plusieurs utilisateurs "normaux" (et non des applications) partageaient le serveur, et nous avions besoin de moyens pour les protéger contre l'utilisation excessive de ressources.

Ils sont très faibles pour les serveurs hautes performances et nous les fixons généralement à un nombre très élevé. (24k ou plus) Si vous avez besoin de nombres plus élevés, vous devez également changer l'option sysctl file-max (généralement limitée à 40k sur ubuntu et 70k sur rhel).

Réglage ulimit:

# ulimit -n 99999

Fichiers Sysctl max:

#sysctl -w fs.file-max=100000

De plus, il est très important que vous deviez vérifier si votre application présente une fuite de descripteur de fichier / mémoire. Utilisez lsof pour voir tout ce qu'il a ouvert pour voir si elles sont valides ou non. N'essayez pas de changer votre système pour contourner les bogues liés aux applications.


1
@sucuri Merci. Nous sommes vraiment préoccupés par les fuites de ressources, mais cela ne semble pas être le cas. Nous surveillons Lsof et Netstat et, même si les chiffres sont élevés, leur nombre ne croît pas, ils se développent et se contractent. Je pense qu'en cas de fuite, le nombre de sockets ou de descripteurs ouverts continuerait à augmenter avec le temps.
Kevin

2
La ulimitlimite n'est pas par utilisateur, mais par processus! Voir unix.stackexchange.com/questions/55319/… Et le fs.file-maxparamètre est pour le serveur dans son ensemble (donc tous les processus ensemble).
Tonin

15

Tu pourrais toujours juste

cat /proc/sys/fs/file-nr

Pendant la situation de «forte charge», voyez combien de descripteurs de fichiers sont utilisés.

Au maximum, cela dépend de ce que vous faites.


Ici, je pensais que 143000 était assez bon quand la commande ci-dessus m'a montré 8288 0 793377!
Sridhar Sarnobat

6

Si les descripteurs de fichier sont des sockets TCP, etc., vous risquez d’utiliser une grande quantité de mémoire pour les tampons de socket et autres objets du noyau; cette mémoire ne sera pas échangeable.

Mais sinon, non, en principe, il ne devrait pas y avoir de problème. Consultez la documentation du noyau pour essayer de connaître la quantité de mémoire qu'il utilisera et / ou testez-la.

Nous exécutons des serveurs de base de données avec environ 10 000 descripteurs de fichier ouverts (principalement sur des fichiers de disque réels) sans problème majeur, mais ils sont en 64 bits et disposent de beaucoup de RAM.

Le paramètre ulimit est défini par processus, mais il existe également une limite système (32k par défaut, je pense)


2

Je ne suis personnellement pas au courant de meilleures pratiques. C'est un peu subjectif en fonction de la fonction du système.

Rappelez-vous que 1024 que vous voyez est une limite par utilisateur et non une limite à l'échelle du système. Considérez le nombre d'applications que vous exécutez sur ce système. Est-ce le seul? L'utilisateur qui exécute cette application fait-il autre chose? (IE, avez-vous des humains utilisant ce compte pour vous connecter et exécuter des scripts potentiellement fugitifs?)

Étant donné que la boîte de dialogue n’exécute que cette seule application et que le compte exécutant ladite application n’est utilisé qu’à cette fin, je n’ai aucun mal à augmenter votre limite, comme vous le suggérez. Si c'est une équipe de développement interne, je demanderais leur avis. S'ils proviennent d'un fournisseur tiers, ils peuvent avoir des exigences ou des recommandations spécifiques.


@Grahamux Le système est dédié à cette application et l'utilisateur qui l'exécute n'exécute que cette application. Je fais partie de l'équipe de développement interne, donc aucune aide là-bas.
Kevin

La limite n'est pas par utilisateur, mais par processus. Voir unix.stackexchange.com/questions/55319/…
Tonin

1

Cela me semble répondre à l’une de ces questions par "le tester dans un environnement de développement". Je me souviens que, il y a des années, Sun était nerveux lorsque vous vous êtes planté, mais pas si nerveux. Sa limite à l'époque était également de 1024, donc je suis un peu surpris de voir que c'est la même chose maintenant pour Linux, il semble que cela devrait être plus élevé.

J'ai trouvé le lien suivant éducatif lorsque j'ai cherché sur Google les réponses à votre question: http://www.netadmintools.com/art295.html

Et celui-ci aussi: https://stackoverflow.com/questions/1212925/on-linux-set-maximum-open-files-to-unlimited-possible

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.