MySql Speicherüberlastung/Absturz

alles zu mySql/mariadb

Moderator: Moderatoren

Antworten
Benutzeravatar
Fischkopp
UDF-Programmierer
UDF-Programmierer
Beiträge: 63
Registriert: Sa, 19. Jul 2014 10:31
Wohnort: Berlin

MySql Speicherüberlastung/Absturz

Beitrag von Fischkopp »

Hallo,
habe nach Georg`s Tips (gute Einführung =D> ) die direkte Sql-Anbindung statt ODBC getestet, geht gut, aber:
Irgenwie kommt es nach intensiver Benutzung zu Speicherproblemen und einem Absturz. ( Dies Problem habe ich auch reporduzierbar mit der 2.0/CTP-Instalation und ODBC)
Um das zu testen, habe ich auf einem Rechner 1.9 installiert und das folgende Progrämmchen geschrieben:
sqStress.prg
Stresstest für MySql
(2.57 KiB) 375-mal heruntergeladen
Lässt man den Taskmanager parallel zum Programm laufen, läuft der Arbeitspseicher hoch bis zum Absturz mit der anhängenden Fehlermeldung. :blob6:
Hat jemand ne Idee, was da falsch läuft, resp. ich falsch mache? :doubt:

Gruß
Reiner
Dateianhänge
Fehlermeldung.png
Fehlermeldung.png (19.67 KiB) 8617 mal betrachtet
Grüße aus Berlin

Reiner
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: MySql Speicherüberlastung/Absturz

Beitrag von georg »

Hallo, Reiner -



zu jedem :openRecord() gehört ein :close(). Wenn Du das einfügst, vermute ich, dass die Speicherauslastung dramatisch zurückgeht.

Ausserdem öffnest Du nur die Verbindung, liest aber keine Sätze (:Skip()).
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Fischkopp
UDF-Programmierer
UDF-Programmierer
Beiträge: 63
Registriert: Sa, 19. Jul 2014 10:31
Wohnort: Berlin

Re: MySql Speicherüberlastung/Absturz

Beitrag von Fischkopp »

Hallo, Georg
ja klar, lesen tu ich nicht, war mir hier nicht wichtig...

Meinst du :
oTbl:Close() ?
oder die ganze connection? #-o

Danke
Reiner
Grüße aus Berlin

Reiner
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: MySql Speicherüberlastung/Absturz

Beitrag von georg »

Hallo, Reiner -


die oCon regelt den ganzen Datenverkehr zwischen Deinem Programm und dem MySQL-Server, basierend auf Benutzername und Kennwort, sowie der angeforderten Datenbank. Über die oCon kannst Du z.B. mittels :query() oder :realQuery() SQL-Befehle direkt ausführen, deren Ergebnis Dich nur im Sinne von "hat funktioniert" bzw. "hat nicht funktioniert" interessiert, wie z.B. ein DELETE, ein INSERT oder auch ein CREATE TABLE oder ALTER TABLE, um nur einige zu nennen. Auch ein UPDATE fällt in diese Kategorie.

Das MyResult() basiert auf oCon, da es die oCon zugrunde liegende Rechte nutzt, und ein Result Set zurückliefert, mit dem Dein Programm arbeitet. Wenn die Aufgabe des Result Set beendet ist, wird es geschlossen, analog zu einer DBF-Datei, die Du öffnest, liest, verarbeitest und danach schliesst. Also wäre ein oTbl:close() erforderlich. Ich vermute, dass der MySQL-Server irgendwann ein Resourcen-Problem bekommt und "Quatsch" zurückliefert, der dann zum Abbruch in Deinem Programm führt.

Ich habe normalerweise einen Browser, der auf einem MyResult() basiert, und wenn Sätze bearbeitet werden sollen, mache ich jedesmal (in einem eigenen Thread) ein MyResult() auf, um den Satz zu bearbeiten. Da habe ich selbst bei stundenlangen Sitzungen keine Probleme gehabt, aber, wie schon geschrieben, ich schliesse das MyResult()-Objekt jedesmal, wenn ich damit fertig bin.

Am Ende des Programms sollte man dann auch das oCon schliessen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Fischkopp
UDF-Programmierer
UDF-Programmierer
Beiträge: 63
Registriert: Sa, 19. Jul 2014 10:31
Wohnort: Berlin

Re: MySql Speicherüberlastung/Absturz

Beitrag von Fischkopp »

Hallo, Georg
es mag unrealistisch erscheinen, aber ich habe dieses Problem tatsächlich in einer Anwendung, die ich mit 2.0 , aktuellem CTP und ODBC erstellt habe.
Dort gibt es diverse Menupunkte, die nacheinander abgearbeitet werden müssen. Irgenwann taucht der Fehler auf :angry5: , nach einem Neustart geht`s
wieder, die ersten Änderungen sind ja schon geschrieben.
In einem ähnlichen Testlauf wie dem hier beschriebenen kriege ich das Problem weg, wenn ich die connection lösche und neu aufbaue.
Deshalb mein Test mit dieser Methode, würde ja gern auf Hector`s class umsteigen, aber ich krieg`s nicht hin, egal, was wo vor dem :Close() steht :banghead:

