GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Einführung in Linux-Interrupts und CPU-SMP-Affinität

Interrupts sind Signale, die von einer Hardware oder Software über IRQ (Interrupt Request Line) gesendet werden.

Interrupts ermöglichen es Geräten wie Tastaturen, seriellen Karten und parallelen Ports anzuzeigen, dass sie CPU-Aufmerksamkeit benötigen.

Sobald die CPU die Interrupt-Anforderung erhält, stoppt die CPU vorübergehend die Ausführung des laufenden Programms und ruft ein spezielles Programm namens Interrupt Handler oder ISR (Interrupt Service Routine) auf.

Der Interrupt Service oder die Interrupt Handler Routine kann gefunden werden in der Interrupt-Vektortabelle, die sich an einer festen Adresse im Speicher befindet. Nachdem der Interrupt behandelt wurde, nimmt die CPU das unterbrochene Programm wieder auf.

Beim Booten identifiziert das System alle Geräte und entsprechende Interrupt-Handler werden in die Interrupt-Tabelle geladen.

Im Folgenden finden Sie zwei Möglichkeiten, die CPU-Aufmerksamkeit anzufordern:

  1. Unterbrechungsbasiert
  2. Abfragebasiert

Alle Linux-basierten Betriebssysteme sind interruptgesteuert.

Wenn wir eine Taste auf der Tastatur drücken, sagt die Tastatur der CPU, dass eine Taste gedrückt wurde. Aber die CPU kann damit beschäftigt sein, einige Dinge von RAM, Systemuhr, NIC-Karte, Video oder PCI-Bus zu verarbeiten. In diesem Fall legt Keyboard eine Spannung auf die IRQ-Leitung, die dieser Hardware zugewiesen ist, hier in diesem Fall [Keyboard]. Diese Spannungsänderung dient als Anfrage vom Gerät, die besagt, dass das Gerät eine Anfrage hat, die verarbeitet werden muss.

/proc/interrupts Datei

Auf einem Linux-Rechner enthält die Datei /proc/interrupts Informationen über die verwendeten Interrupts und wie oft der Prozessor unterbrochen wurde

# 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

In der obigen Datei:

  • Die erste Spalte ist die IRQ-Nummer.
  • Die zweite Spalte gibt an, wie oft der CPU-Kern unterbrochen wurde. Im obigen Beispiel ist der Timer der Interrupt-Name [Systemuhr] und 3710374484 ist die Anzahl der Unterbrechungen von CPU0. I8042 ist ein Tastatur-Controller, der PS/2-Tastaturen und -Mäuse in PCs steuert.
  • Für Interrupts wie rtc [Echtzeituhr] wurde die CPU nicht unterbrochen. RTC sind in elektronischen Geräten vorhanden, um die Zeit im Auge zu behalten.
  • NMI und LOC sind Treiber, die auf Systemen verwendet werden, auf die der Benutzer nicht zugreifen/die nicht vom Benutzer konfiguriert werden können.

Die IRQ-Nummer bestimmt die Priorität des Interrupts, der von der CPU behandelt werden muss.

Ein kleiner IRQ-Zahlenwert bedeutet höhere Priorität.

Zum Beispiel, wenn die CPU gleichzeitig einen Interrupt von der Tastatur und der Systemuhr empfängt. Die CPU bedient zuerst die Systemuhr, da sie die IRQ-Nummer 0 hat.

  • IRQ 0 – Systemtimer (kann nicht geändert werden);
  • IRQ 1 – Tastatur-Controller (kann nicht geändert werden)
  • IRQ 3 – Serieller Port-Controller für seriellen Port 2 (gemeinsam mit seriellem Port 4, falls vorhanden);
  • IRQ 4 – Serieller Port-Controller für seriellen Port 1 (gemeinsam mit seriellem Port 3, falls vorhanden);
  • IRQ 5 – Parallelanschluss 2 und 3 oder Soundkarte;
  • IRQ 6 – Diskettencontroller;
  • IRQ 7 – paralleler Anschluss 1. Wird für Drucker oder für jeden parallelen Anschluss verwendet, wenn kein Drucker vorhanden ist.

Bei Geräten wie Joysticks wartet die CPU nicht darauf, dass das Gerät einen Interrupt sendet. Da der Joystick für Spiele verwendet wird und die Bewegung des Joysticks schnell ist, ist es ideal, Abfragen zu verwenden und zu prüfen, ob das Gerät Aufmerksamkeit benötigt. Der Nachteil hinter dieser Methode ist, dass die CPU ins Warteschleifen geraten kann und das Gerät viele Male überprüft.

In diesem Zusammenhang ist es auch wichtig, die Signale unter Linux richtig zu handhaben.

Hardware-Interrupts

Alle oben besprochenen Szenarien sind Beispiele für Hardware-Interrupts.

