[gelöst] Bei configdb info hängt fhem sich auf

Begonnen von onkel-tobi, 06 August 2022, 10:10:36

Vorheriges Thema - Nächstes Thema

onkel-tobi

Hi zusammen,

meine configdb ist wohl ziemlich groß geworden und ich wollte mir mal anschauen wie viele Versionen ich habe, bevor ich mich dann entscheide wie viele Versionen ich automatisiert vorhalte.

Allerdings scheine ich so viele Versionen zu haben, dass mir fhem über stunden abschmiert.
Über die console sehe ich folgendes im log:
PERL WARNING: Use of uninitialized value in concatenation (.) or string at configDB.pm line 941.
Wie sollte ich jetzt am besten vorgehen?
Kann/sollte ich das per console machen?
Oder aber über max versions nach einem reboot einen entsprechenden Wert setzen?

Danke & Gruß,
Tobi

betateilchen

Leider hast Du sehr wenig Information zu deiner Systemumgebung gegeben (Betriebssystem, Datenbankmodell, Speichermedium usw.)

Zitat von: onkel-tobi am 06 August 2022, 10:10:36
Allerdings scheine ich so viele Versionen zu haben, dass mir fhem über stunden abschmiert.

Was meinst Du mit "fhem über stunden abschmiert" ?

PERL WARNING: Use of uninitialized value in concatenation (.) or string at configDB.pm line 941.

Die Fehlermeldung deutet darauf hin, dass Du SQLITE verwendest.
Kannst Du mal auf Betriebssystemebene schauen, wie groß die Datenbankdatei dort ist?

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

onkel-tobi

#2
Habe noch mal was an updates eingearbeitet:

Zitat von: betateilchen am 06 August 2022, 10:24:06
Leider hast Du sehr wenig Information zu deiner Systemumgebung gegeben (Betriebssystem, Datenbankmodell, Speichermedium usw.)

Ich nutze einen RPi4 mit 8 gb ram und 64 GB SD Karte.

Zitat
Was meinst Du mit "fhem über stunden abschmiert" ?

Ich habe die letzte configdb info jetzt vor ca. 3 Stunden via webif angefragt.
Webif ist nicht mehr erreichbar und im log nur u.g. Info.

Cpu bei ca. 45 % ausgelastet durch mysqld.

Zitat
PERL WARNING: Use of uninitialized value in concatenation (.) or string at configDB.pm line 941.

Die Fehlermeldung deutet darauf hin, dass Du SQLITE verwendest.
Kannst Du mal auf Betriebssystemebene schauen, wie groß die Datenbankdatei dort ist?

Die DB ist ca. 1 GB groß. Lt. configDB.cfg ist es mysql und nicht SQLlTE.

betateilchen

Zitat von: onkel-tobi am 06 August 2022, 10:44:02
Die DB ist ca. 1 GB groß. Lt. configDB.cfg ist es mysql und nicht SQLlTE.

Das ist merkwürdig. Die Zeile 941, in der die Warnung auftritt, wird in der aktuellen Modulversion nur durchlaufen, wenn SQLITE verwendet wird:


938 if ($cfgDB_dbtype eq "SQLITE") {
939     my $size = -s $cfgDB_filename;
940     $size = _cfgDB_filesize_str($size);
941 push @r, " dbsize: $size";
942 }


Du könntest mal manuell in der Datenbank folgende Abfragen machen:


SELECT count(*) FROM fhemversions;
SELECT count(*) FROM fhemconfig;


damit wir eine Ahnung davon bekommen, um welche Größenordnung es geht.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

onkel-tobi

Zitat von: betateilchen am 06 August 2022, 13:11:42
Das ist merkwürdig.
Ja, es wird gleich noch besser... Ich hoffe ich habe da in der Vergangenheit keinen folgenschweren Fehler gemacht. Sieht aber fast so aus.
Zitat
SELECT count(*) FROM fhemversions;

Connection id:    386
Current database: fhem

MariaDB [fhem]> SELECT count(*) FROM fhemversions;
+----------+
| count(*) |
+----------+
|     1337 |
+----------+
1 row in set (0.00 sec)
MariaDB [fhem]>


ZitatSELECT count(*) FROM fhemconfig;
MariaDB [fhem]> SELECT count(*) FROM fhemconfig;
+----------+
| count(*) |
+----------+
|  5140475 |
+----------+
1 row in set (51.46 sec)


Also so wie ich das sehe läuft auf meinem RPi MariaDB, konfiguriert habe ich in der configDB.cfg mysql und die DB scheint in Wirklichkeit SQLITE zu sein? 🤔🙈

betateilchen

Lassen wir das Thema SQLITE vs. MySQL jetzt erstmal außen vor.

Du hast also in der Datenbank aktuell 1337 komplette Versionen gespeichert, die aus insgesamt 5,14 Mio Konfigurationszeilen bestehen.
Das ist natürlich schon eine Menge an Daten, denn "configdb info" muss für alle 1337 Versionen nacheinander die 5,14 Mio Zeilen nach "define" und "attr" durchforsten, um die Statistik zu erstellen. 1337 * 5,14Mio = knapp 6,9 Milliarden (das kann schon eine Weile dauern...)

Meine Empfehlung:

FHEM beenden.
FHEM neustarten.

"configdb reorg 10"

Damit werden die letzten 10 Versionen behalten und alles ältere gelöscht.
Auch die Reorg kann eine gewisse Zeit dauern, also nicht die Geduld verlieren.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

In configDB habe ich jetzt ein neues Attribut eingebaut, mit dem man die Ausgabe von "configdb info" steuern.

configdb attr shortinfo 1

sorgt dafür, dass nur die Anzahl der gespeicherten Versionen (1337) und die Gesamtzahl der Konfigurationszeilen (5,14 Mio) ausgegeben wird.
Das sollte in solchen Szenarien wie hier im Thread dafür sorgen, dass die Ausgabe sehr viel schneller erfolgt.

Die neue Modulversion ist ab sofort in SVN verfügbar, per update kommt die Datei morgen früh ab 8 Uhr.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

onkel-tobi

#7
Danke. Reorg läuft jetzt erst mal.

Update: nach ca. 2,5 Std. ist es nun durch:

-----------------------------------------------------------------
configDB Database Information
-----------------------------------------------------------------
d:$Id: configDB.pm 25860 2022-03-20 10:03:20Z betateilchen $
c:$Id: 98_configdb.pm 25765 2022-03-03 12:22:51Z betateilchen $
-----------------------------------------------------------------
dbconn: mysql:database=fhem;host=localhost;port=3307
dbtype: MYSQL
-----------------------------------------------------------------
loaded:       9ad616f1256d6ad4d610710a094196ca
lastReorg:    Sat Aug  6 17:28:02 2022
config:       49973 entries

Ver 0 saved: Sat Aug  6 09:24:08 2022 def: 646 attr: 3222
Ver 1 saved: Fri Aug  5 23:36:33 2022 def: 646 attr: 3225
Ver 2 saved: Fri Aug  5 23:03:56 2022 def: 646 attr: 3224
Ver 3 saved: Fri Aug  5 22:06:40 2022 def: 646 attr: 3223
Ver 4 saved: Fri Aug  5 20:54:08 2022 def: 648 attr: 3228
Ver 5 saved: Fri Aug  5 20:53:55 2022 def: 648 attr: 3228
Ver 6 saved: Fri Aug  5 15:59:19 2022 def: 646 attr: 3224
Ver 7 saved: Fri Aug  5 15:42:17 2022 def: 646 attr: 3222
Ver 8 saved: Fri Aug  5 14:50:52 2022 def: 656 attr: 3277
Ver 9 saved: Wed Aug  3 19:14:43 2022 def: 664 attr: 3289
Ver 10 saved: Sun Jul 31 13:06:15 2022 def: 664 attr: 3288
-----------------------------------------------------------------
filesave: 27 files stored in database
-----------------------------------------------------------------

betateilchen

Ok, dann solltest Du jetzt überlegen, ob Du nicht das Attribut maxversions setzen möchtest, um solche Probleme künftig zu vermeiden.

Alternativ kannst Du auch das "configdb reorg 10" per at jede Nacht einmal laufen lassen (meine bevorzugte Variante, weil das reorg so nicht bei jedem "save config" erfolgt)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!