Optimisation Mémoire - Espace disque libre sur Jeedom Box

Bonjour.

Je sais que ce topic à été abordé de nombreuses fois sur le forum. Mais je ne suis pas parvenu à dénicher de réponses satisfaisantes où de solutions techniquement à ma portée …

Voila J’ai une Box Smart ZWave - Disque SSD 8Go.
Et avec l’install de Jeedom v.4 et mes quelques plug-in je suis vite en saturation mémoire.
… Et, j’ai potentiellement encore pas mal de trucs à mettre dessus en projet.

Apres installation d’un plugin supplémentaire à tester, lancement du daemon qui se bloque à 50%
Hier encore j’arrivais à 2% d’espace libre… (passage de 6 à 2 …) et le Swap en caraffe aussi…

Panique, dépit, je désinstalle le plugin…
… Resultat : memoire toujours à 2% … Arghhhh

  • Je vide les caches divers et variés :
    Capture d’écran 2024-07-13 à 14.32.39
  • Je fait une restauration de sauvegarde impromptu après avoir malencontreusement appuyé sur « Désactiver tout les plugins » (C’est un danger sans nom ce bouton) d’ailleur … :sweat_smile:
  • Je désinstalle le plug in Apple Home qui me semblait potentiellement fat. (au doit mouillé.) et dont je ne me sert finalement pas tant que ça …
    … Et j’arrive à 8% d’espace libre… Ouf !!! Mais pour combien de temps…
    Si je réinstalle de nouveau trucs, je risque de rapidement rééxploser les compteurs …

Du coups 3 questions.

    • Existe-t-il un outil / une vue qui permetrait pouvoir voir quel application, quelle donnée occupe tel espace. et eventuellement comment soit l’alleger. soit le désactiver (genre l’occupation mémoire sur ios)
    • Parfois l’impression qu’en instalant un plug-in, puis en le désinstalant on ne libere pas necessairement la totalité de la mémoire qui lui etait atribué. (Ne resterait il pas des traces. Caches, parametres daemons, Settings, fichiers associées. et si oui, comment s’en débarrasser. J’ai en effet l’impression qu’entre l’espace avant une install de plugin et après désinstal, on ne récupere pas la totalité de l’espace utilisé. et que du coups à chaque tentative de tester un plugin, on bouffe de la mémoire de maniere iremediable.
    • Et enfin si aucun moyen de ,palier à l’irémédiable saturation de la mémoire. comment Palier à cette fatalité.

a) - Augmenter la mémoire - Via une clefs usb ? - via remplacement de la ssd … Mais les quelques déscriptions de tentatives m’on donnée des sueurs froide.
b) - Passer sur Luna. (Mais là aussi l’idée de devoir exclure / ré-inclure tout mes modules … Au secour … (Je l’avais déja fait pour passer de z-way à Jeedom) J’ai plein de module encastrés qui seront un tannée à faire …
-b2) - à moins de pouvoir faire de la luna un 2eme Noeud maitre et de faire la bascule et une restauration de sauvegarde dans un 2eme temps ???

Si vous avez des idées pour un techos plutôt néofite que je suis.
Merci d’avance…


Informations Jeedom

Core : 4.4.8.1 (V4-stable)
DNS Jeedom : oui

Plugin : Z-Wave
Version : 2022-02-08 01:02:53 (stable)
Statut Démon : Démarré - (2024-07-11 22:37:54)

Salut,

Faire cela sans hésiter
Et purger l historique en limitant le temps d archivage

Aussi creer un scenario avec un bloc code et colle ci dessous le code ,le log du scenario sera interressant a analyser apres avoir executer le dit scenario.

$version = '27/03/2023 19:00' ;
$scenario->setLog('┌──────────── Logs bloc code - version du '.$version);
$scenario->setLog('| ');

$seuilalert24h     = 50 ;      // Seuil d'alerte pour le nb de ligne générées /24h pour une commande : 50 par defaut
$seuilArch         = 50000 ;   // Seuil d'alerte pour le nb de ligne archivées pour une commande : 50000 par defaut
$topXCmd           = 10 ;  	   // Recupere seulement les X commandes les plus volumineuses : 10 par defaut	
$seuilTailleTable  = 200 ;     // Seuil alerte en MB pour la taille d'une table : 200 MB par defaut
$seuilNbLigneTable = 2000000 ; // Seuil alerte pour le nb de lignes d'une table : 2 000 000 par defaut

