Přestupná sekunda?

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Pondělí Prosinec 29 22:52:02 CET 2008


On Sun, 28 Dec 2008, Michal Dobes wrote:

> Nicméně i linux jde nastavit, že se nemá chovat POSIXově, ale ISOvě a
> přestupné sekundy podporovat korektně a počítat s nimi. [...] Ale trochu
> to rozhodí pár programů, které počítají natvrdo s tím minuta=60 s,
> den=86400 s.

Také mohou být poněkud překvapeny programy předpokládající, že gmtime()
vrací pro jeden konkrétní vstup stále ten samý výsledek (localtime() se to
týká také, ale tam ještě větší zmatek způsobují reformy letního času).

> A občas to vypadá zajímavě. Mám vlákno, které se má budit
> po 20 ms, časování dělám pomocí pthread_cond_timedwait() na ETIMEOUT
> a v okamžiku vložení přestupné sekundy vzbuzení vypadá takto (čas
> z gettimeofday()):
[...]
> 1230076799.982844
> 1230076799.002849  <- těsně před tímto kernel cuknul zpět časem
> 1230076800.002918
> Byla tam opravdu sekunda pauza (ověřováno čtením čítače v PCI kartě,
> která o čase v systému nic neví).

A jaký absolutní čas jste posílal do pthread_cond_timedwait()?

Je tam mimochodem docela zajímavá paradoxní situace: POSIX použití 
absolutního času zdůvodňuje tím, že uspání úlohy při převodu relativní 
prodlevy na absolutní čas by způsobilo chybný výsledek, ale linuxové jádro 
pracuje s relativními prodlevami, a tak Glibc interně provádí přesně tu 
věc, které se chtěli vyhnout.

> On to tak ntpd možná dneska dělá. Jednak se dá ntp démonu říci, že má
> plynule doregulovávat i víc, než 128 ms (viz zmíněná volba -x)

To samozřejmě lze. Jenom trvá asi řádově hodinu, než to srovná 
sekundovou chybu.

> dle dohadování v mailing listu ntpd to řeší ntpd třemi způsoby:
> a) systém nemá podporu pro přestupnou sekundu a ani potřebnou regulaci
> času, pak ntpd v okolí přestupné sekundy trhne sám časem zpět,
> b) systém má podporu přestupné sekundy, pak ntpd jen oznámí vložit
> nebo vypustit přestupnou sekundu a nechá to na systému,
> c) systém má podporu pro potřebnou PLL změnu plynutí času, pak ntp na
> danou chvíli změní plynutí tak, aby to dohnal, takže je otázka, kolik
> dovolí linux maximálně zrychlit/zpomalit.

Ať se do zdrojáků ntpd koukám, jak se koukám, tak tam možnost (c)  
nevidím. Pokud je čas řízen pomocí ntp_adjtime() (což zahrnuje to PLL),
tak jsou přestupné sekundy ohlášeny jádru, aby si to vyřídilo samo.

To přeskočení hodin o sekundu zpět je i v referenční implementaci jaderné
podpory pro NTP ("nanokernel").

> Ano, ta jedna sekunda běží ve skutečnosti 2 sekundy, ale NTP nechá
> v první sekundě plynout čas a v druhé stojí těsně před překlopením
> do už normální.

Tomu se mi moc nechce věřit. Možná se tak chová, když nemá ntp_adjtime().

-- 
Pavel Kankovsky aka Peak                          / Jeremiah 9:21        \
"For death is come up into our MS Windows(tm)..." \ 21th century edition /




Další informace o konferenci Linux