Brauche Ideen für Zeitmessung zwischen 2 Rechnern

  • Hallo in die Runde,

    ich stehe gerade mal voll auf dem Schlauch und bräuchte eine Idee für die folgende Problemstellung:

    Ausgangslage:

    • Client auf Rechner A
    • Server auf Rechner B
    • zwischen beiden findet per TCP ein Datenaustausch statt (ich sende JSONs vom Client zum Server)

    Problemstellungen:

    • Den Unterschied zwischen der jeweils lokalen Systemzeit feststellen.
      Im Moment sende ich vom Client die Ausgabe von _NowCalc(), führe am Server ebenfalls ein _NowCalc() aus und berechne die Differenz mit _DateDiff
      Das ergibt einen Sekunden genauen Wert.
      Wie könnte ich das auf Millisekunden genau ermitteln? Klar, es wird einen Fehler/Abweichung durch die Laufzeit der TCP-Pakete geben - dazu Punkt 2
    • Wie Messe ich die Laufzeit meiner Datenpakete zwischen Client und Server? Würde ich mir z.B. errechnen wenn ich die Differenz aus 1. kenne
    • Alternativ: Wie schaffe ich es 2 Funktionen / Befehle auf diesen beiden Rechnern exakt zum gleichen Zeitpunkt zu starten?

    Hintergundgeschichte:

    Ich baue hier gerade ein "App-Performance-Monitoring" einer Applikation innerhalb einer RDP und/oder Citrix-Sitzung.
    Der Server startet auf einem Test-Client die Citrix-Sitzung. In dieser wird der Client gestartet.
    Dieser nimmt Verbindung zum Server-teil auf - das ist für mich die gemessene Anmeldezeit / Startzeit für die Sitzung.
    Der Client startet dann das Programm des Kunden und führt verschiedene Aktionen durch. Die Laufzeiten ermittelt der Client "lokal".
    Nun gibt es einen Zeitunterschied zwischen dem "Fertig" sein und bis man es über die Citrix-Verbindung sieht. Im lokalen Netzwerk nur ein paar duzend Millisekunden - aus den USA ggf. ein paar hundert.
    Die "Fertig" Ermittlung mit dem Server-Teil (also über die Citrix-Sitzung) habe ich schon fertig (Optisch über die Farbänderungen der Pixel).
    Damit ich diesen Zeitunterschied in Zahlen fassen kann müsste ich entweder den Zeitunterschied kennen - oder unabhängig von der lokalen zeit es schaffen auf beiden Rechnern einen Vorgang zu exakt gleichen Zeit zu starten.

    Gruß,

    BLinzer

  • Wie Messe ich die Laufzeit meiner Datenpakete zwischen Client und Server? Würde ich mir z.B. errechnen wenn ich die Differenz aus 1. kenne

    Wenn deine Pakete nicht groß sind, dann kannst du den Ping nehmen oder die Zeit zwischen Verbindungsaufbau und Datenankunft (vorausgesetzt du connectest immer neu und sendest direkt die Daten).

    Wie könnte ich das auf Millisekunden genau ermitteln? Klar, es wird einen Fehler/Abweichung durch die Laufzeit der TCP-Pakete geben - dazu Punkt 2

    Guck dir mal TimerInit() an. Das returnt dir einen Timestamp, wenn du nun auf beiden Systemen TimerInit() zur selben Zeit ausführst und sie voneinander subtrahierst und von dem Wert dann den Betrag nimmst, dann kriegst du die Zeitdifferenz in Millisekunden.

    Alternativ: Wie schaffe ich es 2 Funktionen / Befehle auf diesen beiden Rechnern exakt zum gleichen Zeitpunkt zu starten?

    Es kommt ganz darauf an wie genau du es haben willst. Du könntest in beiden Scripten eine Uhr laufen lassen die sich mit einer Atomuhr über eine Website z.B. synchronisiert.
    Du kannst aber auch ein Paket an den zweiten Clienten schicken und die Zeit die du zum Senden und Verarbeiten brauchst noch abziehen.

  • Ich werde es morgen erst einmal mit der Laufzeit der Pakete versuchen,
    Ich sende ja per TCP. Sprich wenn das Senden abgeschlossen ist sind auch alle Pakete drüben angekommen - mit Bestätigung.

    Den Wert nehme ich dann als Korrektur zum lokalen Zeitvergleich (Vergleich der beiden Systemuhren),
    ich werde dann ein paar Tests laufen lassen (Anzahl der Daten, Zeitunterschiede, Versuch etwas Synchron zu starten) und mal sehen was da so rauskommt.

    Jetzt lese ich mich erst einmal mehr in das NTP-Protokoll ein und wie der Abgleich funktioniert. Die Tools sagen mir schließlich die lokale, die entfernte Zeit und die Laufzeit für die Abfrage:


    Das wäre was ich will ... z.B. das mein Server-Modul als Zeitserver für den Client dient und dieser die Abweichung misst.
    Vielleicht kann ich das was nachbauen - oder per AutoIt nativ die Zeitabweichung zu einem festgelegten NTP-Server messen. Gibt ja diverse Beispiele mit AutoIt die Systemzeit zu synchronisieren ...

  • So, erste Lösung fand ich hier:
    https://www.autoitscript.com/forum/topic/14…all-workaround/

    Da wird sich die Zeit von einem Webserver geholt.
    Mein Test-Skript:

    Die Laufzeit für die Abfrage kann ich ja problemlos ermitteln.
    Ich könnte also den Client und den Server gegen einen beliebigen Webserver die Abweichung zur lokalen Zeit ermitteln lassen,
    damit hätten beide eine gemeinsame Referenzquelle ... mit einem möglichen Fehler von einer Sekunde ...

    Mit mehren Abfragen hintereinander sollte ich den Wert genauer hinbekommen ... und das nächste Test-Skript ...

  • Und ich noch einmal.

    Ich habe mein Testprogramm soweit verbessert das es den Sekundenwechsel auf dem Webserver treffen sollte.
    Dazu wird in einer Schleife die Zeit ständig abgefragt bis es einen Sekundenwechsel gab,
    dann startet ein scharfer Lauf bis zum nächsten Sekundenwechsel - der im Idealfall selbst ziemlich genau eine Sekunde braucht.
    Dann gibt es eine Meldung über die ermittelten Werte:


    Beispielausgabe:
    [Blockierte Grafik: https://znil.net/images/0/0a/ClipCapIt-170511-220659.PNG][Blockierte Grafik: https://znil.net/images/1/12/ClipCapIt-170511-222855.PNG]

  • Und was machst wenn dein Webserver gerade Schluckauf hat und nicht sofort antwortet? Mir ist auch nicht klar warum nicht direkt in Windows dann den Zeitserver einträgst sodern das, recht unnötigerweise, selbst versuchst nachzupfuschen.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Und was machst wenn dein Webserver gerade Schluckauf hat und nicht sofort antwortet? Mir ist auch nicht klar warum nicht direkt in Windows dann den Zeitserver einträgst sodern das, recht unnötigerweise, selbst versuchst nachzupfuschen.

    Naja, eigentlich ist der Zeitabgleich zwischen 2 Rechnern das Thema.
    Ich setze das nach obiger Grundidee (mehrmals hintereinander abfragen um den Sekundenwechsel zu finden) um,
    das Ergebnis werde ich hier posten.

    Aber ich kann den hier erst einmal auf "erledigt" setzen.

  • Nochmal die Frage, warum trägst nicht bei beiden Rechnern den gleichen Zeitserver ein. Dann sparst dir den manuellen abgleich.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Nochmal die Frage, warum trägst nicht bei beiden Rechnern den gleichen Zeitserver ein. Dann sparst dir den manuellen abgleich.

    Weil mir das nicht genau genug ist. Die verschiedenen Programmpunkte brauchen teilweise nur 100 bis 500 ms, da ist mir der Messfehler beim Sekunden genauen Messen zu groß.

    Zudem agiert mein Programm als normaler Benutzer, der darf die Uhr nicht stellen. Zudem brauche ich dann eine externe 3. Stelle die auch erreichbar ist (jupp, Domänencontroller geht auch).

    Ich habe heute erfolgreich den Zeitabgleich zwischen verschiedenen Rechnern programmiert, ich habe es dabei nach der Methode des NTP Protokolls gemacht, siehe https://www.meinberg.de/german/info/ntp-packet.htm
    Damit ermittle ich die Zeitunterschiede direkt zwischen 2 Rechnern. Ich wiederhole das ganze 2 mal da der erste Durchlauf hier im Kundennetzwerk immer länger dauert als die nachfolgenden :S

    Dabei konnte ich aber auch feststellen das nach einem NTP-Abgleich beider Rechner die Abweichung im unteren, zweistelligen Millisekunden-Bereich liegt.
    Allerdings sind die Meßpunkte des Kunden (=normale PC's) über die ganze Erdkugel verteilt und nutzen dementsprechend verschiedene Zeitserver / Domänencontroller.

    Morgen steht dann "wir starten auf 2 Rechnern etwas gleichzeitig" auf dem Plan (ein Rechner steht in Hamburg, einer in Polen) bzw. Rechner 1 ist Remote mit Rechner 2 verbunden und ich messe wie lange ein Programm auf Rechner 2 braucht und was Rechner 1 dazu aus der entfernen misst (Verzögerung durch Bildaufbau etc.)


    Owe... dann hat er gar nichts mehr zu tun... und geht uns vor Langeweile evtl. noch ein... :D:ironie:

    Immerhin werde ich dafür bezahlt es genau zu machen ;) Und ich trete mit meinen "Programmierer" Wissen gegen ein kommerzielles Produkt an welches eine 6-stellige Summe kosten sollte ... und trotzdem das ganze nicht über eine Citrix-Sitzung konnte.

  • Immerhin werde ich dafür bezahlt es genau zu machen Und ich trete mit meinen "Programmierer" Wissen gegen ein kommerzielles Produkt an welches eine 6-stellige Summe kosten sollte ... und trotzdem das ganze nicht über eine Citrix-Sitzung konnte.

    Ohne dir auf die Füße treten zu wollen, aber da wirst du verlieren. Alleine schon weil dir nicht bekannt ist, dass es etwas genaueres als NTP nämlich PTP gibt.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ohne dir auf die Füße treten zu wollen, aber da wirst du verlieren. Alleine schon weil dir nicht bekannt ist, dass es etwas genaueres als NTP nämlich PTP gibt.

    Das habe ich natürlich schon in Erwägung gezogen *hust* aber Millisekunden ist genau genug, Micro- oder Nanosekunden müssen es nicht sein.