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

59

Eu estava sentindo que o Ubuntu estava ficando um pouco lento, e então eu fui ver os processos rodando nele, e encontrei um que estava usando algo como 50% da CPU chamado ksoftirqd/0 .

Alguém sabe o que esse processo faz, por que está usando tanto CPU e como torná-lo menos intensivo em CPU?

    
por dasen 17.10.2010 / 06:55

3 respostas

65

Seu computador se comunica com os dispositivos conectados a ele através 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 endereçar 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 terminar o serviço um antes do outro chegar. Isso pode acontecer quando uma placa de rede de alta velocidade recebe um grande número de pacotes em um curto período de tempo.

Como o sistema operacional não pode manipular os IRQs conforme eles chegam (porque eles chegam rápido demais um após o outro), o sistema operacional os enfileira para processamento posterior por um processo interno especial denominado ksoftirqd .

Se ksoftirqd estiver demorando mais do que uma pequena porcentagem de tempo de CPU, isso indica que a máquina está sob carga de interrupção pesada.

    
por Lucian Adrian Grijincu 17.10.2010 / 13:37
17

Na página man, ksoftirqd é um encadeamento de kernel por CPU que é executado quando a máquina está sob carga pesada de interrupção temporária.

Você pode ajustar as configurações um pouco, definindo qual cpu pega 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 tem 8 núcleos. Se eu quisesse usar apenas os núcleos 1, 3 e 4, eu 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, eu configurei qualquer cpu para poder pegar a interrupção 29 (eth0 no meu sistema 8-core) com:

sudo echo ff > /proc/irq/29/smp_affinity
    
por Eduardo Bezerra 13.07.2012 / 16:12
2

O ksoftirqd é um encadeamento de kernel por CPU que é executado quando a máquina está sob carga pesada de interrupção temporária. Portanto, ele não está comendo sua CPU, mas reduzindo sua carga de IRQ.

    
por akshatj 17.10.2010 / 12:37