Hardware-Interrupts werden weiter in zwei Hauptkategorien eingeteilt:

  1. Non-maskable interrupts [NMI]:Wie der Name schon sagt, können diese Arten von Interrupts von der CPU nicht ignoriert oder unterdrückt werden. MNIs werden über separate Interrupt-Leitungen gesendet und im Allgemeinen für kritische Hardwarefehler wie Speicherfehler, Hardware-Traps, die auf Lüfterfehler, Temperatursensorfehler usw. hinweisen, verwendet.
  2. Maskierbare Interrupts:Diese Interrupts können von der CPU ignoriert oder verzögert werden. Das Interrupt-Maskenregister maskiert die Interrupts, die an externen Pins des Cache-Controllers ausgelöst werden. Setzen eines Bits durch Schreiben einer 0, deaktiviert die Interrupt-Auslösung auf dem Pin

Software-Interrupts

Diese Interrupts werden generiert, wenn die CPU eine Anweisung ausführt, die eine Ausnahmebedingung in der CPU [ALU-Einheit] selbst verursachen kann.

Wenn Sie beispielsweise eine Zahl durch Null teilen, was nicht möglich ist, führt dies zu einer Ausnahme bei der Division durch Null, wodurch der Computer die Berechnung abbricht oder eine Fehlermeldung anzeigt.

Die Datei /proc/stat ist auch ein Dateiteil des /proc-Dateisystems, das Informationen über System-Kernel-Statistiken und einige Interrupt-Informationen enthält.

# 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

Die Zeile intr zeigt die Anzahl der seit dem Booten bedienten Interrupts. Die erste Spalte ist die Summe aller bedienten Interrupts. Jede nachfolgende Spalte ist die Summe für einen bestimmten Interrupt.

SMP_AFFINITY

Symmetric Multiprocessing ist die Verarbeitung von Programmen durch mehrere Prozessoren.

Die Datei smp_affinity enthält den Interrupt-Affinitätswert für eine IRQ-Nummer. Die jeder IRQ-Nummer zugeordnete smp_affinity-Datei wird in der Datei /proc/irq/IRQ_NUMBER/smp_affinity gespeichert. Der Wert in der Datei wird in hexadezimaler Bitmaske gespeichert, die alle CPU-Kerne im System darstellt. smp_affinity funktioniert für Geräte mit IO-APIC-fähigen Gerätetreibern.

Der smp_affinity-Eintrag für den Ethernet-Treiber wird beispielsweise unten gezeigt:

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

Die IRQ-Nummer für eth0 ist 67 und die entsprechende smp_affinity-Datei befindet sich unter:

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

Das Dezimaläquivalent für den Wert „000000001“ ist „1“. dh alle Interrupts, die sich auf den Ethernet-Treiber beziehen, werden von CPU0 bedient.

Wir können die Prozessoraffinität manuell ändern, indem wir die Werte in der Datei smp_affinity für einen bestimmten Controller ändern oder indem wir irqbalance verwenden.

IRQ-Saldo

Irqbalance ist ein Linux-Dienstprogramm, das Interrupts über die Prozessorkerne in Ihrem Computersystem verteilt, was zur Verbesserung der Leistung beiträgt.

Ziel von Irqbalance ist es, ein Gleichgewicht zwischen Energieeinsparung und optimaler Leistung zu finden.

Wenn irqbalance nicht auf Ihrem System installiert ist, installieren Sie es mit yum wie unten gezeigt.

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

# yum search irqbalance

# yum install irqbalance.x86_64

Starten Sie den irqbalance-Dienst:

service irqbalance start

Das Folgende ist eine Beispielausgabe einer Linux-Maschine, auf der irqbalance installiert ist. Wir konnten sehen, dass Interrupts jetzt zwischen CPUs verteilt werden.

# 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 ist besonders nützlich auf Systemen mit Mehrkernprozessoren, da Interrupts normalerweise nur vom ersten Kern bedient werden.


Linux
  1. Einführung in die Linux-Befehle chgrp und newgrp

  2. Linux – Wie beschränke ich einen Prozess auf einen CPU-Kern in Linux??

  3. CPU-Auslastung und Speicherauslastung eines einzelnen Prozesses unter Linux abrufen?

  4. Wie wird ein Interrupt in Linux behandelt?

  5. Wie beschränke ich einen Prozess auf einen CPU-Kern in Linux?

Einführung in VPN und hier erfahren Sie, wie Sie es unter Linux verwenden

Optimieren Sie automatisch die CPU-Geschwindigkeit und -Leistung mit Auto-cpufreq in Linux

CPU Power Manager – Steuerung und Verwaltung der CPU-Frequenz unter Linux

Eine Einführung in Hashing und Prüfsummen in Linux

3 Tipps zur Verbesserung der Linux-Prozessleistung mit Priorität und Affinität

Einführung in die Linux-Leistungsüberwachung und -optimierung