// RESUME
$sql_resume = "SELECT table_name AS `Table`, round(((data_length + index_length) / 1024 / 1024)) as `MB`,table_rows as `Ligne` FROM information_schema.TABLES WHERE table_schema='jeedom' ORDER BY MB DESC LIMIT 5" ;
$results_resume = DB::Prepare($sql_resume, NULL, DB::FETCH_TYPE_ALL);
$scenario->setLog('| -------- RESUME');
$scenario->setLog('| ');
foreach ($results_resume as $result_resume) {
  $table = $result_resume['Table'];
  $taille = $result_resume['MB'];
  $nblign = $result_resume['Ligne'];
  $scenario->setLog('|     Table '.$table.' : Taille -> '.$taille.'MB , nb lignes -> '.$nblign);
  if ( $taille >= $seuilTailleTable || $nblign >= $seuilNbLigneTable ) $scenario->setLog('| /!\ Table Anormalement grosse, taille superieure au seuil ('.$taille.'MB)') ;
  if ( $nblign >= $seuilNbLigneTable ) $scenario->setLog('| /!\ Table Anormalement grosse, Nb de lignes superieur au seuil ('.$nblign.' lignes)') ;
}
$scenario->setLog('| ');
$scenario->setLog('| -------- FIN RESUME');

// ANALYSE DES EQUIPEMENT
$scenario->setLog('| ');
$scenario->setLog('| -------- COMMANDES AVEC DONNEES VOLUMINEUSES');
$scenario->setLog('| ');
$sql = 'SELECT arch.cmd_id id, count(arch.value) as countarch FROM historyArch arch  GROUP BY arch.cmd_id ORDER BY countarch DESC LIMIT '.$topXCmd;

$results = DB::Prepare($sql, NULL, DB::FETCH_TYPE_ALL);
foreach ($results as $result) {

  $id = $result['id'];
  $nb_arch = $result['countarch'];
  $sql_cmddesc = 'SELECT cmd.id cmd_id, cmd.name cmd, eqLogic.name equipement,object.name objectname, cmd.eqType plugin, count(*) as counthist FROM cmd LEFT JOIN eqLogic ON cmd.eqLogic_id = eqLogic.id LEFT JOIN object ON eqLogic.object_id = object.id LEFT JOIN history ON cmd.id = history.cmd_id WHERE cmd.id = '.$id.' GROUP BY history.cmd_id ';
  $results_cmd = DB::Prepare($sql_cmddesc, NULL, DB::FETCH_TYPE_ALL);
  
  // recherche de la premiere date d'historique
  $sql_firstHist = 'SELECT datetime FROM historyArch WHERE cmd_id = '.$id.' ORDER BY datetime ASC LIMIT 1' ;
  $results_dateHist = DB::Prepare($sql_firstHist, NULL, DB::FETCH_TYPE_ALL);
  foreach ($results_dateHist as $result_dateHist) {
	$now_date = new DateTime("now");
	$diff = time() - strtotime($result_dateHist['datetime']);
	$diff_in_day = floor($diff / 86400);
    $nb_valeurParJour = round($nb_arch / $diff_in_day);
  }
    
  foreach ($results_cmd as $result_cmd) {
    $object = $result_cmd['objectname'] ;
    $equipement = $result_cmd['equipement'] ;
    $cmd = $result_cmd['cmd'] ;
    $plugin = $result_cmd['plugin'] ;
    $nb_hist = $result_cmd['counthist'] ;
    if (date(H) <= 5 ) $timestamp_archivage = mktime(5, 0, 0, date("m")  , date("d")-1, date("Y"));
    else $timestamp_archivage = mktime(5, 0, 0, date("m")  , date("d"), date("Y"));
    
    // recup de la config de la commande
    $conf_histo = cmd::byId($id)->getIsHistorized() ;
    $conf_histoMode = cmd::byId($id)->getConfiguration('historizeMode') ;
    if ( $conf_histoMode == '' || $conf_histoMode == 'none' ) $conf_histoMode = 'aucun' ;
    $conf_histopurge = cmd::byId($id)->getConfiguration('historyPurge') ;
    if ( $conf_histopurge == '' || $conf_histopurge == 'none' ) $conf_histopurge = 'aucun' ;
    $nb_hist24h = round($nb_hist * 86400 / ( time() - $timestamp_archivage)) ;
    $scenario->setLog('| '.$plugin.' -> #['. $object .']['.$equipement.']['.$cmd.']# (id : '.$id.')');
    if ( $nb_hist24h >= $seuilalert24h && $conf_histoMode == 'aucun' && $conf_histopurge == 'aucun' ) $scenario->setLog('| /!\ PB DE PARAMETRAGE, nb de valeur par 24h important ('. $nb_hist24h.') et aucun lissage ni aucune purge paramétrés');    
    if ( $nb_arch >= $seuilArch ) $scenario->setLog('| /!\ PB DE PARAMETRAGE, nb de valeur archivéess trop importantes ('. $nb_arch.'), superieur à '.$seuilArch);    
    $scenario->setLog('|     Configuration : historisé -> '.$conf_histo.' , lissage -> '. $conf_histoMode . ' , purge -> '. $conf_histopurge  ) ;
    $scenario->setLog('|     Historique    : '.$nb_hist.' valeurs (estimation sur 24h : '.$nb_hist24h.')' );
    $scenario->setLog('|     Archives      : '.$nb_arch.' valeurs depuis '.$diff_in_day.' jours ('.$nb_valeurParJour.' valeurs par jour en moyenne)');
    $scenario->setLog('|');
          
    
  } 
}
$scenario->setLog('| -------- FIN COMMANDES AVEC DONNEES VOLUMINEUSES');

