Přestupná sekunda?

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Pátek Prosinec 26 18:01:05 CET 2008


On Tue, 23 Dec 2008, Michal Dobes wrote:

> 	tak nějak jsem nucen přemýšlet nad tím, jak vlastně probíhá
> v linuxu proces přestupné sekundy, jak nám bude na konci tohoto roku
> nadělena (přesněji až 1. ledna v 00:59:60 SEČ v ČR) po několika letech 

Ono to žádným dobrým způsobem nejde udělat, protože POSIXová časová řada
prostě na jednu stranu s existencí přestupných sekund nepočítá a každý den
je podle ní dlouhý přesně 86400 s, na druhou stranu se mají od ní odvozené
časové údaje shodovat s těmi podle UTC.

Což znamená, že během přestupné sekundy přicházejí do úvahy jen asi tři 
možnosti:

1. hodiny stojí,
2. hodiny jdou nějakou delší dobu pomaleji,
3. hodiny se vrátí o sekundu zpět.

Každá možnost má nějaké přednosti a nějaké nedostatky.

> Čili je tam skok v čase zpět, což některým věcem může kapánek vadit.

Kapánek ano. Ale na druhou stranu: vzhledem k tomu, jak přesné a stabilní
hodiny jsou v běžných počítačích, bych řekl, že se potřeba opravit hodiny
skokem zpět vyskytuje v posledních pár letech výrazně častěji než
přestupná sekunda.

> [...] čili pokud vlákno používá pro buzení nějakou formu časovače třeba
> po 200 ms, tak bude v době přestupné sekundy vzbuzeno o sekundu později
> místo těch 200 ms?

Jádro jede interně podle jiffies a ty jsou zásadně monotónní (tedy
obvykle, viz níže).

> 	Sice ve zdrojácích kernelu je moudrá poznámka, že když je
> v činnosti ntp nebo něco podobného, tak je jeho starostí, aby v dané
> době čas plynul  monotonně, ale nějak nemám představu, jak to zařídí.

Obávám se, že to nijak nezařídí, protože by to musel udělat výše uvedeným 
postupem č. 2, který by ale vedl k tomu, že by měl v určitém okamžiku 
odchylku hodin nejméně 0,5 s. Ovšem ntpd obvykle toleruje pouze odchylku 
do 128 ms, a pokud je větší, tak hodiny přenastaví skokem.

> 	Je pravda, že pokud se posílá během přestupné sekundy dotazy na
> ntpd démon jaký má čas, tak po dobu přestupné sekundy mu čas má stát
> a hlásit pořád stejný [viz 2].

To bych řekl, že není úplně správná interpretace. Z okolního textu
vyplývá, že časová řada NTP tvoří epochy ohraničené přestupnými sekundami.
Čili tam uvedenou tabulku je IMHO třeba chápat tak, že sekunda s číslem
3124137560 běží dvakrát: jednou jako koncová přestupná sekunda patřící do 
epochy s offsetem 31 s vůči TAI, podruhé už jako počáteční sekunda epochy 
s offsetem 32.

V tomto smyslu je výše uvedený postup č. 3 jediný opravdu kompatibilní
s NTP a jeho překrývajícími se epochami.

Přestupné sekundy jsou prostě osina v zadku. Asi by to chtělo
implementovat některá doporučení z [1] týkající se použití zeměkoule
jako časového a frekvenčního etalonu. :)

[1] <http://www.leapsecond.com/museum/earth/>

> PS: A to optimisticky přehlížím tu hromadu reportů z poslední přestupné
> sekundy, kdy kernel do logu hodil "Clock: inserting leap second 23:59:60
> UTC" a za tím už jen následovalo kernel panic.... :-)

Uh! To jsem tedy v životě neviděl. Viděl jsem kernel panic, když jádru
přetekly kolem dokola jiffies, ale že by padlo na ústa kvůli posunu hodin
zpět, to tedy opravdu ještě nikdy.

Pokud se někdo bojí, tak může na pár hodin kolem půlnoci vypnout ntpd.
A pak ho spustit s -x a trpělivě si počkat, než se sesynchronizuje.

-- 
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