Tuto - analyser les archives pour détecter des pbs (lenteurs / espaces disques)

Merci, c’était le but que de partager un truc utile :wink:

Norbert

1 « J'aime »

Bonjour et merci pour ce travail.
Je rencontre un problème pour supprimer les archives, ci dessous un exemple.
J’ai lancé hier le script.
L’équipement avec id : 568 était en warning, aucune purge.
J’ai réglé la purge à 7 jours .

Je relance le script ce matin, la purge est bien à 7 jours.
Mais j’ai encore 923 jours en archives.

Que puis je faire ?

PS : j’ai aussi fait un « Nettoyage de la base de données » dans les outils _OS/DB

Merci par avance

Pourquoi as-tu - (moins) 7 jours au niveau du délai de purge ?
As tu mis -7 dans la conf de la commande ?
Si oui, il faut mettre 7
(Je ne suis pas sur mon poste, donc difficile de vérifier chez moi)

Norbert

Non j’ai juste mis 7 jours mais cela s’affiche avec un « - »…

1 « J'aime »

Du coup, faudra que je creuse… La tache d’archivage est bien passée cette nuit ?

je vérifie comment stp ?

2 « J'aime »

Salut, tu peux aller sur Réglages > Système > Moteur de taches et chercher la tache de classe « history » qui lance la fonction « archive ».

Dans mon exemple elle à tourné ce jour à 5h du matin et à duré 9s.

Salut @ngrataloup et merci beaucoup pour ce partage !

De mon coté, je suis également l’évolution du stockage dans la BDD Jeedom pour essayer de l’optimiser au mieux. Par contre, je me suis orienté uniquement sur la table historyArch car c’est la plus sensible pour moi.
Par contre étant plus à l’aise en SQL qu’en php, j’avais fait la requete SQL suivante pour analyser et optimiser mes historiques dans jeedom. Elle est beaucoup moins plug&play que ton scénario mais elle correspondait parfaitement à mon besoin.
Je la partage ici au cas où elle puisse servir à quelqu’un :slight_smile:

SELECT cmd.id, cmd.eqType as TypeCommande,
cmd.name as Commande,
cmd.subType as TypeValeur,
cmd.unite as Unite,
eqLogic.name as Equipement,
object.name as Piece,
CASE
    WHEN cmd.generic_type IS NULL THEN ""
    ELSE lower(cmd.generic_type)
END as TypeGenerique,
CASE
    WHEN JSON_EXTRACT(cmd.configuration,'$.historyPurge') IS NULL THEN "Aucun"
    WHEN JSON_EXTRACT(cmd.configuration,'$.historyPurge') = "" THEN "Aucun"
    ELSE JSON_UNQUOTE(JSON_EXTRACT(cmd.configuration,'$.historyPurge'))
END as PurgeAuto,
CASE
    WHEN JSON_UNQUOTE(JSON_EXTRACT(cmd.configuration,'$.historizeMode')) IS NULL THEN "Aucun"
    WHEN JSON_UNQUOTE(JSON_EXTRACT(cmd.configuration,'$.historizeMode')) = "none" THEN "Aucun"
    ELSE JSON_UNQUOTE(JSON_EXTRACT(cmd.configuration,'$.historizeMode'))
END as Lissage,
min(historyArch.datetime) as HistoPlusAncien, max(historyArch.datetime) as HistoPlusRecent,
DATEDIFF(max(historyArch.datetime),min(historyArch.datetime)) as DeltaJoursHisto,
round(count(historyArch.value)/DATEDIFF(max(historyArch.datetime),min(historyArch.datetime)),2) as NbMesuresMoyenneJour,
count(historyArch.value) as NbreMesuresTotal
FROM cmd
JOIN eqLogic on cmd.eqLogic_id = eqLogic.id
JOIN object on eqLogic.object_id = object.id 
JOIN historyArch on cmd.id = historyArch.cmd_id
WHERE cmd.isHistorized = 1
GROUP BY cmd.id, cmd.eqType, cmd.unite, cmd.name, cmd.subType, eqLogic.name, object.name, cmd.configuration, cmd.generic_type
ORDER BY count(historyArch.value) DESC

