Por que o processo ksoftirqd / 0 está usando toda a minha CPU?

67

Eu estava sentindo que o Ubuntu estava um pouco lento, e depois fui ver os processos em execução nele, e encontrei um que usava algo como 50% da CPU chamada ksoftirqd/0.

Alguém sabe o que esse processo faz, por que está usando tanta CPU e como torná-la menos intensiva?

dasen
fonte

Respostas:

77

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 ksoftirqdestiver consumindo mais do que uma pequena porcentagem do tempo da CPU, isso indica que a máquina está sob forte carga de interrupção.

Lucian Adrian Grijincu
fonte
22

Na página de manual, ksoftirqdhá 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
Eduardo Bezerra
fonte
4

O ksoftirqd é um encadeamento do kernel por CPU que é executado quando a máquina está sob carga pesada de interrupção suave.

akshatj
fonte
11
Eu sei que é askubuntu.com, mas no Raspberry Pi é exatamente o oposto, o ksoftirqd está consumindo toda a CPU sob intensa carga de IRQ.
precisa
Pelo que entendi, o ksoftirqd processa softirqs adiados (quando não podem ser processados ​​com rapidez suficiente). Quando existem muitos softirqs e / ou consomem muito tempo da CPU para processar, o ksoftirqd consome muito tempo da CPU.
Pabouk