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


15

いくつかの実稼働プラットフォームで、時刻が定期的に前後にジャンプしていることを示唆する症状が観察されています。ジャンプは通常約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クロックソースで実験します。


5
NTPを無効にすると、クロックがはるかに不安定になります... NTPがクロックを維持しない唯一の理由は、クロックの調子が悪く、NTPが更新を拒否していることです(ntpdate(8)またはを参照ntpd(8))。
フォンブランド14年

1
NTPDはクロックドリフトを追跡および修正しますが、持っているものはドリフトではありません。ドリフトは、時間とともにほぼ同じ量だけ一貫して同じ方向にあります。前後にランダムにジャンプする場合、それを予測してそれに対応する方法はありません。
パトリック14年

1
@Patrickが言ったことは正しい、あなたが説明する問題は、1日に複数回、時間の前後への不連続なジャンプです。NTPはドリフトに対してはうまく機能しますが、これではあまり役に立ちません。システムの日付を、おそらく1秒の解像度しか持たない外部タイムソースにリセットしている可能性があります。サーバーがx86 *の場合、ハードウェアRTCがソースであり、cronジョブが原因である可能性があります。クロックオフセットを測定する限り、Bratchleyのntpdateの答えは、適切なストラタム1クロックリファレンスが使用される場合、合理的なアプローチです。1分に1回実行し、画像の結果をgnuplotします。
デュアネフ

1
新しいサーバーで起動するNTPのこの評価を実行しました(drdobbs.com/embedded-systems/…)。新しいクリスタルを習得するにはNTP時間かかります。本当に悪い結晶の場合、NTPはトレーニング中にかなりの量だけクロックを「ステップ」する必要があります(その記事の図4と5を参照)。ntp.driftの118ppmの最終値は、1日あたり10秒または30分ごとに208msです。これはOPが見ていたものではありませんが、NTPは最初に時間の顕著なジャンプを引き起こす可能性があります。
デュアネフ

回答:


8

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

私が知っている唯一のツールは、十分な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ルートに行くことをお勧めしますクロックソースがシステムサービスで混乱するかどうかをテストしてから、それを本番運用環境に展開します。


「クロックドリフトを測定する」とは、NTPが提供するような基準時間ソースからのドリフトを意味するものではありません。連続した時間範囲で時刻クロックの「ジャンプ」を検出できるツールを意味しました。たとえば、時刻を50msごとにサンプリングし、最後のサンプリングとの差が50msから離れすぎているかどうかを報告します。このようなツールは、何らかの理由で時刻が基礎となるハードウェアクロックからずれているかどうかを示します。
ブレット14年

1
そのような介入の存在は、あなたが解決したいと思っているよりもパフォーマンスの低下を引き起こす可能性が高いでしょうか?ただし、おそらくハードウェアの問題であるため、ハードウェアを修理するか、この問題なしでクロックソースを使用する必要があります。tscCPUをベースにしているため、CPUアクティビティが多いと、ハードウェアクロックの問題が発生します。hpetがあなたにとって十分に速いなら、あなたはそれを試すか、サービスを受けるか、またはスワップをする必要があるかもしれません。これらは私があなたのために見ることができる唯一のオプションです。
ブラッチリー14年

3

1つの解決策は、 HPET

高精度イベントタイマーもご覧ください。

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

clocksource=hpet

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

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

ウィキペディア:タイムスタンプカウンター


クロックジッタの症状を示す実稼働システムで、クロックソースをhpetに切り替えました。これは、観察されたクロックジッタの症状には影響しませんでした。
ブレット14年

HPETは外部ハードウェアタイマーであり、ジッタすることはできません。したがって、この解決策は間違った道のようです。特に仮想化を使用している場合、古いハードウェアでは多くのタイミングの問題がありました。別のソフトウェアでもこれを確認しましたか?

1

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

要するに、私の最初の仮説は無効でした。しかし、回答とリンクからLinuxクロックについて多くのことを学びました。


3
(...)私の最初の仮説は無効でした、それでは本当の原因は何ですか?
ピョートルドブロゴスト16年

0

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

ntp この問題に対抗するためのものです。


それも私が思ったことです。ハードウェアクロックソースを読むと、カウンターは単調に増加しているはずです。それが本当だった場合、最悪の場合、不規則なティックレートを観察する必要がありますが、元に戻りません。マルチプロセッサシステムでは、TSCをプロセッサ間で同期する必要があることを理解しています。おそらくこれが後方ジャンプを引き起こしているのでしょうか。
ブレット14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.