web-dev-qa-db-ja.com

クロックドリフトを測定して防止するにはどうすればよいですか?

いくつかの本番プラットフォームで、時刻が定期的に前後に動いていることを示唆するように見える症状が観察されました。ジャンプは通常約1秒であり、通常はキャンセルされ(その後ジャンプしてすぐに後向きにジャンプし)、1日あたり約50回発生します。このドリフトは、アプリケーションの使用率がピークのとき、および毎日のバックアップなどのディスクI/O操作が多いときに最も顕著になります。これらのドリフトは、ソフトリアルタイムの敏感なアプリケーションに影響を与えています。

システムは、3.0.58-0.6.6-defaultカーネルでSLES 11SP2を実行しているOracle Netra X4250およびNetra X4270サーバーです。

$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
tsc hpet acpi_pm

$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource
tsc

[〜#〜] ntp [〜#〜] を無効にしましたが、ドリフトに影響はありませんでした。時刻のずれを測定するツールはありますか?どうすればこれを回避できますか?

これらは実稼働プラットフォームであり、ラボで問題を再現することができないため、実験する能力は限られています。自分のデバイスに任せる場合は、ドリフトを測定するツールを作成し、おそらく [〜#〜] hpet [〜#〜] クロックソースを試してみます。

15
brett

時刻のずれを測定するツールはありますか?

私が知っている唯一のツールはNTPツールで十分です。実際にntpdを設定して特定のクロックソースと同期する必要はありません。-dオプションをntpdateに追加して、計算されたオフセットを取得します。

例:

[davisja5@xxxadmvlm08 ~]$ ntpdate -d clock.redhat.com 2>/dev/null | egrep "^offset"
offset -0.004545
[davisja5@xxxadmvlm08 ~]$

-dは、NTPが実際にシステムクロックに触れることなく機能するデバッグオプションです。

これをどのように回避できるかについてのアドバイスはありますか?

ハードウェアクロックが原因である可能性があるため、開発/テスト環境でこれを再現できないことにはそれほど驚いていません。もし誰かとハードウェアのサポートをしているなら、私はあなたのマシンを修理してもらおうと思います。 1つの可能性は、開発マシンの1つをこのプロダクションマシンと交換し、以前のPRODシステムを修正して、現在PRODにあるものと置き換えるために、それを開発マシンとして再導入することです。

それを下回ると、ハードウェアクロックソースを切り替えるだけで、ほとんどのことを実行できます。スワップできないかできない場合は、 hpetルートに移動することをお勧めします クロックソースがシステムサービスで混乱を変更してから、あられメアリーとして本番環境にデプロイします。

8
Bratchley

1つの解決策は、HPETを使用することです

参照 高精度イベントタイマー

ブートパラメータとして設定するには

clocksource=hpet

古いハードウェアでは、TSCは不安定であることが多く、カーネルによって無効にされていました。

マルチコア/ハイパースレッドCPU、複数のCPUを備えたシステム、および休止状態のオペレーティングシステムの出現により、TSCは正確な結果を提供することに依存することができません...

Wikipedia:Time Stamp Counter

3
user55518

クロック測定とアプリケーションが示すレイテンシ症状を関連付けるためのより詳細なツールを作成しました。このツールは、私が以前にLinuxの時刻時計のジッターとして疑っていたものを除外しているようです。

短い話ですが、私の最初の仮説は無効でした。しかし、私は回答とリンクからLinuxの時計について多くを学びました。

1
brett

誰かが変更しない限り、クロックは単調であるはずではありませんか?後方ジャンプは不可能であるべきです。クロックを設定するものが必要です-cronジョブまたは他のデーモン(たとえば、hwclock --adjustの呼び出し)。 ntp自体がドリフトの統計を更新してそれを定期的に補正することを思い出します。ntpを長時間実行せずに巨大なオフセットを取得した場合、リセットしないと、その数日後に時間を混乱させます/etc/adjtime。あなたはそのようなものをセットアップしているかもしれません-時間ドリフトを定期的に再調整するものです(そしてジャンプを引き起こします)。

ntpは、実際にはこの問題に対処するためのものです。

0
orion