Respostas:
Seu computador se comunica com os dispositivos conectados a ele por meio de IRQs (solicitações de interrupção). Quando uma interrupção vem de um dispositivo, o sistema operacional pausa o que estava fazendo e começa a resolver essa interrupção.
Em algumas situações, os IRQs são muito rápidos, um após o outro, e o sistema operacional não pode concluir a manutenção de um antes que outro chegue. Isso pode acontecer quando uma placa de rede de alta velocidade recebe um número muito grande de pacotes em um curto espaço de tempo.
Como o sistema operacional não pode lidar com IRQs quando eles chegam (porque chegam muito rápido um após o outro), o sistema operacional os coloca na fila para processamento posterior por um processo interno especial chamado ksoftirqd
.
Se ksoftirqd
estiver consumindo mais do que uma pequena porcentagem do tempo da CPU, isso indica que a máquina está sob forte carga de interrupção.
Na página de manual, ksoftirqd
há um thread de kernel por CPU que é executado quando a máquina está sob carga pesada de interrupção suave.
Você pode ajustar um pouco as configurações, definindo qual cpu capta uma certa interrupção. Você faz isso alterando o conteúdo de /proc/irq/$interrupt_number/smp_affinity
. Você pode obter uma lista de interrupções e seu significado fazendo:
cat /proc/interrupts
O número em smp_affinity
é um bitmap de cpus, representado em código hexadecimal. O bit mais à direita é o menos significativo. Por exemplo, meu sistema possui 8 núcleos. Se eu quisesse usar apenas os núcleos 1, 3 e 4, definiria o smp_affinity como 1a
:
cpu_7 cpu_6 cpu_5 cpu_4 cpu_3 cpu_2 cpu_1 cpu_0
0 0 0 1 1 0 1 0 = 0001 1010 = 1a (in hex)
Pessoalmente, configurei qualquer CPU para poder receber a interrupção 29 (eth0 no meu sistema de 8 núcleos) com:
sudo echo ff > /proc/irq/29/smp_affinity
O ksoftirqd é um encadeamento do kernel por CPU que é executado quando a máquina está sob carga pesada de interrupção suave.