GNU/Linux >> Tutoriales Linux >  >> Linux

Introducción a las interrupciones de Linux y CPU SMP Affinity

Las interrupciones son señales que se envían a través de IRQ (línea de solicitud de interrupción) por un hardware o software.

Las interrupciones permiten que dispositivos como teclados, tarjetas seriales y puertos paralelos indiquen que necesitan atención de la CPU.

Una vez que la CPU recibe la solicitud de interrupción, la CPU detendrá temporalmente la ejecución del programa en ejecución e invocará un programa especial llamado Interrupt Handler o ISR (rutina de servicio de interrupción).

Se puede encontrar el servicio de interrupción o la rutina del controlador de interrupción en la tabla de vectores de interrupción que se encuentra en una dirección fija en la memoria. Después de que se maneja la interrupción, la CPU reanuda el programa interrumpido.

En el momento del arranque, el sistema identifica todos los dispositivos y los controladores de interrupciones apropiados se cargan en la tabla de interrupciones.

Las siguientes son dos formas de solicitar la atención de la CPU:

  1. Basado en interrupciones
  2. Basado en encuestas

Todos los sistemas operativos basados ​​en Linux están controlados por interrupciones.

Cuando presionamos una tecla en el teclado, los teclados le dicen a la CPU que se ha presionado una tecla. Pero la CPU puede estar ocupada procesando algunas cosas de la RAM, el reloj del sistema, la tarjeta NIC, puede ser un bus de video o PCI. En ese caso, Keyboard coloca un voltaje en la línea IRQ asignada a ese hardware, aquí en este caso [Keyboard]. Este cambio de voltaje sirve como una solicitud del dispositivo que indica que el dispositivo tiene una solicitud que necesita procesamiento.

/proc/archivo de interrupciones

En una máquina Linux, el archivo /proc/interrupts contiene información sobre las interrupciones en uso y cuántas veces se ha interrumpido el procesador

# 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

En el archivo anterior:

  • La primera columna es el número de IRQ.
  • La segunda columna indica cuántas veces se ha interrumpido el núcleo de la CPU. En el ejemplo anterior, el temporizador es el nombre de la interrupción [Reloj del sistema] y 3710374484 es la cantidad de veces que se ha interrumpido la CPU0. I8042 es un controlador de teclado que controla teclados y ratones PS/2 en PC.
  • Para interrupciones como rtc [reloj en tiempo real], la CPU no ha sido interrumpida. RTC están presentes en los dispositivos electrónicos para realizar un seguimiento del tiempo.
  • NMI y LOC son controladores utilizados en el sistema que no son accesibles/configurados por el usuario.

El número de IRQ determina la prioridad de la interrupción que debe manejar la CPU.

Un valor de número de IRQ pequeño significa mayor prioridad.

Por ejemplo, si la CPU recibe una interrupción del teclado y el reloj del sistema simultáneamente. La CPU atenderá el reloj del sistema primero ya que tiene el número 0 de IRQ.

  • IRQ 0:temporizador del sistema (no se puede cambiar);
  • IRQ 1:controlador de teclado (no se puede cambiar)
  • IRQ 3:controlador de puerto serie para el puerto serie 2 (compartido con el puerto serie 4, si está presente);
  • IRQ 4:controlador de puerto serie para el puerto serie 1 (compartido con el puerto serie 3, si está presente);
  • IRQ 5:puerto paralelo 2 y 3 o tarjeta de sonido;
  • IRQ 6:controlador de disquete;
  • IRQ 7:puerto paralelo 1. Se utiliza para impresoras o para cualquier puerto paralelo si no hay una impresora presente.

Para dispositivos como joystick, la CPU no espera a que el dispositivo envíe una interrupción. Dado que el Joystick se usa para juegos y el movimiento del joystick será rápido, será ideal usar el sondeo y verificar si el dispositivo necesita atención. La desventaja detrás de este método es que la CPU puede entrar en espera ocupada, verificando el dispositivo muchas veces.

En una nota relacionada, también es esencial manejar las señales correctamente en Linux.

Interrupciones de hardware

Todos los escenarios discutidos anteriormente son ejemplos de interrupciones de hardware.

Las interrupciones de hardware se clasifican además en dos categorías principales:

  1. Interrupciones no enmascarables [NMI]:como su nombre indica, la CPU no puede ignorar ni suprimir este tipo de interrupciones. Los MNI se envían a través de una línea de interrupción separada y generalmente se usan para errores críticos de hardware como errores de memoria, trampas de hardware que indican fallas en el ventilador, fallas en el sensor de temperatura, etc.
  2. Interrupciones enmascarables:estas interrupciones pueden ser ignoradas o retrasadas por la CPU. El registro de máscara de interrupción enmascara las interrupciones que se activan en los pines externos del controlador de caché. Al establecer un bit escribiendo un 0, se desactiva la activación de la interrupción en el pin

Interrupciones de software

Estas interrupciones se generan cuando la CPU ejecuta una instrucción que puede causar una condición de excepción en la propia CPU [unidad ALU].

Por ejemplo, dividir un número por cero que no es posible, conducirá a una excepción de división por cero, lo que hará que la computadora abandone el cálculo o muestre un mensaje de error.

El archivo /proc/stat también forma parte del sistema de archivos /proc, que tiene información sobre las estadísticas del kernel del sistema y también contiene información sobre interrupciones.

# 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 línea intr muestra el recuento de interrupciones atendidas desde el momento del arranque. La primera columna es el total de todas las interrupciones atendidas. Cada columna subsiguiente es el total de una interrupción en particular.

SMP_AFFINITY

El multiprocesamiento simétrico es el procesamiento de programas por múltiples procesadores.

El archivo smp_affinity contiene el valor de afinidad de interrupción para un número de IRQ. El archivo smp_affinity asociado con cada número de IRQ se almacena en el archivo /proc/irq/IRQ_NUMBER/smp_affinity. El valor en el archivo se almacena en máscara de bits hexadecimal que representa todos los núcleos de CPU en el sistema. smp_affinity funciona para dispositivos que tienen controladores de dispositivo habilitados para IO-APIC.

Por ejemplo, la entrada smp_affinity para el controlador Ethernet se muestra a continuación:

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

El número de IRQ para eth0 es 67 y el archivo smp_affinity correspondiente se encuentra en:

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

El equivalente decimal para el valor '000000001' es '1'. es decir, todas las interrupciones relacionadas con el controlador de Ethernet serán atendidas por la CPU0.

Podemos cambiar manualmente la afinidad del procesador cambiando los valores en el archivo smp_affinity para un controlador en particular o usando irqbalance.

Saldo de IRQ

Irqbalance es una utilidad de Linux que distribuye interrupciones en los núcleos del procesador en su sistema informático, lo que ayuda a mejorar el rendimiento.

El objetivo de Irqbalance es encontrar un equilibrio entre el ahorro de energía y un rendimiento óptimo.

Si irqbalance no está instalado en su sistema, instálelo usando yum como se muestra a continuación.

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

# yum search irqbalance

# yum install irqbalance.x86_64

Inicie el servicio irqbalance:

service irqbalance start

El siguiente es un resultado de muestra de una máquina Linux donde está instalado irqbalance. Pudimos ver que las interrupciones ahora se distribuyen entre las 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 es especialmente útil en sistemas con procesadores multinúcleo, ya que las interrupciones generalmente solo serán atendidas por el primer núcleo.


Linux
  1. Introducción a los comandos chgrp y newgrp de Linux

  2. Linux:¿cómo limitar un proceso a un núcleo de CPU en Linux?

  3. ¿Recuperar el uso de la CPU y el uso de la memoria de un solo proceso en Linux?

  4. ¿Cómo se maneja una interrupción en Linux?

  5. Uso de la CPU de Linux e historial de ejecución de procesos

Introducción a VPN y aquí está cómo usarlo en Linux

Optimice automáticamente la velocidad y la potencia de la CPU con Auto-cpufreq en Linux

CPU Power Manager:controle y administre la frecuencia de la CPU en Linux

Una introducción al hashing y las sumas de verificación en Linux

3 consejos para mejorar el rendimiento de los procesos de Linux con prioridad y afinidad

Introducción a la supervisión y el ajuste del rendimiento de Linux