Domino 9 und frühere Versionen > ND6: Entwicklung

Performance Messung verschiedener Aufrufe gegen nsf auf Server

(1/2) > >>

Axel_Janssen:
Hi,

ich habe mal die Zugriffszeiten einer Remote Java-Anwendung gegen meinen häuslichen Notes-Server gemessen.
Lotus-Script sollte sich ähnlich verhalten.

Die ersten beiden sind selbsterklärend.
Daten V_MP ist das holen einer View, daraus eine Collection, dann ein iterieren über z. Zt. 6 Dokumente und das Schreiben von so ermittelten Daten an jeweis die Stelle [n][0] eines Multi-Dimensionalen Arrays sowie erzeugen einer java.util.HashMap und dessen Befüllen (pro Dokument ein Entry).  
Rest ist nochmal sowas in der Art von Daten_VMP aber mit nur 0-2 Dokumenten + wesentlich mehr Operationen mit get() auf java.util.HashMap, weiteres Befüllen des Multi-Dimensionalen Arrays. Teilweise gibt es in den NotesCollection mit dem jeweiligen key keine Daten (Erklärung von 0 Sekunden).  

Die einzelnen Aufrufe finden immer wieder neu statt.*

--- Code: ---Aufruf 1:
NotesFactory.createSessionWithFullAccess("kennwort") dauerte 0,187 Sekunden
nSession.getDatabase (serverName, serverPath) dauerte 0,234 Sekunden
Daten V_MP dauerte 0,079 Sekunden
Rest dauerte 0,015 Sekunden

Aufruf 2:
NotesFactory.createSessionWithFullAccess("kennwort") dauerte 0,016 Sekunden
nSession.getDatabase (serverName, serverPath) dauerte 0,094 Sekunden
Daten V_MP dauerte 0,015 Sekunden
Rest dauerte 0,016 Sekunden

Aufruf 3:
NotesFactory.createSessionWithFullAccess("kennwort") dauerte 0,016 Sekunden
nSession.getDatabase (serverName, serverPath) dauerte 0,093 Sekunden
Daten V_MP dauerte 0,016 Sekunden
Rest dauerte 0,016 Sekunden

Aufruf 4:
NotesFactory.createSessionWithFullAccess("kennwort") dauerte 0,015 Sekunden
nSession.getDatabase (serverName, serverPath) dauerte 0,125 Sekunden
Daten V_MP dauerte 0,016 Sekunden
Rest dauerte 0,047 Sekunden

Aufruf5:
NotesFactory.createSessionWithFullAccess("kennwort") dauerte 0,015 Sekunden
nSession.getDatabase (serverName, serverPath) dauerte 0,094 Sekunden
Daten V_MP dauerte 0,031 Sekunden
Rest dauerte 0 Sekunden

--- Ende Code ---


Was mir nun so bewußt geworden:
- Die bei weitem kostspieligste Operation ist stets das Holen des NotesDatabase-Objekts.
- Die Session wird offenbar irgendwo in Notes gecacht (erster Aufruf dauert länger und in meinem Code wird es (noch) nicht gecached.
- Iterieren über die View ist nicht so kostspielig (Optimierungsmöglichkeiten mglchws über NotesViewEntry (oder so ähnlich).  

In Java kann ich sowas ganz einfach basteln rund um die Funktion System.currentTimeMillis() oder so ähnlich.
Werd die Klasse noch verbessern, mit Log4U integrieren und ins "Java für Anfänger" posten.

FRAGE1: Ich habe jetzt keine Zeit in der Doku nachzuschlagen. Kann man sowas auch mit LotusScript machen? Wenn ja, warum habe ich das nie gemacht?

FRAGE2: Warum ist das Holen der NotesDatabase so kostspielig?
Ist es der SicherheitsCheck innerhalb von Notes?
Ist das Objekt so groß?
Es ist jeweils der erste Zugriff auf den Server. Ist das vielleicht kostspielig?

FRAGE3: Der NotesServer ist natürlich sehr nah an dem Client (beides auf 1 Rechner). Gibt es irgendwelche Tools, womit ich den LoopBackAdapter von Windows ausbremsen kann, um es Kunden-realistischer zu machen?

--------------------  
* hat was damit zu tun, dass ich vor der großen Multithreading-Programmierungs-Offensive meine NotesConnection-Klasse mehrfach gebrauchte Objekte wie Notes-Datenbanken oder Sessions nicht in Status-Variablen ablegen kann)

harkpabst_meliantrop:

--- Zitat von: Axel_Janssen am 18.07.03 - 11:26:31 ---FRAGE1: Ich habe jetzt keine Zeit in der Doku nachzuschlagen. Kann man sowas auch mit LotusScript machen? Wenn ja, warum habe ich das nie gemacht?
--- Ende Zitat ---
Was machen? Eine Messung der Ausführungszeit? Geht, es gibt von der View eine fertige Klasse dafür, die man sich runterladen kann und die das Handling recht einfach macht. Rob hatte die neulich mal eingesetzt, als es um den Geschwindigkeitsunterschied zwischen While und For-Schleifen (oder so) ging.

Und du hast das nie gemacht, weil du da gerade auf der Ranch rumgaloppiert bist, statt die View zu lesen.


--- Zitat ---FRAGE3: Der NotesServer ist natürlich sehr nah an dem Client (beides auf 1 Rechner). Gibt es irgendwelche Tools, womit ich den LoopBackAdapter von Windows ausbremsen kann, um es Kunden-realistischer zu machen?

--- Ende Zitat ---
Man hat mir mal erzählt, dafür müsste man einfach nur in der Registry den MTU-Wert für die Verbindung runtersetzen. Hab ich aber leider nie ganz verstanden/hinbekommen.

Aber warum willst du überhaupt eine künstliche Verzögerung einbauen? Es sieht dann zwar realistischer aus, aber deine gemessenen Zeiten werden doch kein bisschen genauer. Eher im Gegenteil, der relative Anteil der untersuchten Operationen an der Geamtzeit sinkt ja.

Glombi:
Hi Axel,
also wenn ich Deine Beiträge so lesen, komme ich mir irgendwie wie im falschen Film vor. Zu den meisten hier geposteten (Notes-)Problemen habe ich ja eine Ahnung, worum es geht und eine Idee (es sei denn der Ersteller macht es spannend und erwähnt nach der 20. Antwort "Hatte ich es schon gesagt: Das muss auch Web fähig sein" aarrg  ;D)
Aber das mit dem Java. Da werd ich mich wohl mal reinhängen müssen...


Zu Deiner Frage 2) Die NotesDatabase enthält in der Tat die meisten Infos. Sieht man, wenn man den Debugger laufen laesst und dann man "versehentlich" auf ein Object der NotesDatabase Klasse klickt. Dann kann man erstmal Kaffee holen gehen...
Nach endlich langer Zeit sieht man dann aber auch, was Notes so alles einliest.

