GNU/Linux >> Znalost Linux >  >> Linux

Úvod do Linuxových přerušení a CPU SMP Affinity

Přerušení jsou signály, které přes IRQ (Interrupt Request Line) posílá hardware nebo software.

Přerušení umožňují zařízením, jako je klávesnice, sériové karty a paralelní porty, indikovat, že potřebují pozornost CPU.

Jakmile CPU obdrží požadavek na přerušení, CPU dočasně zastaví provádění běžícího programu a vyvolá speciální program nazvaný Interrupt Handler nebo ISR (Interrupt Service Rutine).

Rutinu Service Interrupt nebo Interrupt Handler lze nalézt v tabulce vektorů přerušení, která je umístěna na pevné adrese v paměti. Po ošetření přerušení CPU obnoví přerušený program.

Při spouštění systém identifikuje všechna zařízení a do tabulky přerušení se načtou příslušné obslužné rutiny přerušení.

Následují dva způsoby vyžádání pozornosti CPU:

  1. Na základě přerušení
  2. Na základě průzkumu

Všechny OS založené na Linuxu jsou řízeny přerušením.

Když stiskneme klávesu na klávesnici, klávesnice oznámí CPU, že byla stisknuta klávesa. Ale CPU může být zaneprázdněno zpracováním některých věcí z RAM, systémových hodin, síťové karty, může to být video nebo PCI sběrnice. V takovém případě Keyboard umístí napětí na linku IRQ přiřazenou tomuto hardwaru, zde v tomto případě [Keyboard]. Tato změna napětí slouží jako požadavek od zařízení, že zařízení má požadavek, který potřebuje zpracování.

/proc/interrupts Soubor

Na počítači se systémem Linux obsahuje soubor /proc/interrupts informace o používaných přerušeních a o tom, kolikrát byl procesor přerušen

# cat /proc/interrupts
           CPU0   CPU1  CPU2  CPU3
  0: 3710374484      0     0     0  IO-APIC-edge  timer
  1:         20      0     0     0  IO-APIC-edge  i8042
  6:          5      0     0     0  IO-APIC-edge  floppy
  7:          0      0     0     0  IO-APIC-edge  parport0
  8:          0      0     0     0  IO-APIC-edge  rtc
  9:          0      0     0     0  IO-APIC-level  acpi
 12:        240      0     0     0  IO-APIC-edge  i8042
 14:   11200026      0     0     0  IO-APIC-edge  ide0
 51:   61281329      0     0     0  IO-APIC-level  ioc0
 59:          1      0     0     0  IO-APIC-level  vmci
 67:   19386473      0     0     0  IO-APIC-level  eth0
 75:   94595340      0     0     0  IO-APIC-level  eth1
NMI:          0      0     0     0
LOC: 3737150067 3737142382 3737145101 3737144204
ERR:          0
MIS:          0

Ve výše uvedeném souboru:

  • První sloupec je číslo IRQ.
  • Druhý sloupec uvádí, kolikrát bylo jádro CPU přerušeno. Ve výše uvedeném příkladu je časovačem název přerušení [System clock] a 3710374484 je počet, kolikrát byl CPU0 přerušen. I8042 je řadič klávesnice, který ovládá PS/2 klávesnice a myš v PC.
  • Pro přerušení jako rtc [hodiny reálného času] CPU nebyl přerušen. RTC jsou přítomny v elektronických zařízeních pro sledování času.
  • NMI a LOC jsou ovladače používané v systému, které nejsou přístupné/konfigurované uživatelem.

Číslo IRQ určuje prioritu přerušení, které musí CPU zpracovat.

Malá hodnota čísla IRQ znamená vyšší prioritu.

Například pokud CPU obdrží přerušení od klávesnice a systémových hodin současně. CPU bude nejprve obsluhovat systémové hodiny, protože má číslo IRQ 0.

  • IRQ 0 — systémový časovač (nelze změnit);
  • IRQ 1 – ovladač klávesnice (nelze změnit)
  • IRQ 3 – řadič sériového portu pro sériový port 2 (sdílený se sériovým portem 4, pokud je k dispozici);
  • IRQ 4 – řadič sériového portu pro sériový port 1 (sdílený se sériovým portem 3, pokud je k dispozici);
  • IRQ 5 – paralelní porty 2 a 3 nebo zvuková karta;
  • IRQ 6 – řadič diskety;
  • IRQ 7 – paralelní port 1. Používá se pro tiskárny nebo pro jakýkoli paralelní port, pokud tiskárna není přítomna.

U zařízení, jako je joystick CPU, nečeká, až zařízení odešle přerušení. Vzhledem k tomu, že joystick používaný pro hraní her a pohyb joysticku bude rychlý, bude ideální použít dotazování a zkontrolovat, zda zařízení vyžaduje pozornost. Nevýhodou této metody je, že CPU se může dostat do zaneprázdněného čekání a mnohokrát kontrolovat zařízení.

V souvislosti s tím je také nezbytné správně zacházet se signály v Linuxu.

Hardwarová přerušení

Všechny výše uvedené scénáře jsou příklady hardwarových přerušení.

