昨日の続き。
毎分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に聞いてみた。
毎秒: センサーデータの収集、金融取引の処理、リアルタイムビデオ処理、ゲームエンジン、リアルタイムデータ分析
毎分: ログの保存、バックアップの実行、監視、データの更新、メールの送信、キャッシュの更新、など。
毎時: バッチ処理、レポート生成、キャッシュのクリア、データのバックアップ、不要なセッションの削除
毎週: 週次セキュリティチェック、パフォーマンスの監視、マスターデータの更新、システムメンテナンス、ニュースレター配信、バッチジョブ
毎月:請求処理、給与計算、レポート作成、在庫管理、バックアップの実行、月次セキュリティチェック
毎年:会計処理、予算の作成、法廷調査の提出、契約の更新、棚卸、アップデート、健康診断