Fuite mémoire sur béta

Hello,

sur la version bêta (je n’ai pas testé sur la stable), je constate une utilisation croissante de RAM et SWAP :

A chaque pic correspond à un reboot de l’OS (merci le watchdog du raspberry)

Pour « ralentir » la fréquence des crash, j’ai fais passer la swap de 1 à 2Go, et modifié le swapinness (de 60 à 10), mais cela ne fait que ralentir la fréquence des crashs

J’ai remarqué que c’était le démon jMQTT qui consommait, cela ressemble à une fuite mémoire:

Note: je n’ai pas réussi à redémarrer le démon par l’interface. Obligé de passé par une petite commande kill …

Erreur sur la fonction deamon_start du plugin : Le port du démon websocket (1026) est déjà utilisé par le pid 28573 : php /var/www/html/plugins/jMQTT/resources/jmqttd/jmqttd.php --plugin jMQTT --socketport 1026 --pid /tmp/jeedom/jMQTT/jmqttd.php.pid

La commande smem confirme l’utilisation de la swap (pid identique)

jeedom:~# smem
  PID User     Command                         Swap      USS      PSS      RSS 
(...)
28573 www-data php /var/www/html/plugins/j   397440   111348   112655   124920 
(...)

Et après le kill

  PID User     Command                         Swap      USS      PSS      RSS 
(...)
 4696 www-data php /var/www/html/plugins/j        0    11232    13474    29336 
(...)

jeedom:~# ps -eaf |grep 4696
www-data  4696     1  7 10:16 ?        00:12:15 php /var/www/html/plugins/jMQTT/resources/jmqttd/jmqttd.php --plugin jMQTT --socketport 1026 --pid /tmp/jeedom/jMQTT/jmqttd.php.pid

Je suis le seul dans ce cas ?

Bonjour @jerryzz

je regarde ça aussi de près j’ai pas encore pris le truc en flag …

j’ai des doutes aussi sur les charges cpu (vue dans jeedom)

tu n’a pas dit sur quel type de machine tu fonctionne ?

si ton mosquito est dans la même machine ou déporté ?

hello

  • Jeedom tourne sur un pi3 dédié + disque dur.
    Il était en béta depuis des années et je l’ai passé en alpha depuis peu - aucun soucis.
  • jMQTT en béta
  • mosquitto tourne sur une autre machine plus performante (proliant)

Pas d’augmentation CPU constatée, même avec la dernière Maj (les répétitions)

Ce qui m’étonne un peu, c’est l’augmentation de la swap, mais pas de la RAM. En général, un serveur se met à swapper lorsque la ram est full.

Salut,

Un point particulier m’interesse. On soupconne le daemon PHP WebSocket de provoquer cette fuite mémoire. Vous serait-il possible de relever la conso mémoire de ce process sur quelques jours :
php /var/www/html/plugins/jMQTT/resources/jmqttd/jmqttd.php --plugin jMQTT --socketp...

De mon coté je viens d’activer l’historisation sur ma VM x86, mais je n’ai pas l’impression que ca monte.

thank you :slight_smile:

Premier jet sur 1/2 journée:

jerry@jeedom:~ $ psrecord `cat /tmp/jeedom/jMQTT/jmqttd.php.pid`  --interval 1 --plot plot1.png

https://jeedom.jerryzz.fr/plot1.png

Je relance et laisse tourner plus longtemps

J’ai vu 2-3 articles sur ce problème et cela viendrait du comportement du garbage collector qui ne se déclenche que bien bien plus tard. Donc j’ai ajouté un appel explicite à celui-ci toutes les 5 minutes.
C’est poussé en beta. A voir donc si ca résoud.

1 « J'aime »

Je viens de voir la maj.
Avant de la faire, je te colle ici le graph de psrecord depuis la dernière fois:
https://jeedom.jerryzz.fr/plot2.png

On dirait que le garbage passe bien (cela explique les pics ci-dessus et ci-dessous), mais la swap augmente quand même ?!? A n’y rien comprendre

Et voila le même graph après la Maj (donc redémarrage du démon - redémarrage qui plante d’ailleurs, mais c’est un autre sujet)

Truc de fou quand même !

Donc, j’ai relancé le psrecord sur le nouveau process du demon. et je te tiens au courant.

1 « J'aime »

Petit tuto pour avoir la conso du daemon python de jMQTT :

Environ 55M chez moi mais auquel il faut ajouter 11M d’un appel PHP à jmqttd.php

Oui, tu as raison, C’est le daemon PHP qu’il faut trouver :

19Mio dans mon cas

Voilà la mienne:

jerry@jeedom:~ $ ps -eo size,pid,user,command --sort -size
 SIZE   PID USER     COMMAND
711780  661 mysql    /usr/sbin/mysqld
239188 2843 www-data php /var/www/html/plugins/jMQTT/resources/jmqttd/jmqttd.php --plugin jMQTT --socketport 1026 --pid /tmp/jeedom/jMQTT/jmqttd.php.pid


DE mon coté je confirme une perte de mémoire

la valeur est celle du demon jmqttd

un petit extrait sur quelques minutes

 A 724 8  broker En Ligne ,  memoire 62208
[07:25]
 A 725 1  broker En Ligne ,  memoire 64256
[07:26]
 A 726 2  broker En Ligne ,  memoire 64256
[07:27]
 A 727 2  broker En Ligne ,  memoire 66304
[07:28]
 A 728 2  broker En Ligne ,  memoire 66580
[07:29]
 A 729 1  broker En Ligne ,  memoire 68628
[07:30]
 A 730 2  broker En Ligne ,  memoire 68628
[07:31]
 A 731 2  broker En Ligne ,  memoire 68628
[07:32]
 A 732 1  broker En Ligne ,  memoire 70676
[07:33]
 A 733 2  broker En Ligne ,  memoire 70676
[07:34]
 A 734 2  broker En Ligne ,  memoire 72724
[07:35]
 A 735 2  broker En Ligne ,  memoire 72724
[07:36]
 A 736 1  broker En Ligne ,  memoire 72448
[07:37]
 A 737 2  broker En Ligne ,  memoire 74496
[07:38]
 A 738 1  broker En Ligne ,  memoire 74636
[07:39]
 A 739 1  broker En Ligne ,  memoire 76684
[07:40]
 A 740 2  broker En Ligne ,  memoire 76684
[07:41]
 A 741 2  broker En Ligne ,  memoire 78732
[07:42]
 A 742 2  broker En Ligne ,  memoire 78732
[07:43]
 A 743 2  broker En Ligne ,  memoire 78732
[07:44]
 A 744 2  broker En Ligne ,  memoire 80780
[07:45]
 A 745 2  broker En Ligne ,  memoire 80780

On a pu constater ces derniers jours que sur un Jeedom vierge avec JMQTT (beta), la reception d’un très grand nombre de messages MQTT (1000/min) ne provoquait pas de fuite de mémoire.
Je pense que c’est le déclenchement des scénarios/virtual/influxdb qui génère une fuite mémoire… ce n’est qu’une supposition tant que l’on aura pas réussi à reproduire le problème.

Hello,

Pour info j’ai un problème similaire également depuis plusieurs semaines.

Je suis sur la bêta et je fais les mise à jour a chaque fois qu’elles se présentent, donc toujours la dernière version.

Je constate une augmentation lente mais continue de la consommation de RAM jusqu’au point où après quelques jours la majorité de mes scénarios ne peuvent plus s’exécuter car la limite de mémoire PHP semble atteinte.

Une rapide analyse avec un « top » au moment où la RAM libre est au plus bas m’a montré que le process consommateur de RAM était un process PHP lancé par jmqtt, donc son daemon à mon avis.

En relançant le daemon jmqtt la RAM se libère instantanément et je suis a nouveau tranquille quelques jours avant de retomber dans les limites.

J’ai vraiment pas encore analysé ni fouillé plus loin pour le moment, tout ce que je sais pour l’instant c’est que c’est clairement en liaison avec jmqtt.

Mais est-ce un effet de bord ou un soucis interne au plugin je n’en sais encore rien.

Edit :

Dans mon cas la mémoire utilisée par le process :
php /var/www/html/plugins/jMQTT/resources/jmqttd/jmqttd.php --plugin jMQTT --socketport ...

augment de ± 30MB/h, et ne diminue jamais jusqu’à ce que je relance le daemon.