Hardwarová přerušení se dále dělí do dvou hlavních kategorií:

  1. Nemaskovatelná přerušení [NMI]:Jak název napovídá, tyto typy přerušení nemůže CPU ignorovat ani potlačit. MNI se odesílají po samostatné přerušovací lince a obecně se používají pro kritické hardwarové chyby, jako je chyba paměti, hardwarové pasti indikující selhání ventilátoru, selhání snímače teploty atd.
  2. Maskovatelná přerušení:Tato přerušení mohou být CPU ignorována nebo zpožděna. Registr masky přerušení maskuje přerušení spouštěná na externích pinech řadiče mezipaměti. Nastavení bitu zápisem 0 deaktivuje spouštění přerušení na pinu

Softwarová přerušení

Tato přerušení jsou generována, když CPU vykonává instrukci, která může způsobit výjimku v samotné CPU [ALU jednotce].

Například dělení čísla nulou, což není možné, povede k výjimce dělení nulou, což způsobí, že počítač opustí výpočet nebo zobrazí chybovou zprávu.

Soubor /proc/stat je také součástí souborového systému /proc, který obsahuje informace o statistikách jádra systému a také obsahuje informace o přerušení.

# cat /proc/stat
cpu  17028082 5536753 5081493 1735530500 42592308 90006 479750 0
cpu0 5769176 1170683 1495750 403368354 39406374 90006 284864 0
cpu1 3714389 1451937 1186134 444082258 1084780 0 64876 0
cpu2 3791544 1471013 1211868 443988514 1056981 0 64764 0
cpu3 3752971 1443119 1187740 444091373 1044172 0 65244 0
intr 417756956 --- Output Truncated

Řádek intr zobrazuje počet přerušení obsluhovaných od spuštění. První sloupec je součet všech obsluhovaných přerušení. Každý následující sloupec představuje součet pro konkrétní přerušení.

SMP_AFFINITY

Symetrický multiprocessing je zpracování programů více procesory.

smp_affinity soubor obsahuje hodnotu afinity přerušení pro číslo IRQ. Soubor smp_affinity spojený s každým číslem IRQ je uložen v souboru /proc/irq/IRQ_NUMBER/smp_affinity. Hodnota v souboru je uložena v hexadecimální bitové masce představující všechna jádra CPU v systému. smp_affinity funguje pro zařízení, která mají ovladače zařízení s povoleným IO-APIC.

Například položka smp_affinity pro ovladač Ethernet je zobrazena níže:

grep eth0 /proc/interrupts
67: 23834931 0 0 0 IO-APIC-level eth0

Číslo IRQ pro eth0 je 67 a odpovídající soubor smp_affinity se nachází na adrese:

cat /proc/irq/67/smp_affinity
00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001

Desetinný ekvivalent pro hodnotu „000000001“ je „1“. tj. Všechna přerušení související s ethernetovým ovladačem budou obsluhována CPU0.

Afinitu procesoru můžeme změnit ručně změnou hodnot v souboru smp_affinity pro konkrétní řadič nebo pomocí irqbalance.

Zůstatek IRQ

Irqbalance je linuxový nástroj, který distribuuje přerušení přes procesorová jádra ve vašem počítačovém systému, což pomáhá zlepšit výkon.

Cílem Irqbalance je najít rovnováhu mezi úsporou energie a optimálním výkonem.

Pokud irqbalance není na vašem systému nainstalován, nainstalujte jej pomocí yum, jak je znázorněno níže.

# rpm -qa | grep irqbalance
irqbalance-0.55-15.el5

# yum search irqbalance

# yum install irqbalance.x86_64

Spusťte službu irqbalance:

service irqbalance start

Následuje ukázkový výstup z počítače se systémem Linux, kde je nainstalována funkce irqbalance. Mohli jsme vidět, že přerušení jsou nyní distribuována mezi CPU.

# cat /proc/interrupts
           CPU0     CPU1      CPU2       CPU3
  0:  950901695        0         0          0  IO-APIC-edge  timer
  1:         13        0         0          0  IO-APIC-edge  i8042
  6:         96    10989       470          0  IO-APIC-edge  floppy
  7:          0        0         0          0  IO-APIC-edge  parport0
  8:          1        0         0          0  IO-APIC-edge  rtc
  9:          0        0         0          0  IO-APIC-level  acpi
 12:        109     1787         0          0  IO-APIC-edge  i8042
 15:         99 84813914         0          0  IO-APIC-edge  ide1
 51:      17371        0  46689970          0  IO-APIC-level  ioc0
 67:       1741        0         0  225409160  PCI-MSI  eth0
 83:          0        0         0          0  PCI-MSI  vmci
NMI:          0        0         0          0
LOC:  950902917  950903742  950901202  950901400
ERR:          0
MIS:          0

Irqbalance je zvláště užitečná na systémech s vícejádrovými procesory, protože přerušení obvykle obsluhuje pouze první jádro.


Linux
  1. Úvod do linuxových příkazů chgrp a newgrp

  2. Linux – Jak omezit proces na jedno jádro CPU v Linuxu?

  3. Načíst využití CPU a paměti jedním procesem v Linuxu?

  1. Jak se v Linuxu řeší přerušení?

  2. Jak omezit proces na jedno jádro CPU v Linuxu?

  3. Využití procesoru Linux a historie provádění procesů

  1. Jak linuxové jádro zpracovává přerušení

  2. Monitorování hostitelů Linux a Windows pomocí Glances

  3. Úvod do bpftrace pro Linux