GNU/Linux >> Linux Esercitazione >  >> Linux

Introduzione agli interrupt di Linux e all'affinità SMP della CPU

Gli interrupt sono segnali inviati tramite IRQ (Interrupt Request Line) da un hardware o software.

Gli interrupt consentono a dispositivi come tastiera, schede seriali e porte parallele di indicare che richiede l'attenzione della CPU.

Una volta che la CPU riceve la richiesta di interruzione, la CPU interromperà temporaneamente l'esecuzione del programma in esecuzione e invocherà un programma speciale chiamato Interrupt Handler o ISR (Interrupt Service Routine).

È possibile trovare la routine Interrupt Service o Interrupt Handler nella tabella Vettore di interrupt che si trova a un indirizzo fisso in memoria. Dopo che l'interrupt è stato gestito, la CPU riprende il programma interrotto.

Al momento dell'avvio, il sistema identifica tutti i dispositivi e i gestori di interrupt appropriati vengono caricati nella tabella degli interrupt.

I seguenti sono due modi per richiedere l'attenzione della CPU:

  1. Basato su interrupt
  2. Basato su polling

Tutti i sistemi operativi basati su Linux sono basati su interrupt.

Quando premiamo un tasto sulla tastiera, la tastiera dice alla CPU che è stato premuto un tasto. Ma la CPU può essere impegnata nell'elaborazione di alcune cose dalla RAM, dall'orologio di sistema, dalla scheda NIC, dal video o dal bus PCI. In tal caso, Keyboard pone una tensione sulla linea IRQ assegnata a quell'hardware, qui in questo caso [Keyboard]. Questa variazione di tensione funge da richiesta dal dispositivo che indica che il dispositivo ha una richiesta che deve essere elaborata.

/proc/interrupts File

Su una macchina Linux, il file /proc/interrupts contiene informazioni sugli interrupt in uso e quante volte il processore è stato interrotto

# 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

Nel file sopra:

  • La prima colonna è il numero IRQ.
  • La seconda colonna dice quante volte il core della CPU è stato interrotto. Nell'esempio precedente il timer è il nome dell'interrupt [Orologio di sistema] e 3710374484 è il numero di volte in cui la CPU0 è stata interrotta. I8042 è il controller della tastiera che controlla le tastiere e il mouse PS/2 nei PC.
  • Per interrupt come rtc [Real time clock] la CPU non è stata interrotta. Gli RTC sono presenti nei dispositivi elettronici per tenere traccia del tempo.
  • NMI e LOC sono driver utilizzati sul sistema che non sono accessibili/configurati dall'utente.

Il numero IRQ determina la priorità dell'interrupt che deve essere gestito dalla CPU.

Un piccolo valore del numero IRQ significa priorità più alta.

Ad esempio, se la CPU riceve contemporaneamente l'interrupt dalla tastiera e dall'orologio di sistema. La CPU servirà per prima l'orologio di sistema poiché ha il numero IRQ 0.

  • IRQ 0 — timer di sistema (non modificabile);
  • IRQ 1 — controller da tastiera (non modificabile)
  • IRQ 3 — controller della porta seriale per la porta seriale 2 (condivisa con la porta seriale 4, se presente);
  • IRQ 4 — controller della porta seriale per la porta seriale 1 (condivisa con la porta seriale 3, se presente);
  • IRQ 5:porta parallela 2 e 3 o scheda audio;
  • IRQ 6 — controller del floppy disk;
  • IRQ 7 — porta parallela 1. Viene utilizzata per le stampanti o per qualsiasi porta parallela se non è presente una stampante.

Per dispositivi come joystick, la CPU non attende che il dispositivo invii un interrupt. Poiché il joystick utilizzato per i giochi e il movimento del joystick sarà veloce, sarà l'ideale utilizzare il polling e verificare se il dispositivo ha bisogno di attenzione. Lo svantaggio di questo metodo è che la CPU può entrare in attesa, controllando il dispositivo molte volte.

In una nota correlata, è anche essenziale gestire correttamente i segnali in Linux.

Interruzioni hardware

Tutti gli scenari sopra discussi sono esempi di interrupt hardware.

Gli interrupt di processo sono ulteriormente classificati in due categorie principali:

  1. Interrupt non mascherabili [NMI]:come suggerisce il nome, questi tipi di interrupt non possono essere ignorati o soppressi dalla CPU. Gli MNI vengono inviati su una linea di interrupt separata ed è generalmente utilizzato per errori hardware critici come errori di memoria, trappole hardware che indicano guasto della ventola, guasto del sensore di temperatura ecc.
  2. Interrupt mascherabili:questi interrupt possono essere ignorati o ritardati dalla CPU. Il registro della maschera di interruzione maschera gli interrupt attivati ​​sui pin esterni del controller della cache. Impostando un bit scrivendo uno 0, disabilita l'attivazione dell'interrupt sul pin

Interruzioni software

Questi interrupt vengono generati quando la CPU esegue un'istruzione che può causare una condizione di eccezione nella CPU stessa [unità ALU].

Ad esempio, dividere un numero per zero che non è possibile, porterà all'eccezione di divisione per zero, facendo sì che il computer abbandoni il calcolo o visualizzi un messaggio di errore.

Il file /proc/stat è anche una parte del file system /proc, che contiene informazioni sulle statistiche del kernel di sistema, contiene anche alcune informazioni sugli interrupt.

# 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

La riga intr mostra il conteggio dell'interrupt servito dal momento dell'avvio. La prima colonna è il totale di tutti gli interrupt gestiti. Ogni colonna successiva è il totale di un particolare interrupt.

SMP_AFFINITY

La multielaborazione simmetrica è l'elaborazione di programmi da parte di più processori.

Il file smp_affinity contiene il valore di affinità dell'interrupt per un numero IRQ. Il file smp_affinity associato a ciascun numero IRQ è memorizzato nel file /proc/irq/IRQ_NUMBER/smp_affinity. Il valore nel file è memorizzato in una maschera di bit esadecimale che rappresenta tutti i core della CPU nel sistema. smp_affinity funziona per dispositivi con driver di dispositivo abilitati IO-APIC.

Ad esempio, la voce smp_affinity per il driver Ethernet è mostrata di seguito:

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

Il numero IRQ per eth0 è 67 e il file smp_affinity corrispondente si trova in:

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

L'equivalente decimale per il valore '000000001' è '1'. cioè Tutti gli interrupt relativi al driver Ethernet saranno serviti da CPU0.

Possiamo modificare manualmente l'affinità del processore modificando i valori nel file smp_affinity per un particolare controller o utilizzando irqbalance.

Saldo IRQ

Irqbalance è un'utilità Linux che distribuisce gli interrupt sui core del processore nel sistema del computer, contribuendo a migliorare le prestazioni.

L'obiettivo di Irqbalance è trovare un equilibrio tra risparmio energetico e prestazioni ottimali.

Se irqbalance non è installato sul tuo sistema, installalo usando yum come mostrato di seguito.

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

# yum search irqbalance

# yum install irqbalance.x86_64

Avvia il servizio irqbalance:

service irqbalance start

Quello che segue è un esempio di output da una macchina Linux in cui è installato irqbalance. Abbiamo potuto vedere che gli interrupt ora vengono distribuiti tra le 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 è particolarmente utile su sistemi con processori multi-core, poiché gli interrupt verranno generalmente gestiti solo dal primo core.


Linux
  1. Introduzione ai comandi Linux chgrp e newgrp

  2. Recuperare l'utilizzo della CPU e l'utilizzo della memoria di un singolo processo su Linux?

  3. Come viene gestito un interrupt in Linux?

  4. Come limitare un processo a un core della CPU in Linux?

  5. Utilizzo della CPU Linux e cronologia di esecuzione dei processi

Introduzione alla VPN ed ecco come usarla in Linux

Ottimizza automaticamente la velocità e la potenza della CPU con Auto-cpufreq in Linux

CPU Power Manager:controlla e gestisci la frequenza della CPU in Linux

Un'introduzione all'hashing e ai checksum in Linux

3 suggerimenti per il miglioramento delle prestazioni dei processi Linux con priorità e affinità

Introduzione al monitoraggio e all'ottimizzazione delle prestazioni di Linux