J’ai fais un script sh qui me log tout changement de la mémoire utilisée par ce process via la commande ‹ ps › et elle augmente de façon régulière 2MB par 2MB toutes les 4 à 6 minutes.

Je n’ai pas encore trouvé une corrélation avec un évènement extérieur au plugin.

1 « J'aime »

Pour info,

Je viens de repasser le plug’in en stable et j’ai absolument le même comportement, la charge mémoire gonfle de 36MB/H. C’est donc peut-être même pire.

Je vais donc le repasser en beta.

J’ai mis en place un scenario qui relance le daemon toutes les nuits à 2H30 pour le moment, et ce matin déjà 12% de mes 4Go de ram sont occupés par ce process, après un restart du daemon ça retombe à 1%.

Info supplémentaire, je tourne pas avec le broker en local, il est déporté dans une autre VM mais à mon avis ça doit pas changer grand chose.

Salut de mon coté le pansement est de relancer le demon toutes les 2 heures :wink:
Je log toutes les minutes la taille.

0983|[2022-03-09 09:24:02]INFO : JMQTT:online 54752
0984|[2022-03-09 09:25:02]INFO : JMQTT:online 54752
0985|[2022-03-09 09:26:02]INFO : JMQTT:online 54752
0986|[2022-03-09 09:27:02]INFO : JMQTT:online 54752
0987|[2022-03-09 09:28:02]INFO : JMQTT:online 56800
0988|[2022-03-09 09:29:02]INFO : JMQTT:online 56800
0989|[2022-03-09 09:30:03]INFO : JMQTT:online 56800
0990|[2022-03-09 09:31:02]INFO : JMQTT:online 56800
0991|[2022-03-09 09:32:02]INFO : JMQTT:online 56800
0992|[2022-03-09 09:33:02]INFO : JMQTT:online 58848
0993|[2022-03-09 09:34:01]INFO : JMQTT:online 58848
0994|[2022-03-09 09:35:03]INFO : JMQTT:online 58848
0995|[2022-03-09 09:36:02]INFO : JMQTT:online 58848
0996|[2022-03-09 09:37:02]INFO : JMQTT:online 58848
0997|[2022-03-09 09:38:02]INFO : JMQTT:online 60896
0998|[2022-03-09 09:39:02]INFO : JMQTT:online 60896
0999|[2022-03-09 09:40:02]INFO : JMQTT:online 60896
0939|[2022-03-09 08:45:03]INFO : JMQTT:online 69184
0940|[2022-03-09 08:45:06]INFO : JMQTT:offline 69184
0941|[2022-03-09 08:45:10]INFO : re-démarrage du plugin jMQTT
0942|[2022-03-09 08:45:10]INFO : JMQTT:online , 
0943|[2022-03-09 08:45:11]INFO : JMQTT:offline , 
0944|[2022-03-09 08:45:12]INFO : JMQTT:online , 
0945|[2022-03-09 08:46:02]INFO : JMQTT:online 16500
0946|[2022-03-09 08:47:02]INFO : JMQTT:online 23136
1 « J'aime »

Bonjour,

le problème est présent uniquement avec la beta ?

Bonne journée

non, pas chez moi en tous cas :

Hello @meute,

Peux-tu nous dire si tu as activé la publication vers Influxdb sur des commandes jMQTT ?

De toute façon le problème vient du daemon php, nous travaillons à l’éradication de ce daemon au profit du daemon python, car php n’est pas fait (by design) pour tourner longtemps.

Je parlerais plus d’une couche que d’un pensement pour gérer les fuites :smiley:
Mais oui, c’est la façon la plus simple qu’on ait à date de palier au problème.

Plus d’infos prochainement.

Bad

1 « J'aime »

Hello,

Non, je n’utilise pas Influxdb.
Et j’ai vérifié quelques commandes au hasard et la publication vers influxdb y était désactivée.
Maintenant ça ne veut pas dire qu’il n’y ai pas une commande qui traine où ça aurait été activé à l’insu de mon plein gré … mais ça serait fastidieux d’aller passer en revue toutes les commandes pour vérifier, j’en aurais pour au moins 2 heures …

A moins que tu ais une commande SQL ou autre qui me permette de toutes les vérifier d’un coup à me proposer ?