Ci dessous deux exemple après avoir forcer la tache dans le moteur de tache.
J’ai beau limiter à 1 jour d’historique puis forcer la tache d’historisation dans le moteur des taches, il ne me supprime pas les archives depuis 1293 jours pour le premier exemple.

Je loupe quelque chose ?
Merci

1 « J'aime »

Pour le 1 er cas, historisation à 0 → je suppose donc que la fonction d’archivage ne passe pas sur cette commande → faire un nettoyage de base dans les outils d’administration.

Pour le 2nd cas, aucune donnée pour la journée → je suppose que la tâche d’archivage doit nettoyer seulement pour les commandes qu’elle traite, donc celle dont il y a au moins une donnée pour la journée → génère un e entrée pour cette commande et relance l’archivage pour faire un test (via un scénario et la fonction évent)

Norbert

1 « J'aime »

bonjour,

merci pour le tuto :ok_hand:

ainsi j’ai pu voir que mon archivage est énorme.

Table history : Taille -> 130MB , nb lignes -> 2219194

alors je suis passé sur pas mal de commandes pour indiquer des délais de rétentions (7j, 1mois, …)

et j’ai attendu 2 jours pour voir l’effet

au final, aujourdhui, j’ai encore

Table history : Taille -> 133MB , nb lignes -> 2313114

j’ai l’impression que l’archivage ne se lance pas
et je ne trouve rien dans le cron qui tourne à 5h00

j’ai parcouru la doc, mais pas trouvé (https://doc.jeedom.com/fr_FR/core/4.3/history)

comment vérifier que l’archivage se lance ?
comment faire pour lancer l’archivage manuellement ?

merci pour votre aide

On parle bien du cron de Jeedom :

et c’est cette tache :

oui c’est bien là que je cherchais, mais je ne l’avais pas vue… a priori, la source du problème est identifiée : pas actif

MERCI :+1:

tu devrais voir une grosse difference, parceque 2313114 lignes dans la table archive, c’est enorme
Norbert

en effet, après une purge qui a duré 2073s
je passe de 2313114 à 1113614 lignes pour la Table history

il y a qd meme des trucs qui ne s’épurent pas, il me semble :
par exemple, un virtuel sur lequel j’ai mis une purge de 7 jours, et j’ai ceci dans la log

| -------- COMMANDES AVEC DONNEES VOLUMINEUSES                                            
|                                                                                         
| virtual -> #[OPPO Find X2 Pro][VariablesOppo][SMSRT]# (id : 17305)                      
|     Configuration : historisé -> 1 , lissage -> aucun , purge -> -7 days                
|     Historique    : 10 valeurs (estimation sur 24h : 21)                                
|     Archives      : 28755 valeurs depuis 724 jours (40 valeurs par jour en moyenne)     

un truc m’échape
que faire pour purger ce qui correspond à la ligne « Archives » ?

1 « J'aime »

Et si tu relances un archivage ? comme tu avais un gros delta, peut-etre un timeout (je dis ca, je n’en ai aucune idée en fait !! :sweat_smile:)

1 « J'aime »

ben ouais, c’était une bonne idée
apres un 2eme archivage ( 1111s !)

     Table historyArch : Taille -> 35MB , nb lignes -> 598053
     Table history : Taille -> 20MB , nb lignes -> 11920

la table history a fondu de 2 300 000 lignes a 12 000 lignes
et la Table historyArch : est passée de 415 000 à 600 000 lignes

… bon, je vais laisser tourner quelques jours

Un nettoyage de printemps efficace !!

Suite à ton retour, je vais rajouter dans le bloc code un check sur le fait que le cron d’archivage est actif et n’ets pas en erreur !! ca evitera de chercher la prochaine fois

Norbert

1 « J'aime »

le scenario initial a été mis à jour pour ajouter une section sur le statut de la tache d’archivage

[2023-05-04 23:16:00][SCENARIO] | -------- TACHE D'ARCHIVAGE
[2023-05-04 23:16:00][SCENARIO] |
[2023-05-04 23:16:00][SCENARIO] |     Actif    : 1
[2023-05-04 23:16:00][SCENARIO] |     Statut   : stop
[2023-05-04 23:16:00][SCENARIO] |     Last run : 2023-05-04 05:00:05

avec une alerte si la tache n’est pas active ou que le statut est egal à error

Norbert

3 « J'aime »