KVM (čas)

Z DCEwiki
Skočit na navigaci Skočit na vyhledávání

Přesný čas je základním předpokladem pro fungování počítače. Problémy s časem ve virtualizovaném prostředí mohou vést ke zdánlivě záhadným kolapsům, proto je nutné vědět...

  1. jak fungují hodiny a korekce času jak ve fyzickém hostitelském stroji
  2. jakým způsobem je čas propagován do virtualizovaného prostředí
  3. a jak pak s časem pracuje virtuální stroj.

I když primárně je řeč o linuxu, přijde řada i na to jak funguje nastavení času v prostředí systémů MS Windows, aby bylo jasné jak se dá změnit jejich zdroj času při ev. problémech s časem u virtualizovaného stroje s takovým OS.

V každém linuxovém systému běží současně několikery hodiny.

hardwarové hodiny

Jsou většinou založené na oscilaci křemíkového krystalu (tzv. "tiku"), umístěném v hardwarovém čipu. Těchto čipů může být na desce více a mohou "tikat" s různou přesností.

Asi nejznámnější je čip, který je součástí CMOS, napájený z malé baterie umístěné na základní desce. Díky ní běží jeho čas zcela nezávisle na operačním systému, a to i když je stroj vypnutý. Čas se načítá z tohoto čipu v okamžiku startu operačního systému. I když se skutečnou hodnotou centrálně měřeného času nemá nic společného. Je to však v okamžiku spuštění počítače jediný zdroj ze kterého lze načíst a vypočítat alespoň přibližně aktuální čas. Proto se označuje jako RTC ( Real Time Clock) - "opravdový" čas,

Tyto hodiny nelze použít pro měření času přímo protože tikají sice v pravidelných intervalech, ale s rozdílnou frekvencí. Původně byly používány dnes již zastaralé čipy Intel 8253[1]. Tyto hodiny měří čas sice přesně, ale s nízkou granularitou, tzn. že na nich nelze změřit časy kratší než jedna sekunda. Takže je sice lze použít k získání výchozího času, ale k vlastnímu měření času za běhu počítače je nutné použít zdroj času jiný, pokud možno přesnější.

V dnešních čipsetech jsou již většinou integrovány mnohem přesnější čipy HPET. High Precision Event Timer je velmi přesný 64 bitový programovatelný hardwarový časovač, který však nemusí být k dispozici vždy. Jeho použití, coby výchozího zdroje času také nemusí být v reálu zcela bezproblémové. Tím, že je HPET hardwarově integrován na úrovni chipsetu, se může na u některých chipsetů stávat, že jej ACPI uspí, spolu se zbytkem chipsetu a HPET se tím přenastaví na špatnou hodnotu[2].


  • systémové hodiny : Si nastaví svůj výchozí čas při spuštění podle zkorigovaného času z hardwarových hodin, ovšem pak již měří čas podle beztikových zdrojů, které nejsou založeny na pravidelném tepu nějakého oscilátoru, ale na událostech. Navíc mohou být průběžně korigovány z různých zdrojů.


Přímé dotazy na fyzické zařízení však jsou poměrně zdlouhavá záležitost, proto linuxové jádro používá hardwarové hodiny jako zdroj času pouze pro výchozí nastavení, a pak jižměří čas na jiném zdroji času, kterým je většinou nějaký časovač (timer).

Časovače zajišťují to, aby po uplynutí nastaveného intervalu došlo k vyvolání události, která pak spustí naplánovanou úlohu. Jejich nastavení probíhá tak, že se při plánování úlohy nejprve zjistí ze zdroje času aktuální čas. Pak se vypočítá rozdíl vůči času, kdy se má plánovaná úloha vykonat. Podle výsledku se nastaví na časovači interval, po jehož uplynutí se čip "probudí" a vyvolá událost (clock event), která spustí naplánovanou úlohu. V případě že časovač funguje jako zdroj času, tak se na něm periodicky nastavuje a spouští úloha, která počítá cykly se stálým (monotónním) intervalem. Proto se tento čas označuje jako čas monotonický (CLOCK_MONOTONIC), a má nulu v okamžiku spuštění stroje. Z hlediska lokálního systému je tento čas přesnější než ten který je získán z RTC.

Zdroj času (angl. clocksource), vrací číslo, které udává počet jednotek, které uplynuly od určitého výchozího okamžiku. Pokud je tímto zdrojem časovač, který počítá cykly od okamžiku spuštění stroje tak vrací čas monotonický (CLOCK_MONOTONIC). Na ten nemá vliv nastavení hardwarových hodin, přes hwclock, ani přenastavení systémového času přes date, může ho však ovlivňovat ntpd tím, že pokud se začne tento čas rozcházet vůči kontrolnímu zdroji času, tak jej začne podle potřeby buď zrychlovat, nebo zpomalovat!

Ovšem z hlediska komunikace mezi počítači je podstatný čas realtimový (CLOCK_REALTIME), což je v podstatě zkorigovaná výchozí hodnota načtená při startu z RTC, ke které se připočítá monotonický čas. Tento čas se počítá v sekundách a má svůj počátek v pomyslném bodě nula, kterým je 00:00:00 UTC 1. ledna 1970[3]. Čas je uložen v CLOCK_REALTIME a CLOCK_MONOTONIC se liší nejenom v tom, že se každý počítá od jného okamžiku, ale také v přesnosti a také v tom, jakým způsobem lze ovlivnit hodnotu kterou vrací.

Hodnota CLOCK_REALTIME, která má nulu na počátku r. 1970 se nastavuje při startu počítače tak, že se na aktuální časové razítko (timestamp) vytažené z RTC aplikuje korekce na základě koeficientu, který je uložen v textovém souboru /etc/adjtime. Tento koeficient se vypočítá a uloží zpravidla těsně před korektním vypnutí systému, ale jinak vždy, když dojde ke korekci hardwarových hodin přes hwclock.

Poznámka
user@stroj:~$ cat /etc/adjtime
0.481047 1318428140 0.000000
1318428140
UTC
user@stroj:~$ date
St říj 12 23:23:40 CEST 2011
user@stroj:~$ date -d @1318428140
St říj 12 16:02:20 CEST 2011

Princip výpočtu koeficientu je založen na výchozí premise, že žádné hodiny nejdou absolutně přesně a tak dříve, nebo později se systémové a hardwarové hodiny vůči sobě rozcházet. Čím delší je interval, tím přesnější je pak i výsledný koeficient. Systémové hodiny, které jsou založeny na monotonickém času, měřeném přes časovače jsou považovány za přesnější. Navíc mohou být průběžně korigovány přes NTP protokol vůči jiným zdrojům přesného času v síti.

V okamžiku, vůči kterému má být koeficient vypočítán, se hardwarových hodin sejme aktuální timestamp (TSC). Od něj se odečte hodnota TSC uložená v souboru /etc/adjtime a pak se spočítá procentuálně o kolik se hodiny v RTC za tu dobu rozešly s aktuálním systémovým časem. Tato hodnota se pak zapíše jako výsledný koeficient. Vychází se z toho, že frekvence hodin v hardwarovém čipu sice není nachlup přesná, ale zato je stálá. Takže až se stroj zase zapne, lze zkorigováním času získaného z RTC tímto koeficientem získat relativně přesný výchozí čas. Za běhu pak lze tento výchozí čas později přenastavit kupř. příkazem date.

Upozornění Příkaz date sice provede změnu času v systému, ale neudělá potřebnou korekci hardwarových hodin, Při ukončení se vypočítává koeficient zpoždění (či zrychlení) hardwarových hodin, a neřeší se o kolik jsou posunuty.


Časovače ( angl. timers) umožňují naplánovat spuštění události (angl. event) po uplynutí určitého intervalu.

který se vytáhne buď z hodnoty CLOCK_REALTIME, nebo . A


Systém používá vždy pouze jeden výchozí zdroj času, ale v případě, že tento zdroj přestane být spolehlivý (kontrolní odchylka přesáhne určitou mez), si - pokud má tu možnost - vybere zdroj jiný.

Jaký zdroj času používá zrovna váš linuxový systém můžete zjistit ze souborů v poadresáři /sys/devices/system/clocksource/clocksource0/current_clocksource

Poznámka
user@stroj:~$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
tsc hpet acpi_pm
user@stroj:~$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource
tsc

Z ukázkového výpisu je zřejmé, že stroj má k dispozici kromě aktuálně nastaveného tsc k dispozici ještě další dva.

Poznámka Ačkoliv název podadresáře clocksource0 evokuje myšlenku že by zde mohly existovat i jiné zdroje času, osobně jsem žádný jiný než tento adresář zatím neviděl

Časovače na fyzickém hardware

lapic

je programovatelný hardwarový časovač, který se nalézá v jádře procesoru (Local APIC Timer)

Zdroje času na fyzickém hardware, které zároveň fungují jako časovače

hpet

pit

Programmable Interval Timer je nejstarší programovatelný hardwarový časovač založený na chipu Intel 8253. Dnes se už v počítačích nevyskytuje, ale lze se s ním setkat u strojů na kterých je emulován (např. virtuály virtualizované v prostředí VMware).

acpi_pm

Programovatelný časovač, který se nalézá v chipsetu.

Zdroje času na fyzickém hardware

jiffies

jiffy je anglický výraz nejasného původu, který označuje blíže nespecifikovaný krátký časový interval, významově odpovídající českému výrazu "mžik" [4]. Z hlediska linuxového kernelu jde o časovač, který původně počítal jednotlivé "tiky" procesoru (tik == přerušení). To však dělalo problémy u beztikových jader. Obzvlášť pokud byl systém ve stavu idle ("uspaný"). Proto od kernelu verze 2.6.21 není jiffies již není navázaný na přerušení procesoru, ale na frekvenci úloh, která se nastavuje při kompilaci jádra[5]. Tím že jsou jiffies závislé na této frekvenci a navíc i na použité platformě[6] je dáno, že patří mezi nejméně spolehlivé zdroje času.

tsc

Kromě programovatelných zdrojů času, u kterých lze čas přenastavit se používá i pasívní zdroj času ze kterého lze aktuální čas pouze číst - rdtsc (Read Time-Stamp Counter). Jeho výhodou je, že je díky tomu k němu rychlejší přístup.

TSC však není spolehlivý zdroj času na strojích, kde systém mění frekvenci procesoru přes cpufreq, nebo pokud je stroj migrován mezi hostiteli s jinou frekvencí TSC!


Poznámka Pokud u CPU není uvedeno constant_tsc, vypněte všechny věci které souvisejí se správou napájení


Změnám frekvence procesoru lze zabránit předáním hodnoty processor.max_cstate=1

Vypnout lze cpufreq tak, že v souboru /etc/sysconfig/cpuspeed se nastaví hodnota jako pro MIN_SPEED, tak pro MAX_SPEED na maximum. Jakou maximální hodnotu lze nastavit lze zjistit ze souboru /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies

U hostitelů, které časovač TSC nemají, je nutné 64 bitovému kernelu virtuálního stroje předat parametr notsc, a 32 bitovému zase pro změnu implicitně přes clocksource říct, aby používal jako zdroj času acpi_pm

Zdroje času na virtuálních strojích

Vzhledem k tomu, že hardware virtuálních strojů je většinou emulován hostitelem, mají k dispozici stejné zdroje času, jako kdyby šlo o stroje fyzické. Jenže díky tomu, že nejde o skutečný hardware je jejich spolehlivost a přesnost závislá na hostiteli, o kterém virtuální stroj vůbec nic nemusí vědět.

Stroje virtualizované v prostředí VMware jsou nejčastěji navázané na použití emulovaného tsc (rtc)[7], ale virtuální prostředí jako KVM, nebo XEN mají pro virtualizované stroje k dispozici vlastní zdroje času.

xen
dyntick
je beztikové počítadlo, které může běžet i když je systém ve stavu idle (uspaný)
kvm-clock

Změna zdroje času v linuxovém kernelu

Defaultní zdroj času lze v linuxu změnit za běhu přepsáním hodnoty v souboru ..., nebo ho nastavit při bootu tak, že se jádru předá příslušná hodnota clocksource

clocksource=hpet


Zdroje času u MS Windows

Systémy MS Windows používají jako výchozí zdroj času rtc (Real-Time Clock), ale mohou používat i tsc (Time Stamp Counter), pokud se jim to implicitně nastaví při bootu. Pokud tedy není na hostiteli hardwarový čas stabilní, je lepší virtualizovanému stroji s MS Windows při startu říct aby používal tsc.

Od MS Windows Vista se to dělá přes aplikaci bcdedit.exe (Boot Configuration Data Editor)

Postup:

  1. V prostředí virtuálního stroje vyhledejte v menu Start, mezi položkami Příslušenství (Accessories) Příkazový řádek (Command Prompt). Klikněte nad touto položkou pravým tlačítkem myši a v kontextovém menu, které se objeví zvolte (Run as Administrator)
  2. Odklepněte případné upozornění
  3. A na spuštěné příkazové řádce spusťte následující příkaz..
Poznámka
C:\Windows\system32>bcdedit /set {default} USEPLATFORMCLOCK on

Hodnotou {default} je systémové UUID zaváděného systému. Změna se projeví až po restartu.

To však neplatí pro starší verze MS Windows (XP). U těch se nastavuje tsc jako zdroj času předáním parametru pmtimer v konfiguračním souboru zavaděče boot.ini.Viz příklad níže.

Poznámka
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /usepmtimer

  1. Tento čip byl 16 bitový a jeho krystal kmital s frekvencí 1.193182Mhz. Fyzicky se používaly tyto čipy tři, zcela nezávisle připojené k ostatnímu hardware. První zajišťoval časování a generoval přerušení. Druhý se používal pro RAM a třetí generoval zvuk na repráčku "speakeru".
  2. Dělával to prý BIOS u IBM chipsetů, které měly HPET integrován v "severním můstku", při předání řízení chipsetu jádru.
  3. K podání návrhu normy, která měla tento tento okamžik formálně zakotvit v ISO standardu, došlo v r.1971 ovšem k jejímu schálení (ISO 2014) došlo až r. 1976. Tato norma se pak stala základem aktuální normy ISO 8601, která určuje mj. i formu zápisu.
  4. Což dokládá i příklad použití slova jiffy na anglické wikipedii - "I'll be back in a jiffy"
  5. Hodnota nastavená při kompilaci jádra v CONFIG_HZ
  6. Při hodnotě 1000HZ na 32 bitovém systému se začne čas rozcházet zhruba po 50 dnech, zatím co u 64 bitovém 1000HZ údajně až po 600 miliónech let.
  7. http://www.vmware.com/files/pdf/Timekeeping-In-VirtualMachines.pdf