KVM (čas)
Vnímání času je silně relativní záležitost, ovšem u počítačů je správný čas základním předpokladem, aby vůbec mohly fungovat.
Pro nastavení a udržení správného času má operační systém k dispozici zdroje času (angl. clocksource), které poskytují číselný údaj, vztáhnutý k určitému výchozímu okamžiku[1] a časovače ( angl. timers), které umožňují naplánovat spuštění události (angl. event) po uplynutí určitého intervalu.
U fyzických strojů bývají zdroje času integrované na fyzické úrovni přímo v chipech, a většinu z nich lze softwarově přenastavit, takže mohou fungovat zároveň i jako časovače.
Nastavení časovače se provádí tak, že se při plánování úlohy nejprve zjistí ze zdroje času jeho aktuální čas, který se vytáhne buď z hodnoty CLOCK_REALTIME, nebo CLOCK_MONOTONIC. Pak se vypočítá rozdíl vůči času, kdy se má plánovaná úloha vykonat a 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.
Zdroje času a časovače
V každém systému, existuje několik časovačů, které jsou zároveň i zdroje času[2]. O tom, co je zrovna k dispozici rozhodují především možnosti reálného hardware a pak podpora v linuxovém jádře.
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á k dispozici - 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
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.
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
|
Zdroje času na fyzickém hardware
- lapic
- je programovatelný hardwarový časovač, který se nalézá v jádře procesoru (Local APIC Timer)
- 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.
- 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[4], která se nastavuje při kompilaci jádra. 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!
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 virtuálním strojům je hardware emulován hostitelem, mají k dispozici stejné zdroje času, jako kdyby šlo o stroje fyzické. Jenže přesnost softwarově emulovaného zdroje času je závislá na mnoha faktorech, o kterých virtuální stroj vůbec nic neví. Proto mají virtualizované stroje k dispozici speciální 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:
- 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)
- Odklepněte případné upozornění
- A na spuštěné příkazové řádce spusťte následující příkaz..
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.
- ↑ 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.
- ↑ Jaké zdroje času má zrovna k dispozici vaše linuxové jádro se můžete dozvědět výpisem obsahu souboru
/sys/devices/system/clocksource/clocksource0/available_clocksource
- ↑ Což dokládá i příklad použití slova jiffy na anglické wikipedii - "I'll be back in a jiffy"
- ↑ Hodnota nastavená při kompilaci jádra v CONFIG_HZ
- ↑ 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.