Question

J'utilise RRDTool ( http://oss.oetiker.ch/rrdtool/ ) en tant que back-end graphique pour le stockage des métriques de performance. Cela se fait via la CLI RRDTool à partir d’un script Python.

Mon problème est que le script est multithread et que chaque thread met à jour le RRD à un rythme assez rapide. Parfois, une mise à jour échoue car un thread accède au fichier RRD, tandis qu'un autre tente d'y accéder également.

J'avais l'impression que c'était acceptable d'essayer puisque RRDTool utilise son propre mécanisme de verrouillage, mais je suppose que ce n'est pas vrai.

Quelqu'un at-il une bonne approche pour l'accès simultané à un RRD?

Je peux penser à quelques solutions:

  1. demandez à 1 thread de créer une file d'attente et alimentez le RRD à partir d'un seul thread.

  2. crée mon propre mécanisme de verrouillage dans le script Python. (comment ferais-je cela?)

avez-vous quelque chose de mieux ou avez-vous déjà rencontré ce problème auparavant?

Était-ce utile?

La solution

Un verrou exclusif devrait suffire à résoudre ce problème:

Définissez votre objet de verrouillage au niveau principal, pas au niveau du thread, et vous avez terminé.

Modifier dans la réponse au commentaire:

si vous définissez votre verrou ( lock = new Lock () ) au niveau du thread, vous aurez un objet de verrouillage par thread en cours d'exécution et vous souhaiterez réellement un verrou unique pour le fichier rrdtool met à jour , cette définition doit donc être au niveau principal.

Autres conseils

Vous pouvez également essayer d’utiliser rrdcached pour effectuer les mises à jour. Ensuite, toutes les mises à jour en écriture seront sérialisées via rrdcached. Lorsque vous souhaitez lire le RRD pour générer des graphiques, vous indiquez au démon de le vider. Le RRD sur disque représente alors le dernier état.

Tous les outils RRD le feront de manière transparente s’ils sont dirigés vers le démon mis en cache via une variable d’environnement.

Ce fil dans rrd- La liste des utilisateurs peut être utile. L'auteur de rrdtool déclare que le verrouillage de fichier traite les lectures et écritures simultanées.

Je suggérerais d'utiliser rrdcached , ce qui améliorera également les performances de votre collecteur de données. Les dernières versions de rrdtool (1.4.x) ont considérablement amélioré les fonctionnalités et les performances de rrdcached . vous pouvez également optimiser le comportement de la mise en cache en fonction de vos données.

Nous utilisons beaucoup rrdcached ici, avec plusieurs centaines de mises à jour par seconde sur un grand nombre de fichiers RRD.

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