2008-09-17 7 views
1

Wie kann ich messen, wie lange ein Client auf eine Anforderung warten muss?Gesamte Netzwerktransferzeit von Servlets messen

Auf der Serverseite ist es einfach, durch einen Filter zum Beispiel. Aber wenn wir die Gesamtzeit einschließlich Latenz und Datentransfer berücksichtigen wollen, wird es schwierig.

ist es möglich, auf den zugrunde liegenden Socket zuzugreifen, um zu sehen, wann die Anfrage beendet ist? oder ist es notwendig, einige Javascript-Tricks zu machen? vielleicht durch Uhrzeitsynchronisation zwischen Browser und Server? Gibt es irgendwelche vorgefertigten Javascripts für diese Aufgabe?

Antwort

2

Es gibt keine Möglichkeit zu wissen, wie lange der Client nur von der Serverseite warten musste. Sie benötigen etwas JavaScript.

Sie möchten die Client- und Serveruhren nicht synchronisieren, das ist Overkill. Messen Sie einfach die Zeit zwischen dem Zeitpunkt, zu dem der Client die Anfrage stellt, und dem Zeitpunkt, an dem die Antwort angezeigt wird.

Wenn der Client AJAX ist, kann dies ziemlich einfach sein: Rufen Sie neu Date(). GetTime() auf, um die Zeit in Millisekunden zu erhalten, und die Zeit nach dem Analysieren des Ergebnisses zu vergleichen. Dann senden Sie diese Timing-Informationen an den Server im Hintergrund. Für eine Nicht-AJAX-Anwendung, wenn der Benutzer auf eine Anforderung klickt, sendet er den aktuellen Zeitstempel (aus der Sicht des Clients) an den Server zusammen mit der Abfrage und übergibt denselben Zeitstempel an der Client, wenn die resultierende Seite neu geladen wird. Bewerten Sie in der onLoad-Prozedur dieser Seite die gesamte verstrichene Zeit und senden Sie sie dann zurück an den Server - entweder mit einem XmlHttpRequest oder durch Anheften eines zusätzlichen Arguments an die nächste Anfrage an den Server.

+0

Das Problem mit diesem Ansatz ist, dass es nicht transparent zu einer bestehenden Nicht-Ajax-Implementierung hinzugefügt werden kann. wird es schwierig sein, den extra date-Parameter zu jeder Anfrage hinzuzufügen, aber diese Methode klingt so, als würde sie wirklich die _whole_ Zeit messen, die es braucht, um von Client-Server-Client zu reisen. –

0

Sie könnten einen 0-Byte-Socket-Sendepuffer setzen (und ich empfehle das nicht genau), so dass Sie bei Ihrem blockierenden Aufruf von HttpResponse.send() eine genauere Vorstellung davon haben, wann das letzte Byte übrig ist Zeit ist nicht enthalten. Ekk - Ich fühle mich mulmig für die Erwähnung. Sie können dies in Tomcat mit connectorspezifischen Einstellungen tun. (Tomcat 6 Connector documentation)

Oder Sie könnten mit einer Art von Javascript Zeitstempel Ansatz kommen, aber ich würde nicht erwarten, die Client-Uhr zu setzen. Mehrere Aufrufe an den Webserver müssten getätigt werden.

  • Zeitstempel Abfrage
  • die reale Anfrage
  • die Daten

Und diesen Ansatz würde decken Latenz berichten, obwohl Sie einige Jitter Varianz noch haben müssen.

Hmmm ... interessantes Problem, das Sie dort haben. :)

3

Wenn Sie es von Ihrem Browser aus simulieren möchten, um eine Clientanfrage zu simulieren, können Sie die Registerkarte im Firebug ansehen, um zu sehen, wie lange jedes Stück der Seite zum Herunterladen und der Download-Reihenfolge benötigt.

3

Sie könnten das HttpServletResponse-Objekt und den von der HttpServletResponse zurückgegebenen OutputStream umbrechen. Wenn die Ausgabe mit dem Schreiben beginnt, können Sie ein startDate setzen, und wenn es aufhört (oder wenn es geleert wird usw.), können Sie ein stopDate setzen.

Dies kann verwendet werden, um die Länge der Zeit zu berechnen, die benötigt wurde, um alle Daten zurück zum Client zu streamen.

Wir verwenden es in unserer Anwendung und die Zahlen sehen vernünftig aus.

bearbeiten: Sie können das Startdatum in einem ServletFilter festlegen, um die Länge der Zeit zu erhalten, die der Client gewartet hat. Ich habe Ihnen die Zeit gegeben, die es brauchte, um die Ausgabe an den Client zu schreiben.

+1

aber dies berücksichtigt nicht den Socket-Puffer noch die Latenz, die das OP erwähnt :( –

+0

das sieht vielversprechend aus, ich gebe es eine Chance. –

+0

habe es gerade ausprobiert und es hat nicht funktioniert. Bytes zum Ausgangsstrom scheinen lange bevor sie die physische Maschine verlassen, geschrieben werden. –

0

Check out Jiffy-web, von Netflix entwickelte sie eine genauere Ansicht der gesamten Seite zu geben -> Seite Rendering-Zeit

0

ich hatte das gleiche Problem. Aber dieses JavaOne Paper hat mir wirklich geholfen, dieses Problem zu lösen. Ich würde Sie bitten, es durchzugehen, und es verwendet grundsätzlich Javascript, um die Zeit zu berechnen.