KVM (čas)

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

Přesný čas je základním předpokladem, aby vůbec mohly počítače mezi sebou vzájemně komunikovat. A při virtualizaci to platí dvojnásob. Proto je nutné vědět jak hodiny v hostitelském stroji fungují, podle jakého zdroje času se korigují a jakým způsobem to případně může ovlivňovat běh virtuálního stroje. I když z hlediska tohoto textu bude primárně řeč o linuxovém systému, bude zmíněno i jak funguje nastavení času v prostředí systémů MS Windows, aby bylo dostatečně zřejmé, jakým způsobem to může mít vliv na běh virtualizovaného stroje.

V každém linuxovém systému běží současně dvojí čas:

  • hardwarový, jehož zdrojem je hardwarový čip, napájený z malé baterie baterie
  • a systémový, který je založen na událostech a může být průběžně korigován z různých zdrojů

Hardwarové hodiny jsou díky napájení z baterie zcela nezávislé na systému, takže čas na nich běží i když je stroj vypnutý. Pro systémové hodiny je čas z nich získaný výchozí, proto se také označují hardwarové hodiny jako RTC ( Real Time Clock) - "skutečný" čas, i když se jeho hodnota může vůči UTC lišit.

Původně byly hardwarové hodiny založeny na dnes již zastaralém čipu Intel 8253[1], který bývá v dnešních čipsetech většinou nahrazován mnohem přesnějšími čipy HPET (High Precision Event Timer).

Každý dotaz na fyzické zařízení je však poměrně zdlouhavá záležitost proto linuxové jádro používá zdroje času především pro výchozí nastavení a následnou korekci systémového času, který však není navázán na zdroj času, ale na zdroje událostí - časovače, z nichž některé ovšem mohou zároveň fungovat i jako zdroj času.

Zdroje času (angl. clocksource), poskytují číselný údaj, vztáhnutý k určitému výchozímu okamžiku[2]. Časovače ( angl. timers) umožňují naplánovat spuštění události (angl. event) po uplynutí určitého intervalu.

Časovač se nastavuje tak, že se při plánování úlohy nejprve zjistí ze zdroje času aktuální čas, který se vytáhne buď z hodnoty CLOCK_REALTIME, nebo CLOCK_MONOTONIC. A pak se vypočítá rozdíl vůči času, kdy se má plánovaná úloha vykonat. Podle výsledku se pak nastaví na časovači interval, za jak dlouho se má čip "probudit" a vyvolat událost (clock event), která spustí naplánovanou úlohu.

Upozornění Hodnoty v CLOCK_REALTIME a CLOCK_MONOTONIC nejsou stejné, ovšem rozdíl není jen v tom, že každá má jiný počátek, vůči kterému se čas počítá, ale také v tom jak a čím může být jejich hodnota přenastavena!
  • Hodnota CLOCK_REALTIME je časový údaj, který má nulu na počátku r. 1970 a nastavuje se při startu počítače. Později se může tato hodnota přenastavit kupř. příkazem date
  • Hodnota CLOCK_MONOTONIC má nulu v okamžiku spuštění stroje. Přenastavení systémového času přes date však na ni nemá žádný vliv. Může ji však přenastavit ntpd!

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

High Precision Event Timer je velmi přesný programovatelný hardwarový časovač, který se nalézá ve většině moderních chipsetů. Nemusí však být vždy k dispozici, neboť je vázán na 64 bitové procesory. Jeho využití, coby zdroje času však nemusí být v reálu zcela bezproblémové. Tím, že je HPET hardwarově integrován na úrovni chipsetu se může stát, že jej ACPI přenastaví na špatnou hodnotu. Dělával to prý BIOS u chipsetů, které měly HPET integrován v "severním můstku" při předávání řízení jádru.

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

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)[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. 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. Ve světe unixu je pomyslným bodem nula 00:00:00 UTC 1. ledna 1970. K podání návrhu normy, která měla tento tento okamžik formálně zakotvit v ISO standardu, došlo 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.
  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