0

マスターサーバーからのオフセットを計算することにより、単純な時刻同期アルゴリズムを実装しました。コード自体の処理に多少の遅延があり、タイムスタンプに加算されます。それで、アルゴリズムが実際にシステム間でタイムスタンプを同期しているかどうかをテストする方法を知りたいと思っていましたか?

以下は、nodejsでの時刻同期の私のロジックです

var onSync = function (data) {
    var diff = Date.now() - data.t1 + ((Date.now() - data.t0)/2);
    offsets.unshift(diff);
    if (offsets.length > 10)
      offsets.pop();
    console.log("Order no ",data.ord,"The offset is ",offsets[0] ,"time in server was = ",data.t1 , "time in the slave = ", Date.now() );
  };

システムは socket.io を使用して通信します。サーバーでグローバル変数、つまりグローバルを使用しました。これは、リクエストを取得するたびに更新され、グローバル値が data.ord としてクライアント側に送信されます。

そのため、現在、タイムスタンプをプールし続ける単一のマスターサーバーと複数のスレーブサーバーがあります。以下は私が得る出力です:

マスター ノード:

rahul@g3ck0:~/programs/dos_homework/hw2$ nodejs ob1.js 
Current server timestamp is  1395043602717 order no is  1
Current server timestamp is  1395043603263 order no is  2
Current server timestamp is  1395043603717 order no is  3
Current server timestamp is  1395043604264 order no is  4
Current server timestamp is  1395043604719 order no is  5
Current server timestamp is  1395043605265 order no is  6
Current server timestamp is  1395043605720 order no is  7
Current server timestamp is  1395043606267 order no is  8

スレーブ 1:

rahul@g3ck0:~/programs/dos_homework/hw2$ nodejs slave1.js
Order no  1 The offset is  2.5 time in server was =  1395043602718 time in the slave =  1395043602719
Order no  3 The offset is  2 time in server was =  1395043603717 time in the slave =  1395043603718
Order no  5 The offset is  1.5 time in server was =  1395043604719 time in the slave =  1395043604720
Order no  7 The offset is  0 time in server was =  1395043605720 time in the slave =  1395043605720

スレーブ 2:

rahul@g3ck0:~/programs/dos_homework/hw2$ nodejs slave2.js 
Order no  2 The offset is  6 time in server was =  1395043603263 time in the slave =  1395043603268
Order no  4 The offset is  2.5 time in server was =  1395043604264 time in the slave =  1395043604265
Order no  6 The offset is  2 time in server was =  1395043605265 time in the slave =  1395043605266
Order no  8 The offset is  2 time in server was =  1395043606267 time in the slave =  1395043606268

ご覧のように

オフセット + タイムスタンプ (マスター) > タイムスタンプ (スレーブ)

しかし、これは一定期間にわたって減少し続けます。全体として、これが正しい方法であるかどうかはわかりません。1.より良いアルゴリズムを実装するにはどうすればよいですか? 2. どのようにテストしますか?

4

1 に答える 1

1

ホストをhttp://en.wikipedia.org/wiki/Network_Time_Protocolと同期させるよりもうまくいく可能性は低いです。Linux と Windows の両方が NTP と同期し、必要に応じて NTP サーバーとして機能するように説得できます (Windows AD では、1 つの DC が少し奇妙に構成された NTP サーバーであり、他のマシンが Kerberos 認証のために十分近くにあるようにします)。仕事)。

一般的なコンピューターの時計はあまり正確ではありません。週末に同期がオンのシステムと同期がオフのシステムを比較すると、同期がオフの場合は顕著なドリフトがあることがわかりますが、同期がオンの場合はほとんどまたはまったくないことを願っています. また、大幅に同期が取れていないマシンを起動し、同期にかかる時間を確認することもできます。デフォルトでは、NTP は 1 時間以上ずれているものを同期しません。VMWare のセットアップに問題があり、マシンが数時間放置されたり、1970 年にマシンが起動したりすることがあったため、イライラすることがわかりましたが、極端な違いを同期しない正当な理由があると信じる準備ができているので、同期しません。 1 時間以上の修正を目指します。

于 2014-03-17T20:04:04.200 に答える