systemdにはdual_timestampという構造体がある。
typedef struct dual_timestamp {
usec_t realtime;
usec_t monotonic;
} dual_timestamp;
realtimeとmonotonicという2種類の時刻を同時に保持するためのものである。Linuxにはこの2種類の時刻があることは知っていたが、違いを把握していなかったので調べてみた。
Linux(というかPOSIX)では、clock_gettime(2)システムコールで経過時間を測るための時刻を得ることができる。上記二つの時刻は、それぞれCLOCK_REALTIME
とCLOCK_MONOTONIC
フラグを指定することで取得できる。Man page of CLOCK_GETTIMEやDifference between CLOCK_REALTIME and CLOCK_MONOTONIC? - Stack Overflow の説明によると、それぞれの時刻には以下の違いがあるようだ。
- CLOCK_REALTIME
- NTP等によってシステムの現在時刻が変更されると、clock_gettimeも大きく変化することがある(時刻が戻る可能性がある)
- なので、ベンチマーク等で経過時間を測りたいときには向かない
- CLOCK_MONOTONIC
- 時刻はかならず単調増加する
- システムの時刻変更の影響を受けるが、大きく変化することはないし、時間が戻ったりもしない
Linuxでは、それ以外にもCLOCK_MONOTONIC_RAW
という時刻が取得可能で、こちらはNTP等の時刻変更の影響を全く受けないらしい。では、こちらの方が経過時間の計測に向いているかというと、(上記Stack Overflowのコメントによると)そうでもないらしい。なぜそうなのかはまだ理解していないので、またいずれ調査するかもしれない。