Zu Frage 1) Meinst Du das Timer bzw. NotesTimer?

Andreas

Axel_Janssen:

--- Zitat von: harkpabst_meliantrop am 22.07.03 - 18:12:33 ---Aber warum willst du überhaupt eine künstliche Verzögerung einbauen? Es sieht dann zwar realistischer aus, aber deine gemessenen Zeiten werden doch kein bisschen genauer. Eher im Gegenteil, der relative Anteil der untersuchten Operationen an der Geamtzeit sinkt ja.

--- Ende Zitat ---
Nicht ganz sicher, ob ich mich hier richtig ausgedrückt habe.   ;D
Meine Messung misst nicht feingranular jeden einzelnen Aufruf, sondern ich starte die Messung  irgendwo mit:

--- Code: ---de.aja.system.SimplePerfChecker.start();

--- Ende Code ---
und beende die Messung irgendwo mit:

--- Code: ---de.aja.system.SimplePerfChecker.stop();

--- Ende Code ---
Wenn dazwischen der zeitaufwendige remote-call auf die Server-Datenbank stattfindet, dann wäre es doch für die Messung realistisch, wenn dieser Zugriff langsamer stattfinden würde. Oder?

@Glombi: Das mit dem Effekt im Debugger war mir bekannt. Einige Aspekte dieser Konstruktion haben mich aber nun sehr erstaunt.
Laß dich von dem Java nicht verwirren. Ich arbeite ja mit dem Notes.jar Paket und das greift letztlich auf die gleichen C-Klassen für die Remote Procedure Calls von LoNo zu, wie Lotus Script auch (und die C-API sicherlich genauso).
Ich kann das NotesDatabase-Objekt in eine Objekt-Variable schreiben, den Server, auf dem die Datenbank liegt herunterfahren, arbeite aber trotzdem mit dem vorher gecachten NotesDatabase-Objekt weiter.
- Wenn ich dann nDatabase.isOpen() abfrage, gibt sie mir true zurück (ein Skandal, zumal es keinen nDatabase.close() gibt!)
- Ich kann mir die Views holen nDatabase.getView("aView"); // o.k. das hat mich nicht überrascht
- Ich kann mir dann aber von einer solchen neu erzeugten View eine (notes)-DocumentCollection holen mit nCol = aView.getAllDocumentsByKey(key);
Ich habe bei diesem letzten Aufruf spätestens eine Exception erwartet. Er gab aber einfach eine leere NotesDocumentCollection zurück.  

Glombi:
Hi Axel,
schon interessant, was Notes da so macht.

Das nDatabase.isOpen()  muesste eigentlich
nDatabase.wasOpened()  oder so heissen. Wenn man die DB öffnet, hat das Objekt wohl die Eigenschaft isOpen = true, auch wenn man in der Zwischenzeit den Server herunterfährt oder die DB löscht.

Andreas

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln