時刻精度と実行保証

昨日の続き。

毎分00秒にある機能を実行したい、とする。

現在時刻からsleepする時間を求める。

今は32分28秒。32秒sleepしたとき、起床時刻は

  • 32分59秒
  • 33分00秒
  • 33分01秒

になる可能性が考えられる。待ち時間はOSの匙加減なので信用できない。

酷いときは、1分以上処理が止まったり、時刻修正が入って

  • 32分25秒
  • 34分01秒

になるかもしれない。33分の処理はスキップされるかもしれない。これを問題視するかどうか、つまり実行保証をするかどうか、一度考えてみたい。

cron

cronはそのあたりきちんと対応しており、5分未満のズレなら、本来実行するはずだった処理を実行してくれる。だから、普通はcronでOK。

cronが実行できるのは誤差3時間までで、時間が巻き戻った場合はしばらく停止する。

toleranceがある設計はいい設計だと思う。

時間精度

そもそもOSの時刻は正しくない。ここポイント。

クロックの誤差が10ppmだと、1日0.8秒、1週間で6秒、1か月で24-30秒程度、1年で6分の誤差になる。回路が酷いともっとずれることがある。

工場などのオフライン環境だと、この程度は平気でずれると考えた方が良い。

遅延

システムの調子が悪くて、想定よりも遅く起きることがある。

毎時実行するタスクなら、数秒数分の遅延は問題にならない。数時間の遅延は考えられない。よって、起床したタイミングで素直に実行すればいい。

毎分実行するタスクなら、数秒の遅延は問題にならないが、数分の遅延は問題になる。既に数回分の実行はスキップされている。1回くらいスキップしても問題ないかもしれない。

毎秒実行するタスクなら、数秒の遅延は問題になる。過負荷による遅延が顕在化するのはこのあたりだと思う。実行保証が欲しいなら、リアルタイム性を保証する別のソリューションを模索した方がいい。

時刻調整(遅れ修正)

ntpやrtcと同期することで、突然時刻が進む。

時刻修正が入ると、それまでの時刻がinvalidateされる。次からは正しい時刻で出力制御しよう。嫌なら時刻が大きくずれる前にntpと同期して誤差を解消しておきたい。

この調整は、定時処理を省略してしまう可能性を抱えている。

時刻調整(進み修正)

ntpやrtcと同期することで、突然時刻が戻る。

時刻修正が入ると、それまでの時刻がinvalidateされる。次からは正しい時刻で出力制御しよう。嫌なら時刻が大きくずれる前にntpと同期して誤差を解消しておきたい。

この調整は、定時処理を2回実行してしまう可能性を抱えている。

時刻管理の話

BIOSにはBIOSの時計(RTC)がある。ハードウェアクロックと呼ばれ、電源がOFFのときも動き続ける。OSは起動時にハードウェアクロックからシステムクロックを復元する。

一般に、周波数から求めるシステムクロックは不正確である。水晶振動子を使うハードウェアクロックの方が正確だが、ntpサーバの時刻が基準なので、OSは定期的にハードウェアクロックを更新する。linuxはシャットダウン・再起動時に、Windowsはシステム時刻を修正した時に更新するそう。

Windowsのntp同期間隔は1wk(604800)(WindowsServerは1d?)、Linuxのntp更新間隔は1分(64)~17分(1024)。

ntpと通信できず、長時間動かしっぱなしだと、システムクロックとハードウェアクロックの誤差が開いていく。Linuxはこれがデフォルトだが、Windowsはこの差が60秒になると、システムクロックがハードウェアクロックに同期され、(KB232488)。

LinuxはUTC時刻、WindowsはLocal時刻をハードウェアクロックに保存するので、同一PCで両OSを起動すると時刻が狂う。デュアルブートする場合は設定を変更する必要がある。

x86系は、cpuのクロックを取得するrdtscを使い、1秒にあたるクロック数を計測できる。システムクロックはこれで1秒を計測する(...というのは古い話で、可変クロックCPUの場合はどうなのかと疑問に思ったり。)

仕様について

正直、00秒ぴったりに出力することにあまり意味はないかもしれない。ただ、ユーザーからすればその方が分かりやすいので、狙ってもいいと思う。

定期処理について

AIに聞いてみた。

毎秒: センサーデータの収集、金融取引の処理、リアルタイムビデオ処理、ゲームエンジン、リアルタイムデータ分析

毎分: ログの保存、バックアップの実行、監視、データの更新、メールの送信、キャッシュの更新、など。

毎時: バッチ処理、レポート生成、キャッシュのクリア、データのバックアップ、不要なセッションの削除

毎週: 週次セキュリティチェック、パフォーマンスの監視、マスターデータの更新、システムメンテナンス、ニュースレター配信、バッチジョブ

毎月:請求処理、給与計算、レポート作成、在庫管理、バックアップの実行、月次セキュリティチェック

毎年:会計処理、予算の作成、法廷調査の提出、契約の更新、棚卸、アップデート、健康診断