#!⌨

RabbitMQ et l'espace disque

J'ai eu un bug vraiment très bizarre sur une de mes applications : une application web publiait des messages vers une queue RabbitMQ, tout à l'air de bien fonctionner mais la queue ne reçoit jamais ces messages. L'application comme RabbitMQ ont l'air de bien fonctionner, en tout cas, c'est ce que disent les logs. De plus, en analysant les trames, la communication réseau a l'air de bien se faire...

Après avoir tenté de reproduire le problème dans un autre environnement, je finis par me pencher plus en détails sur RabbitMQ. En lançant rabbitmqctl status, deux lignes m'intriguent :

Status of node rabbit@host ...
[{pid,666},
 ...
 {disk_free_limit,1000000000},
 {disk_free,764567552},
 ...
]
...done.

On voit qu'il y a une limite d'espace disque, et que l'espace disque actuel est en dessous de cette limite. En cherchant sur les deux mots clés disk_free_limit et disk_free, on constate qu'une fois cette limite d'espace disque dépassée, le serveur ignore les nouveaux messages de peur de remplir le disque. Par contre, j'aurais bien voulu trouver une trace de l'ignorance volontaire de ces messages dans mes logs.

Pour résoudre ce problème, deux solutions existent : vider le disque pour que l'espace disque libre passe au dessus de la limite de l'espace disque, ou baisser la limite. Dans la première solution, je vous laisse explorer votre disque à coup de du -hs *.

Pour la seconde, il s'agit de créer le fichier de configuration de RabbitMQ /etc/rabbitmq/rabbitmq.config avec le contenu suivant :

[
    {rabbit, [{disk_free_limit, 500000000}]}
].

Cette configuration va passer la limite d'espace disque d'un peu moins de 1Go à un peu moins de 500Mo. En redémarrant le serveur, tout va mieux.

Pour que le problème ne se repose pas à court terme, il vaut mieux combiner les deux solutions. En revanche, le problème risque de se poser à nouveau à plus long terme. Il n'y a pas vraiment de solution, mais au moins, on peut monitorer ces valeurs disk_free et disk_free_limit et configurer une alerte lorsque disk_free passe sous disk_free_limit. Au moins, la prochaine fois, on sera prévenu lorsque ça arrivera.