Laden der Seed-Listen zieht am GC?

Hier finden YaCy User Hilfe wenn was nicht funktioniert oder anders funktioniert als man dachte. Bei offensichtlichen Fehlern diese bitte gleich in die Bugs (http://bugs.yacy.net) eintragen.
Forumsregeln
In diesem Forum geht es um Benutzungsprobleme und Anfragen für Hilfe. Wird dabei ein Bug identifiziert, wird der thread zur Bearbeitung in die Bug-Sektion verschoben. Wer hier also einen Thread eingestellt hat und ihn vermisst, wird ihn sicherlich in der Bug-Sektion wiederfinden.

Laden der Seed-Listen zieht am GC?

Beitragvon Quix0r » Sa Feb 20, 2010 7:00 am

Hallo,

ich habe es hinbekommen, den NetBeans-Profiler an YaCy anzubinden, ist eigentlich eine ganz einfache Sache. :)

Ich habe nun herausbekommen, dass das Laden der Seed-Listen von anderen Nodes deutlich mehr Zeit im GC verbraucht, als z.B. das Laden von Blobs.

Das Laden der Seed-Listen (Relative time spent in GC) liegt dabei bei 30-35%, hingegen das Laden der Blobs (Index-Erstellung) nur bei ~0,1-3% ist.

Frage: Wie oft werden die Methoden aufgerufen, die auch beim Laden der Seed-Dateien aufgerufen werden? Zudem habe ich viel "synchronized" in Methodensignaturen gesehen, wo die Methode >10 Zeilen Code hat (30 Zeilen teilweise), was natuerlich Performance killt.

Z.B. ist yacyPeerActions.connectPeer() auf synchronized und ist sehr gross und wird von peerArrival() aufgerufen, das wiederrum 2x in yacyCore und 1x in yacyClient aufgerufen wird.

Wenn also connectPeer() den GC beim Booten ungewoehnlich (zirka das 10- bis 100-fache) belastet, dann auch bei jedem Peer-Ping/Connect? Das sollte dann mal optimiert werden.

Hier ist mal auszugsweise ein Thread-Dump:
Code: Alles auswählen
"PublishSeed_hds-bbg" prio=10 tid=0x0000000040bef800 nid=0x5ba7 runnable [0x00007fc776c4e000]
   java.lang.Thread.State: RUNNABLE
        at de.anomic.yacy.yacySeedDB$seedEnum.hasNext(yacySeedDB.java:982)
        at de.anomic.yacy.yacySeedDB.lookupByIP(yacySeedDB.java:652)
        at de.anomic.yacy.yacyPeerActions.connectPeer(yacyPeerActions.java:85)
        - locked <0x00007fc78a57da20> (a de.anomic.yacy.yacyPeerActions)
        at de.anomic.yacy.yacyPeerActions.peerArrival(yacyPeerActions.java:195)
        at de.anomic.yacy.yacyClient.publishMySeed(yacyClient.java:229)
        at de.anomic.yacy.yacyCore$publishThread.run(yacyCore.java:234)

"PublishSeed_Z4Vi" prio=10 tid=0x0000000040bed800 nid=0x5ba6 waiting for monitor entry [0x00007fc776d4f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at de.anomic.yacy.yacyPeerActions.connectPeer(yacyPeerActions.java:59)
        - waiting to lock <0x00007fc78a57da20> (a de.anomic.yacy.yacyPeerActions)
        at de.anomic.yacy.yacyPeerActions.peerArrival(yacyPeerActions.java:195)
        at de.anomic.yacy.yacyClient.publishMySeed(yacyClient.java:229)
        at de.anomic.yacy.yacyCore$publishThread.run(yacyCore.java:234)

"PublishSeed_luna-2" prio=10 tid=0x0000000040e23800 nid=0x5ba5 waiting for monitor entry [0x00007fc776e50000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at de.anomic.yacy.yacyPeerActions.connectPeer(yacyPeerActions.java:59)
        - waiting to lock <0x00007fc78a57da20> (a de.anomic.yacy.yacyPeerActions)
        at de.anomic.yacy.yacyPeerActions.peerArrival(yacyPeerActions.java:195)
        at de.anomic.yacy.yacyClient.publishMySeed(yacyClient.java:229)
        at de.anomic.yacy.yacyCore$publishThread.run(yacyCore.java:234)

"PublishSeed_KIT01-05-checker" prio=10 tid=0x0000000040e22800 nid=0x5ba4 waiting for monitor entry [0x00007fc776f51000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at de.anomic.yacy.yacyPeerActions.connectPeer(yacyPeerActions.java:59)
        - waiting to lock <0x00007fc78a57da20> (a de.anomic.yacy.yacyPeerActions)
        at de.anomic.yacy.yacyPeerActions.peerArrival(yacyPeerActions.java:195)
        at de.anomic.yacy.yacyClient.publishMySeed(yacyClient.java:229)
        at de.anomic.yacy.yacyCore$publishThread.run(yacyCore.java:234)

"PublishSeed_cophome" prio=10 tid=0x00000000408d1000 nid=0x5ba3 waiting for monitor entry [0x00007fc777052000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at de.anomic.yacy.yacyPeerActions.connectPeer(yacyPeerActions.java:59)
        - waiting to lock <0x00007fc78a57da20> (a de.anomic.yacy.yacyPeerActions)
        at de.anomic.yacy.yacyPeerActions.peerArrival(yacyPeerActions.java:195)
        at de.anomic.yacy.yacyClient.publishMySeed(yacyClient.java:229)
        at de.anomic.yacy.yacyCore$publishThread.run(yacyCore.java:234)

"PublishSeed_rrzn-nhf3" prio=10 tid=0x0000000040bf1000 nid=0x5ba2 waiting for monitor entry [0x00007fc777153000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at de.anomic.yacy.yacyPeerActions.connectPeer(yacyPeerActions.java:59)
        - waiting to lock <0x00007fc78a57da20> (a de.anomic.yacy.yacyPeerActions)
        at de.anomic.yacy.yacyPeerActions.peerArrival(yacyPeerActions.java:195)
        at de.anomic.yacy.yacyClient.publishMySeed(yacyClient.java:229)
        at de.anomic.yacy.yacyCore$publishThread.run(yacyCore.java:234)

Wie leicht erkennbar, ist ein PublishSeed-Thread aktiv in der connectPeer()-Methode drinne, die anderen warten an ihr - wegen synchronized.
Quix0r
 
Beiträge: 1345
Registriert: Di Jul 31, 2007 9:22 am
Wohnort: Krefeld

Re: Laden der Seed-Listen zieht am GC?

Beitragvon Lotus » Sa Feb 20, 2010 9:56 am

Ich vermute, ausschlaggebend ist hier die relative Zeit. Seedlisten laden geht eben schnell, während Blobs die CPU belasten.
Lotus
 
Beiträge: 1699
Registriert: Mi Jun 27, 2007 3:33 pm
Wohnort: Hamburg

Re: Laden der Seed-Listen zieht am GC?

Beitragvon Quix0r » Sa Feb 20, 2010 10:04 am

Nein, schau nochmals auf den Dump. Er haengt an connectPeer() fest (der laeufende Thread hat ein Lock auf diese Methode - wegen synchronized), die anderen warten, um ein Lock taetigen zu koennen. Das meinte ich.

Hier mal ein paar Bilder, vielleicht aufschlussreich fuer den Einen oder Anderen:

Bild
Bild
Bild
Die Bezeichner sind leider hier im Forum etwas abgehackt, sind aber aud der originalen Grafik aber drauf, also mal klicken schadet nicht. ;)

Dazu auffallend sind viele PublishSeed- und Session-Threads auf Blocked (warten halt auf den Lock fuer einen synchronized-Block/-Methode), was nicht gut fuer die Performance ist.

Hier eine andere Grafik, nur zur Veranschaulichung:
Bild
Quix0r
 
Beiträge: 1345
Registriert: Di Jul 31, 2007 9:22 am
Wohnort: Krefeld

Re: Laden der Seed-Listen zieht am GC?

Beitragvon Quix0r » Sa Feb 20, 2010 1:57 pm

Dann habe ich die Dauer der Methodenaufrufe mal mit dem Profiler gemessen, einmal darf man raten, welche Methoden ganz weit oben standen: Welche mit "synchronized" in der Methodensignatur! U.a. waren dies: HeapReader.get() (synchronized in der Signatur), CachedFileWriter.readFully() (selbiges und weitere Methoden mit selbigem ebenfalls) und einige in RowCollection (sort z.B.) sowie welche in ChunkIterator (teilweise kein synchronized). Wobei die ersteren genannten die lahmsten und die zuletztz genannten nur auffallend sind. (Wieso dauert next0() in ChunkIterator so lange? Muss die so gross sein? Und wieso ist sort() in RowCollection so komplex, geht nicht etwas einfacheres?)
Quix0r
 
Beiträge: 1345
Registriert: Di Jul 31, 2007 9:22 am
Wohnort: Krefeld

Re: Laden der Seed-Listen zieht am GC?

Beitragvon Vega » Sa Feb 20, 2010 9:01 pm

@Quix0r - auch wenn das etwas OT ist, kannst Du das vielleicht der Netbeans Anleitung im WIKI hinzufügen - und diese generell mal gegen-lesen ?
Ich hab das mal angefangen auf die aktuelle NetBeans-Version anzupassen, bin da aber abgestorben.

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

Re: Laden der Seed-Listen zieht am GC?

Beitragvon Quix0r » So Feb 21, 2010 1:14 am

@Vega: Okay. :)

Erledigt.
Quix0r
 
Beiträge: 1345
Registriert: Di Jul 31, 2007 9:22 am
Wohnort: Krefeld


Zurück zu Fragen und Antworten

Wer ist online?

Mitglieder in diesem Forum: Exabot [Bot] und 4 Gäste