dblog mariadb Current/History 100% CPU

Begonnen von Waldmensch, 10 März 2019, 22:10:15

Vorheriges Thema - Nächstes Thema

Waldmensch

Hallo,

Kann mir jemand erklären, warum der Prozess von mariadb auf 100% geht, wenn ich DbLogType auf "Current/History" setze? Stelle ich auf nur "History", dümpelt der Prozess bei 0,x% rum. Die Hardware ist ein Odroid XU4 auf dem FHEM und mariadb laufen. Als Datenspeicher hängt eine SSD über USB3.0 dran. Es kommen bei den 100% auch öfters Meldungen im Log, das gerade ein Schreibvorgang pending ist und auf den nächsten async Lauf gewartet wird. Das verbose5 Log sieht nicht wesentlich anders aus, mit der einen oder anderen Einstellung. Das ist aber so viel, das ich es ungern hier anhängen möchte.

Internals:
   COLUMNS    field length used for Device: 64, Type: 64, Event: 512, Reading: 64, Value: 128, Unit: 32
   CONFIGURATION /opt/fhem/db.conf
   DEF        /opt/fhem/db.conf .*:.*
   MODE       asynchronous
   MODEL      MYSQL
   NAME       logdb
   NR         40
   NTFY_ORDER 50-logdb
   PID        31015
   REGEXP     .*:.*
   STATE      connected
   TYPE       DbLog
   UTF8       0
   VERSION    3.13.0
   dbconn     mysql:database=fhem;host=localhost;port=3306
   dbuser     fhemuser
   HELPER:
     COLSET     1
     DEVICECOL  64
     EVENTCOL   512
     OLDSTATE   connected
     READINGCOL 64
     TYPECOL    64
     UNITCOL    32
     VALUECOL   128
   Helper:
     DBLOG:
       state:
         logdb:
           TIME       1552250829.11004
           VALUE      connected
   READINGS:
     2019-03-10 21:56:14   CacheUsage      20
     2019-03-10 21:55:58   NextSync        2019-03-10 21:56:28 or if CacheUsage 500 reached
     2019-03-10 21:55:58   state           connected
   cache:
     index      43692
Attributes:
   DbLogType  History
   asyncMode  1
   room       System
   shutdownWait 2

DS_Starter

#1
Guten Morgen,

du hast vermutlich seeehr viele Einträge in der current-Tabelle. Check das mal z.B. im DbRep mit:

set ... countEntries current

Sollte es so sein lösche die mal alle bitte, z.B. auch mit DbRep:

set ... tableCurrentPurge

Ist die Tabelle leer würde ich empfehlen einen Primary Key anlegen:

ALTER TABLE `current` ADD PRIMARY KEY (`DEVICE`, `READING`) USING BTREE;

Das geht prinzipiell auch im DbRep mit:

set ... sqlCmd ALTER TABLE `current` ADD PRIMARY KEY (`DEVICE`, `READING`) USING BTREE;

Allerdings wird dem verwendeten DB User vermutlich das Recht fehlen. Dann entweder das "Alter"-Recht zuweisen oder das Ganze im SQL-Editor deiner Wahl als root-User ausführen.

Vermutlich wird die beschriebene Vorgehensweise dein Problem lösen, probiers mal.

Grüße,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter