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.
Poznámka I když bude primárně řeč o práci s časem v linuxovém prostředí, přijde na řadu i 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 počítači se nachází několik potencionálních zdrojů času a v každém systému je k dispozici dvojí čas. Čas označovaný jako hardwarový, měří obvykle nějaký hardwarový čip umístěný na základové desce a čas systémový si udržuje sám spuštěný systém.

Hardwarový čas

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 nejdůležitě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ý. Načítání času přímo z hardwarových zařízení je však pomalé, proto se z něj čas načítá pouze v okamžiku startu operačního systému. I když se skutečnou hodnotou centrálně měřeného času nemá tento čas nic společného, je to v okamžiku spuštění operačního systému počítače jediný zdroj času ze kterého lze vypočítat alespoň přibližně aktuální čas. Proto se označuje jako RTC ( Real Time Clock) - "opravdový" čas,

I když tyto hodiny "tikají" v pravidelných intervalech, nelze je použít pro měření času přímo, protože žádný krystal nemá absolutně přesnou frekvenci. Některý kmitá rychleji a jiný pomaleji.

Původně se používaly od r.1981 (dnes již zastaralé) programovatelné čipy Intel 8253 a 8254 (PIT - Programmable Interval Timers). Tyto čipy byly 16 bitové a jejich krystal kmital cca s frekvencí 1.193182Mhz. Fyzicky se na deskách vyskytovaly tyto čipy tři. Každý z nich byl ale připojen zcela nezávisle a zajišťoval něco jiného. První fungoval jako časovač a generoval přerušení. Druhý se používal pro RAM a třetí generoval zvuk na repráčku "speakeru".

Čas na těchto čipech odtikával sice v přesných intervalech, ale s nízkou granularitou. Tzn. že neumožňovaly změřit čas kratší než jedna sekunda. Takže se sice daly použít jako zdroj času pro nastavení výchozího času při spuštění operačního systémo, ale pro měření systémového času bylo třeba použít zdroj času jiný, pokud možno přesnější.

Zdroje systémového času

V linuxu se udržuje aktuální čas v několika proměnných, které se svou hodnotou liší. Z hlediska lokálního systému nejpřesnější tzv. čas monotonický (CLOCK_MONOTONIC), který má bod nula v okamžiku spuštění stroje, neboť se k jeho měření používají přesnější zdroje.

Kromě něj se používá č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. Realtimový čas má svůj počátek v pomyslném bodě nula, kterým je 00:00:00 UTC 1. ledna 1970[1]. Od monotonického času se liší nejenom v tom, že se počítá od jiného nuly, ale také v tom, jakým způsobem lze přenstavit hodnotu kterou vrací.

Systémové hodiny v linuxu běží nezávisle na RTC a místo pravidelného tiku krystalového oscilátoru se měří většinou podle periodického spouštění událostí časovači.

Časovač (timer) je hardwarové zařízení, které zajišťuje to, aby po uplynutí nastaveného intervalu došlo k vyvolání události, která spustí naplánovanou úlohu. Při jeho nastavení se postupuje tak, že se nejprve při plánování úlohy zjistí z aktuálního zdroje času čas. Pak se vypočítá z rozdílu mezi aktuálním čase a časem, kdy se má plánovaná úloha vykonat, délka vyčkávacího intervalu. A ten pak nastaví na časovači. Když se po jeho uplynutí čip "probudí", vyvolá událost (clock event), která spustí naplánovanou úlohu.

Zdroje č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á opakované periodicky spouštěné cykly od okamžiku spuštění stroje, tak se 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!


HPET

V dnešních čipsetech jsou již většinou integrovány čipy mnohem přesnější než původní PET, které se označují jako HPET. High Precision Event Timer je velmi přesný 64 bitový programovatelný hardwarový časovač, který však nemusí být k dispozici na všech strojích. Jeho použití, coby zdroje času také nemusí být vždy bezproblémové. HPET je totiž hardwarově integrován na úrovni chipsetu, nikoliv CMOS, jako PIT a tak se u některých chipsetů stává, že jej ACPI uspí spolu se zbytkem chipsetu.

Po probuzení ale HPET o této vynucené přestávce nic neví a pokud je hlavním zdrojem času, projeví se tento problém tak, že systémový čas je oproti HW času o interval který HPET prospal posunutý do minulosti[2].

ACPI_PM

Zdroj času, který nikdy nespí, je programovatelný časovač, který dělá v čipsetu budíka pro ACPI. To podle něj řídí správu napájení (Power Management). Je přesnější než PIT, protože jde o 24-bitový čítač s frekvencí 3.579545MHz (což odpovídá zhruba trojnásobku frekvence PIT). Nepoužívá žádný registr a jeho čas se po přetočení začíná počítat vždy znovu od nuly. Jeho výhodou oproti jiným zdrojům času však je, že zůstává v běhu i když jsou ostatní zdroje času uspané nebo zpomalené.

Nevýhodou ACPI_PM je zdlouhavý proces čtení aktuálního času, který trvá jednu až dvě mikrosekundy.

TSC

Naopak velmi rychlé je čtení aktuálního času z TSC. TSC není žádný speciální časovač, ale pouze hodnota časového razítka procesoru - rdtsc (Read Time-Stamp Counter). Toto časové razítko je závislé na frekvenci procesoru, proto není TSC spolehlivý zdroj času na strojích, kde systém mění frekvenci procesoru přes cpufreq, nebo tehdy, je-li virtuální stroj, který s hodnotou TSC pracuje, migrován mezi hostiteli s jinou frekvencí TSC!

Je-li hodnota TSC v procesoru stabilní lze zjistit podle toho, zda-li má uvedeno mezi svými flags constant_tsc. Pokud mezi nimi chybí, vypněte v BIOSu všechny věci, které nějak souvisí se správou napájení.

Aby linuxové jádro neměnilo frekvenci procesoru, lze také zabránit tak, že se mu předá hodnota

processor.max_cstate=1

a nebo tak, že se v konfiguračním souboru cpufreq /etc/sysconfig/cpuspeed nastaví hodnota jako pro MIN_SPEED, tak pro MAX_SPEED na maximum. Jakou maximální hodnotu uvést lze zjistit ze souboru /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies



Jak vypnout použití TSC u virtuálu

U hostitelů, které časovač TSC k dispozici nemají, nebo pokud nechcete aby jej virtuální stroj používal je nutné při startu 64 bitového 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

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


Ovšem z hlediska komunikace mezi počítači je podstatný


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

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" [3]. 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[4]. Tím že jsou jiffies závislé na této frekvenci a navíc i na použité platformě[5] je dáno, že patří mezi nejméně spolehlivé zdroje času.

tsc

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)[6], 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. 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.
  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. Což dokládá i příklad použití slova jiffy na anglické wikipedii - "I'll be back in a jiffy"
  4. Hodnota nastavená při kompilaci jádra v CONFIG_HZ
  5. 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.
  6. http://www.vmware.com/files/pdf/Timekeeping-In-VirtualMachines.pdf