From: kmeaw
Date: 2020-11-04 01:27:40Z
CLOCK_REALTIME может, а CLOCK_MONOTONIC не может. Но в Linux есть time
namespace, который позволяет виртуализировать CLOCK_MONOTONIC и добавить
к нему (возможно отрицательное) смещение, так что в редких случаях всё
равно может.
Самая частая причина скачков CLOCK_REALTIME это работа клиента
сихронизации времени с внешним источником.
В большинстве реализаций ntp есть код для плавной подстройки часов
(adjtimex), чтобы такого не происходило.
К сожалению, не все знают про CLOCK_MONOTONIC, и до сих пор часто пишут
код, который измеряет прошедшее время между двумя точками через разность
CLOCK_REALTIME.
В Go про это подумали, и засунули и те, и другие часы в time.Time:
https://golang.org/pkg/time/#hdr-Monotonic_Clocks
fdm, как несложно догадаться, использует CLOCK_REALTIME:
https://github.com/nicm/fdm/blob/eabdf3beb623aba8e5905c9d5d2cb3eed8c6a780/fdm.c#L79-L87
https://github.com/nicm/fdm/blob/eabdf3beb623aba8e5905c9d5d2cb3eed8c6a780/child-fetch.c#L321
From: Sergey Matveev
Date: 2020-11-04 08:16:06Z
*** kmeaw [2020-11-04 04:22]:
>Самая частая причина скачков CLOCK_REALTIME это работа клиента
>сихронизации времени с внешним источником.
Я как-раз на тот момент перезагрузил систему (точнее забыл подключить к
питанию и не заметил что аккумулятор сел) и наверное NTP на тот момент
решил подкрутить время. Хотя я думал что NTP в BSD из коробки именно
управляет скоростью хода времени и оно никогда не может идти не в перёд,
Но также слышал что в момент первого запуска он может и жёстко выставить
его -- думаю это и произошло. Надо бы конечно не гадать, а взять и
посмотреть, чтобы понимать работу компьютера, а не на слухах жить, но...
лень :-)
>К сожалению, не все знают про CLOCK_MONOTONIC, и до сих пор часто пишут
>код, который измеряет прошедшее время между двумя точками через разность
>CLOCK_REALTIME.
Я вообще не знал про эти штуки. Честно говоря, думал что из-за NTP,
которые управляют скоростью хода часов, а не жёстко выставляют, можно
всегда предполагать что часы идут только вперёд и поэтому можно
безопасно вызывать "обычный" CLOCK_REALTIME (что всю жизнь и делал,
получается). Только при загрузке ОС допустимо делать что-нибудь типа
ntpdate, до запуска, грубо говоря, любых других программ. А кто
синхронизирует время по cron этой командой -- сам дурак и сам виноват :-).
А если NTP не используется, то тоже часы идут только вперёд.
Эх, век живи -- век учись!