// ANALYSE DES EQUIPEMENT
$scenario->setLog('| ');
$scenario->setLog('| -------- COMMANDES AVEC DONNEES ALPHANUMERIQUES');
$scenario->setLog('| ');
$sql = "SELECT cmd_id id, sum(LENGTH(value)) countarch FROM historyArch WHERE value REGEXP '[a-z;A-Z]' GROUP BY cmd_id ORDER BY countarch DESC LIMIT ".$topXCmd;

$results = DB::Prepare($sql, NULL, DB::FETCH_TYPE_ALL);
foreach ($results as $result) {

  $id = $result['id'];
  $nb_arch = $result['countarch'];
  $sql_cmddesc = 'SELECT cmd.id cmd_id, cmd.name cmd, eqLogic.name equipement,object.name objectname, cmd.eqType plugin, sum(LENGTH(history.value)) as counthist FROM cmd LEFT JOIN eqLogic ON cmd.eqLogic_id = eqLogic.id LEFT JOIN object ON eqLogic.object_id = object.id LEFT JOIN history ON cmd.id = history.cmd_id WHERE cmd.id = '.$id.' GROUP BY history.cmd_id ';
  $results_cmd = DB::Prepare($sql_cmddesc, NULL, DB::FETCH_TYPE_ALL);
  
  // recherche de la premiere date d'historique
  $sql_firstHist = 'SELECT datetime FROM historyArch WHERE cmd_id = '.$id.' ORDER BY datetime ASC LIMIT 1' ;
  $results_dateHist = DB::Prepare($sql_firstHist, NULL, DB::FETCH_TYPE_ALL);
  foreach ($results_dateHist as $result_dateHist) {
	$now_date = new DateTime("now");
	$diff = time() - strtotime($result_dateHist['datetime']);
	$diff_in_day = floor($diff / 86400);
    $nb_valeurParJour = round($nb_arch / $diff_in_day);
  }
    
  foreach ($results_cmd as $result_cmd) {
    $object = $result_cmd['objectname'] ;
    $equipement = $result_cmd['equipement'] ;
    $cmd = $result_cmd['cmd'] ;
    $plugin = $result_cmd['plugin'] ;
    $nb_hist = $result_cmd['counthist'] ;
    if ( $nb_hist == '' ) $nb_hist = 0 ;
    if (date(H) <= 5 ) $timestamp_archivage = mktime(5, 0, 0, date("m")  , date("d")-1, date("Y"));
    else $timestamp_archivage = mktime(5, 0, 0, date("m")  , date("d"), date("Y"));
    
    // recup de la config de la commande
    $conf_histo = cmd::byId($id)->getIsHistorized() ;
    $conf_histoMode = cmd::byId($id)->getConfiguration('historizeMode') ;
    if ( $conf_histoMode == '' || $conf_histoMode == 'none' ) $conf_histoMode = 'aucun' ;
    $conf_histopurge = cmd::byId($id)->getConfiguration('historyPurge') ;
    if ( $conf_histopurge == '' || $conf_histopurge == 'none' ) $conf_histopurge = 'aucun' ;
    $nb_hist24h = round($nb_hist * 86400 / ( time() - $timestamp_archivage)) ;
    $scenario->setLog('| '.$plugin.' -> #['. $object .']['.$equipement.']['.$cmd.']# (id : '.$id.')');
    if ( $nb_hist24h >= $seuilalert24h && $conf_histoMode == 'aucun' && $conf_histopurge == 'aucun' ) $scenario->setLog('| /!\ PB DE PARAMETRAGE, nb de valeur par 24h important ('. $nb_hist24h.') et aucun lissage ni aucune purge paramétrés');    
    if ( $nb_arch >= $seuilArch ) $scenario->setLog('| /!\ PB DE PARAMETRAGE, nb de valeur archivéess trop importantes ('. $nb_arch.'), superieur à '.$seuilArch);    
    $scenario->setLog('|     Configuration : historisé -> '.$conf_histo.' , lissage -> '. $conf_histoMode . ' , purge -> '. $conf_histopurge  ) ;
    $scenario->setLog('|     Historique    : '.$nb_hist.' caractères (estimation sur 24h : '.$nb_hist24h.')' );
    $scenario->setLog('|     Archives      : '.$nb_arch.' caractères depuis '.$diff_in_day.' jours ('.$nb_valeurParJour.' caractères par jour en moyenne)');
    $scenario->setLog('|');
          
    
  } 
}
$scenario->setLog('| -------- FIN COMMANDES AVEC DONNEES ALPHANUMERIQUES');

