MemoryControl

Forum for developers

MemoryControl

Beitragvon sixcooler » Mi Aug 10, 2011 3:43 pm

wegen der Bugmeldung habe ich mich mit dem MemoryControl beschäftigt.

Beim Auftreten des Bugs beobachtete ich hohe GC-Aktivität, obwohl noch einiges
an Speicher verfügbar schien.
So kam ich dann ja dazu den GCload zu betrachten

Eine differenzierte Betrachtung der Teilbereiche des Heap
('Eden Space', 'Survivor' und 'Old Gen') brachte mich zu dem Schluss das der
'Bug' auftritt, wenn der 'Old Gen' voll ist.


Zur Theorie (vereinfacht):

Neue Objekte werden im 'Eden Space' angelegt.
Ein GC löscht Objekte im 'Eden Space' wenn sie nicht mehr verlinkt sind
oder 'verschiebt' sie in den 'Survivor' wenn sie noch verlinkt sind.
Der 'Eden Space' ist nach dem GC in beiden Fällen leer,
bis neue Objekte angelegt werden.

Der 'Survivor' ist in der Realität doppelt ausgelegt.
Vereinfach beschrieben gilt aber das gleich wie für den 'Eden Space':
Ein GC löscht Objekte im 'Survivor' wenn sie nicht mehr verlinkt sind
oder 'verschiebt' sie in den 'Old Gen' wenn sie noch verlinkt sind.

Der 'Old Gen' hat seinen eigen GC (full GC).
Hier werden beim GC nur nicht verlinkte Objekte gelöscht.


Für mich ergeben sich daraus folgende Schlüsse:

Für ein gutes funktionieren des GC sollte genug Platz im 'Old Gen' sein
um möglicherweise noch verlinkte Objekte aus dem 'Survivor' aufzunehmen.

Solange im 'Old Gen' genug freier Speicher ist kann man ruhig den gesamten
'Eden Space' für neue Objekte heranziehen.
(der GC dort frist kaum Zeit und wir ja automatisch ausgeführt)
Ist dem nicht so, bleibt nur noch der freie 'Eden Space' für neue Objekte.

Nun habe ich also bei mir Memory Control dahingehen geändert
und bin mit dem Ergebniss bisher recht zufrieden.

Es braucht keint GC mehr ausgeführt werden um die Speichermenge zu identifizieren
(die genutzte MemoryPoolMXBean hat die Möglichkeit den gach einem potentiellen GC
verfügbare Speichermenge zu bestimmen)
Und es braucht kein mittelwert der letzten manuellen GCs mehr hernagezogen werden.

Bevor ich das aber committe, werden ich das hier noch einige Zeit lang beobachten.

Über feedback zu dieser Geschichte würde ich mich aber auch vorher schon freuen :-)

cu, sixcooler.
sixcooler
 
Beiträge: 494
Registriert: Do Aug 14, 2008 5:22 pm

Re: MemoryControl

Beitragvon Vega » Mo Aug 15, 2011 9:19 pm

Ich fände es sehr gut wenn noch jemand neben Michael mal über die Speicherverwaltung von YaCy "drübersieht" - 4 Augen sehen mehr als zwei, und neue Ideen schaden nie.

Gruß,
Thomas
Vega
 
Beiträge: 824
Registriert: Mi Jun 27, 2007 3:34 pm
Wohnort: Dresden

Re: MemoryControl

Beitragvon sixcooler » So Aug 21, 2011 2:50 pm

Hallo,

auf Anregung von Orbiter hab ich die bisherige (Standard Memory Strategy) und mein neues Zeuch (Generation Memory Strategy) nun mal wählbar gebaut.
Die Standard Memory Strategy ist dabei default und Fallback - wenn also kein genrationsorientier Heap vorliegt geht es weiter wie bisher.

In dem Bildchen hier sieht man an der blauen Kurve des verfügbaren Speichers recht gut die Unterschiede der beiden Strategien.

Wegen der Anfragen zum G1:
Im ganzen weiss ich noch nicht so recht was ich von dessen Reifegrad zu halten habe.
Die Generation Memory Strategy ist weniger hierfür geeignet.
Ich hab dafür aber schon ähnliche Ideen und werde auch dafür eine Memory Strategy bauen.

Noch ein wenig feinschliff - und dann ists wohl auch bereit für einen commit, denke ich.

Cu, sixcooler.
Dateianhänge
memoryStrategy.png
Generation Memory Strategy -> Standard Memory Strategy
memoryStrategy.png (15.29 KiB) 1295-mal betrachtet
sixcooler
 
Beiträge: 494
Registriert: Do Aug 14, 2008 5:22 pm

Re: MemoryControl

Beitragvon sixcooler » So Aug 21, 2011 3:36 pm

Um zu veranschaulichen, weswegen ich das überhaupt gemacht hab, ein Vergleich vom Aufruf MemoryControl.main():

Mit der Standard Memory Strategy:
Code: Alles auswählen
yacy/gen $ java -Xms32m -Xmx32m net/yacy/kelondro/util/MemoryControl
vm: 20.0-b11
computed max = 30 mb
using Standard Memory Strategy
used = 0 / 1, total = 30, free = 28, max = 30, avail = 28, averageGC = 0
used = 1 / 2, total = 30, free = 27, max = 30, avail = 27, averageGC = 0
used = 2 / 3, total = 30, free = 26, max = 30, avail = 26, averageGC = 0
used = 3 / 4, total = 30, free = 25, max = 30, avail = 25, averageGC = 0
used = 4 / 5, total = 30, free = 24, max = 30, avail = 24, averageGC = 0
used = 5 / 6, total = 30, free = 23, max = 30, avail = 23, averageGC = 0
used = 6 / 7, total = 30, free = 22, max = 30, avail = 22, averageGC = 0
used = 7 / 8, total = 30, free = 21, max = 30, avail = 21, averageGC = 0
used = 8 / 9, total = 30, free = 20, max = 30, avail = 20, averageGC = 0
used = 9 / 10, total = 30, free = 19, max = 30, avail = 19, averageGC = 0
used = 10 / 11, total = 30, free = 18, max = 30, avail = 18, averageGC = 0
used = 11 / 12, total = 30, free = 17, max = 30, avail = 17, averageGC = 0
used = 12 / 13, total = 30, free = 16, max = 30, avail = 16, averageGC = 0
used = 13 / 14, total = 30, free = 15, max = 30, avail = 15, averageGC = 0
used = 14 / 15, total = 30, free = 15, max = 30, avail = 15, averageGC = 0
used = 15 / 16, total = 30, free = 14, max = 30, avail = 14, averageGC = 0
used = 16 / 17, total = 30, free = 13, max = 30, avail = 13, averageGC = 0
used = 17 / 18, total = 30, free = 12, max = 30, avail = 12, averageGC = 0
used = 18 / 19, total = 30, free = 11, max = 30, avail = 11, averageGC = 0
used = 19 / 20, total = 30, free = 10, max = 30, avail = 10, averageGC = 0
used = 20 / 21, total = 30, free = 9, max = 30, avail = 9, averageGC = 0
used = 21 / 22, total = 30, free = 8, max = 30, avail = 8, averageGC = 0
used = 22 / 23, total = 30, free = 7, max = 30, avail = 7, averageGC = 0
used = 23 / 24, total = 30, free = 6, max = 30, avail = 6, averageGC = 0
used = 24 / 25, total = 30, free = 5, max = 30, avail = 5, averageGC = 0
used = 25 / 26, total = 30, free = 4, max = 30, avail = 4, averageGC = 0
used = 26 / 27, total = 30, free = 3, max = 30, avail = 3, averageGC = 0
used = 27 / 28, total = 30, free = 2, max = 30, avail = 2, averageGC = 0
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
   at net.yacy.kelondro.util.MemoryControl.main(MemoryControl.java:193)
-> OOM!
So dürfte das auch im bisherigen Code sein.

Mit der Generation Memory Strategy:
Code: Alles auswählen
yacy/gen $ java -Xms32m -Xmx32m net/yacy/kelondro/util/MemoryControl gen
vm: 20.0-b11
computed max = 30 mb
using Generation Memory Strategy
used = 0 / 1, total = 30, free = 6, max = 30, avail = 8
used = 1 / 2, total = 30, free = 5, max = 30, avail = 8
used = 2 / 3, total = 30, free = 4, max = 30, avail = 8
used = 3 / 4, total = 30, free = 3, max = 30, avail = 8
used = 4 / 5, total = 30, free = 2, max = 30, avail = 8
used = 5 / 6, total = 30, free = 1, max = 30, avail = 8
used = 6 / 7, total = 30, free = 0, max = 30, avail = 8
used = 7 / 8, total = 30, free = 6, max = 30, avail = 8
used = 8 / 9, total = 30, free = 5, max = 30, avail = 8
used = 9 / 10, total = 30, free = 4, max = 30, avail = 8
used = 10 / 11, total = 30, free = 3, max = 30, avail = 8
used = 11 / 12, total = 30, free = 2, max = 30, avail = 8
used = 12 / 13, total = 30, free = 1, max = 30, avail = 8
used = 13 / 14, total = 30, free = 0, max = 30, avail = 8
used = 14 / 15, total = 30, free = 6, max = 30, avail = 6
used = 15 / 16, total = 30, free = 5, max = 30, avail = 6
used = 16 / 17, total = 30, free = 4, max = 30, avail = 6
used = 17 / 18, total = 30, free = 3, max = 30, avail = 6
used = 18 / 19, total = 30, free = 2, max = 30, avail = 6
used = 19 / 20, total = 30, free = 1, max = 30, avail = 6
used = 20 / 21, total = 30, free = 0, max = 30, avail = 6
used = 21 / 22, total = 30, free = 5, max = 30, avail = 0
-> kein OOM - aber es endet auch schon etwas früher
sixcooler
 
Beiträge: 494
Registriert: Do Aug 14, 2008 5:22 pm

Re: MemoryControl

Beitragvon Low012 » Di Aug 23, 2011 10:28 am

Super, dass du dir das anschaust und die Wahlmöglichkeit eingebaut hast! Ich wollte es auch gleich mal ausprobieren, habe aber dann diese Fehlermeldung bekommen (Client-IP von mir durch xxx.xxx.xxx.xxx ersetzt):

Code: Alles auswählen
Session: Session_xxx.xxx.xxx.xxx:53389#0_POST /PerformanceMemory_p.html HTTP/1.1
Query:   /PerformanceMemory_p.html
Client:  xxx.xxx.xxx.xxx
Reason:  FileUploadException Stream ended unexpectedly
java.io.IOException: FileUploadException Stream ended unexpectedly
        at de.anomic.http.server.HTTPDemon.parseMultipart(HTTPDemon.java:830)
        at de.anomic.http.server.HTTPDFileHandler.doResponse(HTTPDFileHandler.java:376)
        at de.anomic.http.server.HTTPDFileHandler.doPost(HTTPDFileHandler.java:249)
        at de.anomic.http.server.HTTPDemon.POST(HTTPDemon.java:529)
        at sun.reflect.GeneratedMethodAccessor16.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at de.anomic.server.serverCore$Session.listen(serverCore.java:757)
        at de.anomic.server.serverCore$Session.run(serverCore.java:651)


Leider kann ich im Moment nicht weiter wühlen. Eventuell ist auch mein Peer vergurkt.

edit: Tritt auf, wen ich versuche, "simulate short memory status" und "use Standard Memory Strategy" ausschalte.
Low012
 
Beiträge: 2214
Registriert: Mi Jun 27, 2007 12:11 pm

Re: MemoryControl

Beitragvon sixcooler » Di Aug 23, 2011 6:25 pm

Hallo,

ich fürchte: bei dem Fehler muss ich passen.
Ich habe keine Ahnung wie es dazu kam. Die Abfrage von MemoryControl ist an der Stelle schon durch. Der Stream der da bei Dir vorzeitig abbrach, hat soweit ich sehe auch keine speicherkritischen Verarbeitung an der Stelle.

Ich würde mal frech behaupten das der Stream schon zu YaCy abgebrochen ist.
Kannst Du das reproduzieren?

Cu, sixcooler.
sixcooler
 
Beiträge: 494
Registriert: Do Aug 14, 2008 5:22 pm

Re: MemoryControl

Beitragvon Low012 » Di Aug 23, 2011 6:42 pm

Ja, kann ich. Vorhin habe ich es aus dem Büro probiert, jetzt von zu hause aus. Wenn ich es irgendwie schaffe, probiere ich das heute Abend zu debuggen, ich weiß nur noch nicht, ob ich Zeit haben werde.
Low012
 
Beiträge: 2214
Registriert: Mi Jun 27, 2007 12:11 pm


Zurück zu YaCy Coding & Architecture

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron