5 votes

La queue peut-elle ralentir la vitesse d'écriture des journaux sous Linux (ext3) ?

Je me demande si tailf peut générer des E/S bloquantes qui ralentiront la réactivité du serveur en raison de la journalisation.

Par exemple, en supposant la configuration suivante :

Un serveur linux Debian 5.1 (foo) qui est géré via un terminal (foo est hébergé sur EC2).

Foo exécute plusieurs applications, chacune écrivant dans son propre fichier journal. A titre d'exemple, Apache httpd vers /var/log/apache/access.log & Tomcat 5.5 vers /var/log/tomcat5.5/myApp.log.

Si j'ouvre une connexion ssh à foo, (note : liaison Internet, latence élevée, téléchargement relativement lent) et que j'exécute tail -F /var/log/apache/access.log ne puis-je pas arriver à une situation où le noyau bloque les écritures de httpd dans ce fichier journal et ralentit ainsi les performances de httpd à cause de l'attente imposée à chaque thread ?

Pour donner quelques chiffres, supposons que foo enregistre ~200kb de données de journal par seconde qui doivent être poussées sur le fil vers le client ssh.

Un autre aspect théorique : Que se passerait-il si le système de fichiers /var/log était placé sur une RAM de taille infinie (rappelez-vous : en théorie) de sorte que le temps de recherche sur le disque dur soit éliminé ?

Troisièmement, que se passerait-il si j'ouvrais la connexion ssh à partir d'un lien très lent (supposons que foo est configuré pour n'envoyer que 5kb/s) ?

J'aimerais savoir ce que vous en pensez.

Merci pour votre lecture, Maxim.

3voto

Je ne pense pas qu'il y aura un blocage sur les E/S ici. Quand vous faites "tail -f", ce qui se passe c'est que

  1. votre processus Shell, disons bash, va créer un nouveau processus 'tail'.
  2. tail va ouvrir le fichier, déplacer le pointeur de fichier à la fin, attendre 3 secondes et vérifier s'il y a de nouvelles données.
  3. s'il y a de nouvelles données, tail les repoussera vers le bash en utilisant le pipe unix.
  4. ces données sont transmises du serveur à votre machine par bash + ssh.

Ainsi, comme vous pouvez le constater, une connexion Internet lente n'affectera pas l'étape 2, qui est de toute façon la clé des performances d'E/S.

De plus, tail ouvre le fichier en mode 'lecture seule' et, selon toute vraisemblance, les journaux sont ouverts en mode 'append-only', il ne devrait donc pas y avoir beaucoup de verrouillage à craindre. Si cela vous préoccupe toujours, vous pouvez essayer la méthode suivante inotail qui est basé sur la dernière api linux inotify pour éviter d'interroger le fichier.

J'espère que cela vous aidera, Alex

0voto

Kyle Brandt Points 81077

Je ne pense pas que ce soit probable. Je pense que les écritures seront mises en cache dans la mémoire vive et comme elles viennent d'être écrites, j'imagine que la queue lira également ces pages dans la mémoire vive. Les pages seront périodiquement synchronisées sur le disque. Je serais surpris qu'Apache bloque lui-même en attendant que les journaux soient écrits sur le disque.

0voto

Evan Langlois Points 179

La réponse correcte est que le processus qui lit le journal et celui qui l'écrit ne sont liés en aucune façon. Ce sont des processus distincts et non des threads. Ils ne partagent pas la mémoire et ont leurs propres poignées de fichier avec leurs propres pointeurs de poignée de fichier. Aucun n'affecte l'autre de quelque manière que ce soit. Le noyau n'arrêtera pas une écriture dans un fichier parce qu'un autre programme est en train de le lire. Il fera des choses pour l'accélérer (mise en cache de l'écriture dans la RAM lorsque le disque est occupé, partage du cache avec tous les descripteurs de fichiers qui utilisent ce fichier, etc), mais pas pour le ralentir !

L'autre réponse concernant le fonctionnement de la queue est à moitié juste. Elle n'utilise pas un pipe pour parler à bash. Bash est suspendu en attendant que tail se termine (sauf si elle est exécutée avec &). Tail hérite du descripteur de fichier "stdout" (connecté à votre terminal par défaut) de bash et y écrit directement. Il serait inefficace de le renvoyer à bash, de faire un changement de tâche vers bash pour lire les données, et de laisser bash écrire la sortie. Unix est conçu pour être simple et efficace, de stdin à stdout pour presque tout.

Les versions actuelles de GNU tail prennent entièrement en charge l'API inotify pour éviter l'interrogation. Normalement, cela ne fait pas une grande différence pour tail. C'est principalement pour que les gestionnaires de fichiers puissent mettre à jour les répertoires et que les serveurs sachent quand relire un fichier de configuration (sans redémarrer le serveur). Vous pouvez aussi faire en sorte que tail suive les rotations de logs (normalement il garde son descripteur de fichier). Un autre accessoire utile est "tac", qui inversera ses lignes d'entrée. Cela vous permet d'avoir les informations les plus récentes en haut lors du traitement d'un fichier journal pour l'affichage sur le web. Enfin, ccze colorisera vos fichiers de log pour une visualisation plus facile (ANSI ou HTML).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X