Tips Collection - clockspeed


http://quox.org/tips/server/clockspeed.html
[ Top > Tips Collection > clockspeed ]


clockspeedとは

clockspeedは、ハードウェアまたはOSが持つ高分解能な時間測定機能を用い てシステム時刻の精度を高めるデーモンである。

clockspeedは、時刻調整時を除けば外部のサーバ等に依存することなく動作 する。同様の働きをするものにNTPサーバがあるが、clockspeedはNTPサーバ のように上流のサーバと常時通信を行うことはしない。したがって、使用可 能な回線に制約がある場合や独立性の高いシステムを構築したい場合などに 有用である。

clockspeed単体では単一ホストの時刻精度維持しかできないが、 taiclockdデーモンおよびtaiclockコマンド と組み合わせて使用することで、複数のホストの時刻精度維持を行うことが できる。


動作条件

clockspeedを動作させるためには、Pentium系列のプロセッサが持つRDTSC命 令、あるいはSolarisなどが提供しているgethrtime関数が必要である。

ただし、パッチを当てる場合はこの限りではない。本ページにPowerPC用のパッ チを掲載している: インストールを参照のこと。


インストール

以下の記述はclockspeed-0.62のインストール方法である。最新版についての 情報は clockspeed本家 を参照されたい。

以下の記述では、インストール先は${prefix}として示してある。例えば /usr/localなど、好みに応じて設定すること。

  1. ソースファイル取得

    clockspeed-0.62.tar.gz を取ってくる。

  2. 展開
    % tar xvzf clockspeed-0.62.tar.gz
    % cd clockspeed-0.62
      
  3. パッチ当て

    必要に応じて次のパッチを当てる。

    % patch -p1 < clockspeed-0.62.powerpc.patch
    % patch -p1 < clockspeed-0.62.stdc.patch
      
  4. 設定

    インストール先をconf-homeに、コンパイル方法をconf-ccに、リンク方法 をconf-ldに記述する。

  5. Make
    % make
      
  6. インストール
    # make setup check
      

初回の起動方法
  1. 起動

    作業開始前に、ある程度システム時刻を正しい値に近づけておく。これは 必須の作業ではないが、後の作業に要する時間が短くなるのでやっておい た方が良い。 手動での時刻調整 を参照のこと。

    まず以下のような手順でclockspeedを起動する。clockspeedをdaemontools で制御する場合の設定は Tips Collection - daemontools: clockspeed設定例 を参照のこと。

      # sh -c 'clockspeed &'
      

    clockspeedが正常に起動されると、${prefix}/adjust と ${prefix}/etc/atto が作成される。

    ${prefix}/adjustは、 clockspeedデーモンが時刻情報を受け取る際に使用する名前付きパイプで ある。必要ならこのファイルの所有者と許可属性を変更し、時刻変更を許 可する権限の範囲を設定する。通常設定では時刻変更にroot権限を必要と するが、おそらくはより低い権限に設定するのが良いだろう。以下は時刻 変更権限を timekeeper というユーザのみに制限する例である。

      # chmod 0600 ${prefix}/adjust
      # chown timekeeper ${prefix}/adjust
      

    ${prefix}/etc/attoは、 clockspeedが現在使用している時刻進度補正量を格納するファイルである。

  2. 起動時刻の通知

    起動後、clockspeedに正しい現在時刻を通知する。NTPサーバから現在時刻 を得るなら、sntpclockコマンドを使用する。sntpclockの引数にはNTPサー バのIPアドレスを指定する。

      % sntpclock ${ntp server's ip address} > ${prefix}/adjust &
      

    NTPサーバではなくtaiclockサーバから現在時刻を得るなら、taiclockコマ ンドを使用する。

      % taiclock ${taiclock server's ip address} > ${prefix}/adjust &
      
  3. 時刻調整

    起動後2,3時間が経過したら、再びclockspeedに正しい現在時刻を通知する。

      % sntpclock ${ntp server's ip address} > ${prefix}/adjust &
      または
      % taiclock ${taiclock server's ip address} > ${prefix}/adjust &
      

    clockspeedは正しい時刻とシステム時刻のずれを計算し、時刻進度の補正 量を求める。そののち、時刻が不連続にならないよう配慮しながら徐々に システム時刻を正しい時刻に合わせていく。正しい時刻に合わせ終わった ら、求めた補正量を使って現在時刻が常に正しく維持されるよう時刻進度 を調整し続ける。また、求めた時刻進度補正量は ${prefix}/etc/atto に保存される。

    2,3日後、2,3週間後、2,3ヶ月後にも上記と同様の操作を行う。これにより、 clockspeedは100年に2,3秒程度のずれの精度で正しい時刻を維持できるよ うになる。

    ただしこれは、参照した時刻情報源と計算機内部の高分解能時間測定機能 の周波数の関係が一定に保たれている場合に限られる。数ヵ月に1度程度は 時刻のずれを確認し、必要なら再度調整するのが 現実的だろう。


2度目以降の起動方法

初回起動時に正確な時刻進度補正量を求めてあるなら、2度目以降の起動では 何度も時刻調整を行う必要はない。clockspeedを起動し、起動時刻を通知す るだけで良い。時刻進度補正量は ${prefix}/etc/atto から読み込まれる。

# sh -c 'clockspeed &'

% sntpclock ${ntp server's ip address} > ${prefix}/adjust &
または
% taiclock ${taiclock server's ip address} > ${prefix}/adjust &

clockspeedをdaemontoolsで制御している場合には、以下のようにrunファイ ルに起動時刻の通知を埋め込むと良い。

#! /bin/sh
exec < /dev/null
exec > /dev/null 2>&1
( exec env - PATH="${prefix}/bin:$PATH" NTPSERVER=${ntp server's ip address} \
  sh -c 'sleep 10; sntpclock $NTPSERVER > ${prefix}/adjust' & )
exec env - PATH="${prefix}/bin:$PATH" \
clockspeed

時刻確認

基準時刻とシステム時刻のずれを確認するには、sntpclockまたはtaiclock とclockviewを使用する。clockviewは取得した時刻情報を可読文字列として 出力するコマンドである。

% sntpclock ${ntp server's ip address} | clockview
または
% taiclock ${taiclock server's ip address} | clockview
before: 2002-07-30 22:58:51.899610000000000000
after:  2002-07-30 22:58:51.570810999972477555

出力のbeforeとafterの差分が、システム時刻と基準時刻とのずれである。上 記の例では、時刻のずれは +0.3288 秒である。


手動での時刻調整

例えばclockspeed起動前など、何らかの理由で手動で時刻を合わせなければ ならない時は、以下のコマンドを使用する。

# sntpclock ${ntp server's ip address} | clockadd
または
# taiclock ${taiclock server's ip address} | clockadd

これにより、システム時刻がその場で変更される。時刻を変更した瞬間はシ ステム時刻が不連続に変化するので注意すること。


関連リンク

Copyright © 2002-2007 Wakabayashi Masaki / 若林 正樹.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is here.