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[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!


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.