Question

Nous avons sous Linux une application qui utilise le mécanisme syslog . Après une semaine passée à essayer de comprendre pourquoi cette application fonctionnait plus lentement que prévu, nous avons découvert que si nous éliminions syslog et écrivions simplement dans un fichier journal, les performances s'amélioraient considérablement.

Je comprends pourquoi syslog est plus lent que les écritures directes sur fichier. Mais je me demandais: est-il possible de configurer syslog pour optimiser ses performances?

Était-ce utile?

La solution

Vous pouvez configurer syslogd (et au moins rsyslog) pour ne pas synchroniser les fichiers journaux après un message de journal en ajoutant un " - " au chemin du fichier journal dans le fichier de configuration. Cela accélère les performances au détriment du risque de perte des messages de journalisation en cas de blocage.

Autres conseils

Il existe plusieurs options pour améliorer les performances de syslog:

  • Optimisation des appels avec une macro

     int LogMask = LOG_UPTO(LOG_WARNING);
     #define syslog(a, ...) if ((a) & LogMask ) syslog((a), __VA_ARGS__)
    
     int main(int argc, char **argv)
     {
              LogMask = setlogmask(LOG_UPTO(LOG_WARNING));
              ...
     }
    

    L’utilisation d’une macro pour filtrer les appels syslog présente l’avantage de la totalité de l’appel. réduit à un saut conditionnel sur une variable globale, très utile si vous arrivez à avoir des appels DEBUG qui traduisent de grands ensembles de données via d'autres fonctions.

  • setlogmask ()

    setlogmask(LOG_UPTO(LOG_LEVEL))
    

    setlogmask () optimisera l'appel en ne se connectant pas à / dev / log, mais le programme continue d'appeler les fonctions utilisées comme arguments.

  • filtrer avec syslog.conf

     *.err                                               /var/log/messages
    

    "Consultez la page de manuel de syslog.conf pour plus de détails."

  • configurez syslog pour effectuer la journalisation asynchrone ou en mémoire tampon

    metalog utilisé pour mettre en tampon la sortie du journal et le vider par blocs. stock syslog et syslog-ng ne le faites pas autant que je sache.

Avant de vous lancer dans l'écriture de nouveaux démons, vous pouvez vérifier si syslog-ng est plus rapide (ou peut être configuré pour être plus rapide) que le vieux syslog ordinaire.

Une astuce que vous pouvez utiliser si vous contrôlez la source de l'application de journalisation consiste à masquer le niveau de journalisation souhaité dans l'application elle-même, plutôt que dans syslog.conf. Je l'ai fait il y a quelques années avec une application qui générait une quantité énorme de journaux de débogage. Plutôt que de supprimer les appels du code de production, nous avons simplement masqué pour que les appels de niveau de débogage ne soient jamais envoyés au démon. En fait, j’ai trouvé le code, c’est Perl mais c’est juste un front pour l’appel setlogmask (3).

use Sys::Syslog;
# Start system logging
# setlogmask controls what levels we're going to let get through.  If we mask
# them off here, then the syslog daemon doesn't need to be concerned by them
# 1   = emerg
# 2   = alert
# 4   = crit
# 8   = err
# 16  = warning
# 32  = notice
# 64  = info
# 128 = debug
Sys::Syslog::setlogsock('unix');
openlog($myname,'pid,cons,nowait','mail');
setlogmask(127); # allow everything but debug
#setlogmask(255); # everything
syslog('debug',"syslog opened");

Je ne sais pas pourquoi j'ai utilisé un nombre décimal au lieu d'un masque de masque ... haussement d'épaules

Écrivez votre propre implémentation de syslog. :-P

Cela peut être accompli de deux manières.

  1. Ecrivez votre propre crochet LD_PRELOAD pour remplacer les fonctions syslog et les rendre en sortie vers stderr . J'ai en fait écrit un article à ce sujet il y a de nombreuses années: http://marc.info/?m=97175526803720 :-P
  2. Écrivez votre propre démon syslog. Il suffit simplement de récupérer les datagrammes dans / dev / log ! :-P

D'accord, d'accord, ce sont donc des réponses facétieuses. Avez-vous profilé syslogd pour voir où il s’étouffe le plus?

Vous pouvez configurer le niveau (ou le service) de syslogd pour se connecter de manière asynchrone, en mettant un chemin moins avant dans le fichier journal (c'est-à-dire: utilisateur. * [tab] - / var / log / user.log).

A bientôt.

La mise en œuvre de syslog-async () peut être utile, au risque de perdre des lignes de journal / des délais limités à d’autres moments. http://thekelleys.org.uk/syslog-async/

Remarque: "asynchrone" désigne ici les événements de journal en file d'attente au sein de votre application, et non l'option de configuration du fichier de sortie asynchrone syslogd à laquelle d'autres réponses font référence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top