Hallo miteinander,
einen habe ich hier noch, über den ich noch nicht so recht drüberkucke:
Gegeben ist ein Java-Agent, der sich über eine View eine Reihe von UniversalIDs zieht und damit eine Hashtable füllt.
Wenn eine Hashtable eine gewisse Anzahl von UNIDs enthält, wird mit dieser Hashtable und einer neuen NotesSession ein Worker-Thread gestartet, der dann die eigentliche Arbeit über dieser Teilmenge von Dokumenten übernimmt. Nach dem Start eines Workers wird eine neue Hashtable mit wiederum 2000 UNIDs gefüllt und der nächste Worker angestoßen, bis die komplette View abgearbeitet ist. Auf diese Weise werden ca. 20 Threads gestartet, die dann 2000 Dokumente pro Thread abarbeiten sollen.
Das Abholen der Unids geht rasend schnell.
800 UNIDs pro Sekunde sind kein Problem. Der Server jammert dort dann etwas von 20.000 Transactions/Minute aber das soll so sein.
Das eigentliche Bearbeiten der Teilmengen in den Workern jedoch enttäuscht ungemein. Der Client, auf dem der Agent läuft, hat eine CPU-Auslastung von 20% und einen Netzwerktraffic von noch nicht mal 100k/sec.
Der Server (Unix) hat während dem Lauf der Worker einen Load von 1 und einen Netz-IO, der gerade mal einer 10MBit Netzwerkkarte gerecht wird. Die Durchsätze im Nicht-Notes-Bereich erreichen jedoch problemlos 10 MBYTES/sec.
Das SCSI-Raid zeigt einen Disk-IO von nicht mal 3 MB/sec an. Gemessen wurde mit Bonnie jedoch auf diesem Server ein Disk-IO von 50MB/sec. Entsprechend ist auch die im wait() verbrachte Zeit auf dem Server recht niedrig.
Der Server hat während dem reinen Worker-Lauf nur noch ca. 3000 Transactions / Minute.
Beim Profiling des Agenten ergab es sich, daß die in den Workerthreads aufgerufene Funktion getDocumentByUnid() mehr als 95% der Zeit verbraucht. Wenn man einen einzelnen Worker-Thread im Debugger von Eclipse durchsteppt, bekommt man auch durchaus Wartezeiten von 10 Sekunden und mehr, wenn diese Funktion angetriggert wird und andere Threads hingegen "normal" laufen.
getDocumentByUnid() ist normalerweise als rasend schnell bekannt, da sie direkt über die DocID das entsprechende Dokument aus der Datenbank beziehen kann?
Wieso braucht getDocumentByUnid() jedoch in einer Multithreaded-Anwendung auf einmal so lange? Und wieso wird hierbei der Server und der Client nicht mehr belastet? Kann man irgendwelche Einstellungen vornehmen, die diese Funktionen etwas mehr aufpeppen, wenn sie multithreaded laufen? Oder liegt da über der API ein dermaßen breiter und wenig granularer Lock, daß nichts geht, wenn eine Notes-API-Funktion aufgerufen wird?
a--