Im Grunde heißt das für mich, so kring ich z.B. kein Programm hin, das in einer Endlosschleife in definierten Zeitintervallen eine SQL-Abfrage startet und Ergebnisse zwischenspeichert, weil irgendwann der Absturz kommt :shaking:

Naja, egal, es ist spät, morgen auch noch ein Tag und überhaupt

vielen Dank für die Hilfe bisher
Ciao
Reiner
Grüße aus Berlin

Reiner
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: MySql Speicherüberlastung/Absturz

Beitrag von AUGE_OHR »

hi Reiner,

vielleicht ist es ein Cl*pper geleitetes Procedure Denken statt OOP.

wie Georg ja darstellte ist oCon deine Verbindung zum SQL Server. Diese wird nur am Ende geschlossen.
mittels o:exec() schickst du nun ein SQL Statement ab und bekommst ein Resultset als Object zurück.
wenn du eine Resultset direkt in ein Array schaufelst dann kannst du danach das Resultset schliessen -> o:Close()

Code: Alles auswählen

...
// Verbindung zu SQL Server
  IF !oCon:Connect(cHost,cUser,cPassword,cDbName )
      oCon:close
      return nil
  endif

// Abfrage mit SELECT Statement
  if !oCon:Exec(cTable)
     oCon:close
     return nil
  endif

// Resultset Object
  oTbl := oCon:result
  // umschaufeln in ein Array
  oTbl:close()

  ...
  oCon:close()
RETURN
Wenn Hector, für das Resultset Object, statt dem Method Namen o:Close() -> o:Destroy() genommen hätte wäre es eindeutiger.
Wenn man "native" direkt mit der API arbeitet muss man alles manuell machen und selbst "aufräumen" weil sonst die Ressourcen zur Neige gehen.
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: MySql Speicherüberlastung/Absturz

Beitrag von georg »

Guten Morgen,


dann kommentieren wir's mal:

Code: Alles auswählen

oCon:= MySql():New()
IF  !oCon:RealConnect(cHost,cUser,cPwd )
   MsgBox("keine Verbindung zu  " + cHost)
 ELSE
   IF !oCon:ExisteDb( cDb )
      MsgBox("Die Datenbank  " + cDb + "  existiert nicht !" )
    ELSE
      start=seconds()
Den :selectDB() würde ich VOR die Schleife legen, da Du ja immer auf die gleiche Datenbank zugreifst.

Code: Alles auswählen

         oCon:SelectDb( cDb )
      DO WHILE x<viel
         oTbl := MyResult():New(oCon,,cTable)
         IF oTbl:OpenRecord()
            IF oTbl:RecCount()=NIL
               MsgBox("Keine Datensätze gefunden: " )
             ELSE
               xrec=xrec + (oTbl:RecCount())
            ENDIF
            x=x+1
         ENDIF
Und ein oTbl:close() eingefügt, um die mit dem Result Set verbundenen Resourcen wieder freizugeben:

Code: Alles auswählen

       oTbl:close()
      ENDDO
      msgbox("sqStress.prg:  "+alltrim(str(viel))+"x  `"+cTable+"`  gelesen, insgesamt "+alltrim(str(xrec))+" Datens„tze." + chr(13) + chr(10) + "Dauer: " + rwDauer(start) )
   ENDIF
   oCon:Close()
ENDIF
Damit kann ich das Ganze 200 * durchlaufen und bekomme dieses Ergebnis:

Bild

Auch 500 Durchläufe sind machbar:

Bild

Und hier die Speicherauslastung:

Bild

Auch hat sich die Speicherauslastung nicht bewegt, sie stand die ganze Zeit bei 38%. Versuch es bitte selbst mal!
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Fischkopp
UDF-Programmierer
UDF-Programmierer
Beiträge: 63
Registriert: Sa, 19. Jul 2014 10:31
Wohnort: Berlin

Re: MySql Speicherüberlastung/Absturz

Beitrag von Fischkopp »

Guten Morgen
ja, so habe ich das auch schon gemacht, der Effekt ist der gleiche! :angry2:

Ich habe das auf Win7 32Bit laufen ( auf XP ist`s das selbe). Verfolgt habe ich das im Taskmanager\Prozesse, da wird der Arbeitsspeicher zum jeweiligen Prozess angezeigt, und der läuft hoch bis zum bitteren Ende. Prozessor-Auslastung und physikal. Speicher sind im grünen Bereich. Ich habe allerdings von dem Win-System zuwenig Ahnung, um das brauchbar interpretieren zu können....

Das verrückte ist ja, wenn man die Schleife 2 mal hintereinander baut mit ` oCon:Close() ` dazwischen, kann man die Abfragen so dosieren, das die 1. Schleife durchläuft und die 2. abstürzt! :angry4:
Sebst `oCon:Close()` hilft da also nicht !

@Georg
Dein Rechner zeigt `etwas` :badgrin: mehr Arbeitsspeicher an, als ich hier habe, der Stress kommt natürlich erst bei entsprechend viel Daten/Zugriffen, aber er kommt :angry1:

@Jimmy
ja, das Grundprinzip habe ich schon verstanden, denke ich, kriege ja bisher alles zum laufen, was ich brauche, mir geht`s um Stabilität....
Wenn ein Programm im Einsatz irgendwann wegen sowas Fehler produziert, und die habe ich definitiv, dann ist das Programm eigentlich für die Tonne :doubt:

Was meine `Denke`angeht, ist die natürlich nicht wirklich OOP-gemäß, aber so langsam komme ich dahinter, habe ja auch schon Methoden eingebunden und überlagert mit eigenem Senf, geht schon. Mit der Speicherverwaltung hadere ich noch, saubere Variblen-Deklaration ist in xBase wohl essentiell, aber `private` macht oft Zicken und die sind oft in Unterprozeduren (jaja, OOP ist das dann nicht) nicht zu finden, da laß ich im Moment die Finger von.
Grüße aus Berlin

Reiner
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: MySql Speicherüberlastung/Absturz

Beitrag von georg »

Hallo, Reiner -


dann sage doch mal was zu Deinem MySQL-Server:

Lokal?
Version?

Dann: öffne mal die MySQL Console und gebe den Befehl

Code: Alles auswählen

show processlist;
ein, und dann lass mal das Programm laufen und wiederhole den Befehl (zum Kopieren: Cursor nach oben) in der MySQL Console. Vielleicht hilft Dir das beim Lokalisieren der Ursache.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: MySql Speicherüberlastung/Absturz

Beitrag von brandelh »

wobei GEORG nicht die Connection (oCon) sondern oTbl:close() (den Cursor(), das Ergebnis) geschlossen hat.
oCon erst am Ende des Programmes.
Gruß
Hubert
Antworten