Autor Thema: Performance Messung verschiedener Aufrufe gegen nsf auf Server  (Gelesen 3282 mal)

Offline Axel_Janssen

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 769
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


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)
« Letzte Änderung: 18.07.03 - 12:28:56 von Axel_Janssen »
... design patterns are abstract designs that help identify the structure and elements involved in a specific design solution. From this, a concrete implementation can be produced.
Kyle Brown

Offline harkpabst_meliantrop

  • Senior Mitglied
  • ****
  • Beiträge: 463
  • Geschlecht: Männlich
  • I love!
    • Heute schon gelebt?
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?
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?
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

  • Gast
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

Offline Axel_Janssen

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 769
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.
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();
und beende die Messung irgendwo mit:
Code
de.aja.system.SimplePerfChecker.stop();
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.  
« Letzte Änderung: 25.07.03 - 15:30:31 von Axel_Janssen »
... design patterns are abstract designs that help identify the structure and elements involved in a specific design solution. From this, a concrete implementation can be produced.
Kyle Brown

Glombi

  • Gast
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

Offline harkpabst_meliantrop

  • Senior Mitglied
  • ****
  • Beiträge: 463
  • Geschlecht: Männlich
  • I love!
    • Heute schon gelebt?
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();
und beende die Messung irgendwo mit:
Code
de.aja.system.SimplePerfChecker.stop();
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?
Ich hoffe (immer noch), dass ich das richtig verstanden habe. Also versuche ich nochmal mein Argument anders zu formulieren.

Der Zeitbedarf für den gesamte Remote-Call setzt sich natürlich aus den jeweilige Ausführungszeiten des Codes und der Verzögerung durch das Netzwerk zusammen. Im besten Fall ist diese Verzögerung einfach nur eine konstante Zeit, im schlechtesten Fall eine von Aufruf zu Aufruf durch unterschiedliches Routing und unterschiedliche Auslastung schwankende Zeit.

Den zweiten Fall will man sicher nicht simulieren, weil sich  ohnehin keine reproduzierbaren Ergebnisse gewinnen lassen. Aber auch die erste Möglichkeit bietet meiner Meinung nach keine Vorteile. Du misst und vergleichst die Zeit für verschiedene zusammengesetzte Operationen. Wenn nun zu jeder Zeit einfach eine Verzögerung addiert wird, die lang im Vergleich zur Ausführungszeit des Codes ist, dann wird dadurch doch der relative Zeitunterschied zwischen den Operationen (z.B. als prozentuale Angabe) geringer, bei einer feststehenden Genauigkeit der Zeitmessung also eher ungenauer.

Solange der Zugriff überhaupt über den LoopBack-Adapter erfolgt, also tatsächlich über ein (wenn auch extrem schnelles) Netzwerk und nicht lokal, sehe ich also keine Nachteil.

Das einzige, was man so natürlich tatsächlich nicht beurteilen kann, ist, ob es bei Berücksichtigung der Verzögerungen durch das Netz überhaupt einen merklichen Unterschied macht, ob irgendeine Operation jetzt z.B. doppelt so lange dauert, wie eine andere. Das gebe ich zu.

Offline Axel_Janssen

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 769
Aber auch die erste Möglichkeit bietet meiner Meinung nach keine Vorteile. Du misst und vergleichst die Zeit für verschiedene zusammengesetzte Operationen. Wenn nun zu jeder Zeit einfach eine Verzögerung addiert wird, die lang im Vergleich zur Ausführungszeit des Codes ist, dann wird dadurch doch der relative Zeitunterschied zwischen den Operationen (z.B. als prozentuale Angabe) geringer, bei einer feststehenden Genauigkeit der Zeitmessung also eher ungenauer.
Ich vergleiche hier nicht 2 unterschiedliche Zugriffsstrategien.
Du meinst sowas in der Art wie:
Code
Const NETWORK_LATENCY = 5;
(t0 + t1 * NETWORK_LATENCY + t2) / (t3 + t1 * NETWORK_LATENCY + t5)
gibt weniger deutliche Ergebnisse als:
(t0 + t1 + t2) / (t3 + t1  + t5)
<zwischenfrage>
Heisst sowas netzwerk latenz, oder war das jetzt meine eigene Sprachschöpfung?
</zwischenfrage>

Mir ist jetzt aber klargeworden, was ich eigentlich will:
Die objektive und subjektive* Geschwindigkeit der GUI unter realistischen Bedingungen  testen, wobei das natürlich von einer Menge von Faktoren abhängt, so daß man es schlußendlich eh nur beim Kunden testen kann.

Ich kann den Thread auch für eine festgesetzte Zahl an Milisekunden schlafen legen, der befolgt das dann aber auch nur ungenau, was dann wiederum realistische wiederspiegeln würde.

* mein User-Empfinden
« Letzte Änderung: 25.07.03 - 19:26:39 von Axel_Janssen »
... design patterns are abstract designs that help identify the structure and elements involved in a specific design solution. From this, a concrete implementation can be produced.
Kyle Brown

Offline harkpabst_meliantrop

  • Senior Mitglied
  • ****
  • Beiträge: 463
  • Geschlecht: Männlich
  • I love!
    • Heute schon gelebt?
Zitat
Du meinst sowas in der Art wie:
Code
Const NETWORK_LATENCY = 5;
(t0 + t1 * NETWORK_LATENCY + t2) / (t3 + t1 * NETWORK_LATENCY + t5)
gibt weniger deutliche Ergebnisse als:
(t0 + t1 + t2) / (t3 + t1  + t5)

Ganz Genau.

Zitat
<zwischenfrage>
Heisst sowas netzwerk latenz, oder war das jetzt meine eigene Sprachschöpfung?
</zwischenfrage>

Das kann man ruhig so sagen. Schließlich ist Latenz eigentlich nur ein beliebtes Fremdwort für jede Art von Wartezeit. ;D

Zitat
Mir ist jetzt aber klargeworden, was ich eigentlich will:
Die objektive und subjektive* Geschwindigkeit der GUI unter realistischen Bedingungen  testen, wobei das natürlich von einer Menge von Faktoren abhängt, so daß man es schlußendlich eh nur beim Kunden testen kann.


Gut, dass wir drüber gesprochen haben.  ;)
« Letzte Änderung: 25.07.03 - 19:43:52 von harkpabst_meliantrop »

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz