K SMI může jistě dojít během normálního provozu. Můj domácí desktop má každou sekundu a půl SMI řízený čipovou sadou, který je povolen v čipové sadě. Také jsem viděl některé servery, které je mají dvakrát za sekundu kvůli schématu škálování frekvence CPU řízenému BIOSem. Některé systémy však mohou fungovat dlouhou dobu, aniž by došlo k SMI, takže to opravdu záleží.
Otázka č. 1:hwlatdetect je jednou z možností, jak zjistit latenci SMI vyskytujících se ve vašem systému. BIOSBITS je další možností, což je zaváděcí CD, které dokáže identifikovat, zda se vyskytují SMI. Můžete také napsat svůj vlastní test vytvořením modulu jádra, který se točí ve smyčce a bere časová razítka (pomocí RDTSC). Pokud vidíte dlouhou mezeru mezi dvěma čteními časových značek, můžete se obrátit na CPU MSR 0x34 a zjistit, zda se počítadlo SMI zvýšilo, což by znamenalo, že došlo k SMI.
Pokud chcete vygenerovat SMI, můžete vytvořit modul jádra, který provede instrukci OUT CPU pro port 0xb2, např. zapište do tohoto portu hodnotu 0. (Tento SMI můžete také načasovat tak, že shromáždíte časové razítko těsně před a těsně po zápisu na port 0xB2).
Otázka č. 2, SMI fungují na vrstvě pod OS, takže který OS si vyberete, by neměl mít žádný dopad.
Otázka č. 3:BIOSBITS doporučuje udržovat latence SMI pod 150 mikrosekund.
SMI uvede váš systém do režimu SMM (System Management Mode), který odloží normální spuštění jádra během doby zpracování SMI. Jinými slovy, SMM není ani reálný režim, ani chráněný režim, jak víme o běžném provozu jádra, místo toho vykonává nějakou speciální instrukci uloženou v SMRAM (uložené ve Firmware Bios). Chcete-li zjistit jeho latenci, můžete zkusit spustit SMI (může být vygenerováno softwarem) a pokusit se zachytit celkový čas strávený v režimu SMM. Abyste toho dosáhli, můžete napsat modul linuxového jádra, protože budete potřebovat nějaká speciální oprávnění k vydání SMI (myslím).
Pro systémy v reálném čase si myslím, že je hezké, když se můžete vyhnout takovýmto přerušením, jako je SMI.
Pomocí turbostatu můžete zkontrolovat, zda jsou přerušení správy systému (SMI) obsluhována či nikoli. Například:
# turbostat sleep 120
[check column SMI for value greater than 0]
Samozřejmě z toho můžete také vypočítat frekvenci SMI.
Vědět, že k SMI skutečně dochází určitou rychlostí, je důležitá informace. Ale také chcete vědět, kolik času stráví režim správy systému (SMM) těmito přerušeními. Pokud je například přerušení SMI jen velmi krátké, může být pro vaši aplikaci v reálném čase irelevantní. Na druhou stranu, pokud máte hardware s dlouhými přerušeními SMI, pravděpodobně budete chtít mluvit s dodavatelem, nakonfigurovat firmware jinak (pokud je to možné) nebo přejít na jiný hardware s méně rušivým SMM.
Nástroj perf má režim, který měří, kolik cyklů je utraceno v SMM během SMI (s využitím informací poskytovaných určitými čítači CPU). Příklad:
# perf stat -a -A --smi-cost -- sleep 120
Performance counter stats for 'system wide':
SMI cycles% SMI#
CPU0 0.0% 0
CPU1 0.0% 0
CPU2 0.0% 0
CPU3 0.0% 0
120.002927948 seconds time elapsed
Nezpracované hodnoty se také můžete podívat pomocí:
# perf stat -a -A --smi-cost --metric-only -- sleep 120
Z toho můžete vypočítat, kolik času průměrně zabere SMI na vašem počítači. (rozdíl cyklů rozdílem počtu cyklů za časovou jednotku).
Určitě má smysl překontrolovat výsledky založené na počítadle CPU s empirickými.
Můžete použít Linux Hardware Latency Detector, který je integrován v linuxovém jádře. Příklad použití:
# echo hwlat > /sys/kernel/debug/tracing/current_tracer
# echo 1 > /sys/kernel/debug/tracing/tracing_thresh
# watch -d -n 5 cat /sys/kernel/debug/tracing/tracing_max_latency
# echo "Don't forget to disable it again"
# echo nop > /sys/kernel/debug/tracing/current_tracer
Tyto nástroje jsou dostupné na CentOS/RHEL 7 a měly by být dostupné i na jiných distribucích.
Ohledně číselných hodnot:Nedávno jsem narazil na server HP ProLiant Gen8 Xeon z roku 2011, který odpaluje 504 SMI za minutu. Perf vypočítá rychlost 0,1 % v SMM a na základě hodnot čítače je průměrná doba strávená v SMI až několik mikrosekund – ale linuxový hwlat detektor na tomto systému nedetekuje tak vysoká přerušení.
Tato míra SMI odpovídá tomu, co HP dokumentuje ve svém průvodci Konfigurace a ladění serverů HPE ProLiant pro aplikace s nízkou latencí (říjen, 2017):
Zakázání přerušení správy systému na procesoru poskytuje jednu z největších výhod pro prostředí s nízkou latencí. Zakázání monitorování výkonu a využití procesoru SMI má největší účinek, protože generuje přerušení procesoru osmkrát za sekundu na serverech G6 a novějších.
(důraz můj; a tato příručka také dokumentuje další zdroje SMI)
Na desce Supermicro s Intel Atom C3758 a mým systémem Intel NUC (i5-4250U) je započítáno přesně nula SMI.
Na notebooku Dell s procesorem Intel i7-6600U systém hlásí 8 SMI za minutu, ale počítadlo aperf je nižší než počítadlo (nezastavených) cyklů, což by se nemělo stávat.