$scenario->setLog('└───────────────────────────');

Pour l’instant, je ne conseille pas de changer quoi que ce soit sur un système qui va devoir être réinstallé sous buster (car sur la smart c’est la seule version dispo pour l’instant).

Les dépendances des plugins vont devoir être réinstallées après ce remplacement et il existe un risque non-negligeable selon moi que des problèmes surviennent à ce moment empêchant le redémarrage des plugins.

La smart étant sous buster, il est préférable de ne plus effectuer de modification « lourde » tant qu’une image bullseye n’est pas dispo.

2 « J'aime »

Merci pour ces info @adejee.
J’ai commandé la carte 16Go du coups.
La procédure a l’aire d’être plus simple que ce que j’avais imaginé sur Domadoo

Pour la restauration, j’imagine qu’il faut que je télécharge une sauvegarde sur mon poste de travail du coups ? Il y’auras plus de sauvegarde sur la nouvelle mémoire…

Ca se passe ou la purge de l’historique ?

Et pour le temps d’archivage tu conseille quels paramètres du coups ?
J’ai ça pour le moment :

Sinon, y’a peut être moyen de faire des sauvegarde sur un poste distant ?
Nas / Cloud / clef USB ? Mais j’ai pas trouvé comment faire.

Pour le Scenario / script je regarderais ça dans un 2eme temps … Pas trop sur d’avoir compris ou ca se faisait. Je creuserait plus tard ?

@Mips, je ne suis pas sur de comprendre cette histoire de version sous « buster » ?
Mais je ne peux pas rester avec un système qui sature à la moindre install …
Vous ne pensez pas que l’upgrade de la eMMC soit une bonne idée ?

Ah ! Du coups @adejee, pour les sauvegardes externes j’ai trouvé …

Sauvegarde en Samba sur Nas … Ca fonctionne au poil …

Du coups je peux réduire les Backup en Local à 1j / 300Mo

Et vider le Cache, C’est juste effacer les sauvegardes ? C’est ça ?

Historique, configuration commande , régler purge sur chaque commandes. Ou réglage_ configuration _historique des commandes Purger l’historique si plus vieux que réglages appliquer par défaut

Vider le cache à éviter

Oui externaliser avant d installer la nouvelle emmc. /!\ la sauvegarde doit bien comporter le format : tar.gz

  • buster est obsolète et par conséquent une nouvelle installation de dépendances peut échouer (lib plus dispo, incompatibilité de version…). En cas de soucis il sera quasi impossible de réparer
  • installer une nouvelle emmc va imposer de restaurer un backup jeedom et de relancer l’installation des dépendances; cette nouvelle emmc sera sous buster car il n’existe pas encore d’image sous bullseye.

Donc changer l’emmc comporte un risque de ne pas pouvoir réinstaller les dépendances des plugins.

Ceci dit, si ca arrive peut-être qu’il suffira de remettre l’ancienne emmc histoire de pouvoir redémarrer la domotique et la nouvelle emmc ne sera pas perdue en principe, elle pourra être installée le jour où l’image bullseye sera dispo pour la smart.

1 « J'aime »

Bonjour,

J’a installé une Emmc 16Go (Debian 10) il y a quelques mois, cela a bien optimisé ma smart mais au final j’aurais peut-être dû attendre un peu l’Emmc est en Debian 11 maintenant à l’achat sur domadoo.

Pas mal de manip. pour passer de Debian 10 à 11. pour re-stabiliser la box.

En particulier sur le Z-wave, le passage imposé du plug-in « OpenZwave » vers « Z-Wave JS ».
Il m’a fallu environ 4j. plein pour remettre mon parc à niveau. (Et il me reste encore quelques éléments à stabiliser au fil de l’eau.) Mais je suis pas non plus un tech. super-pro. donc ce temps est à relativiser.

Mais quand même, j’imagine que la migration sur 16Go sur Debian 10 doit être moins hard au final.

1 « J'aime »