KVM (čas)

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

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.

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!

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

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

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

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