Influência da execução do código do kernel para Load average in top?

1

Estou tentando testar a quantidade de CPU que o iptables usa para o NAT. Talvez seja mais correto dizer "a quantidade de CPU que o módulo do kernel netfilter" usa.

A abordagem que eu tomei foi tentar remover o sistema de todos os processos do espaço do usuário, executar o streaming e verificar o Load average no topo. Nesse caso, as médias de carga são muito baixas, como se o processador não estivesse sendo afetado pelo roteamento de pacotes.

No entanto, depois de ler um pouco sobre o que significa média de carga ( aqui ), parece que não t representa a utilização da CPU, mas o comprimento da fila de processos.

Do meu entendimento atual, a execução dos módulos do kernel não são tratados como processos, e é por isso que nunca serão listados na fila de processos.

Isso significa que a única maneira de detectar a sobrecarga da CPU pelo código do kernel é executá-lo com um código do espaço do usuário e ver o código do espaço do usuário falhar devido a não receber o tempo do processador?

Um exemplo simples para formular a pergunta. Se houvesse uma parte do código do kernel tendo um bug de 'espera ocupada', como você detectaria que é o kernel que está usando demais o cpu?

    
por TheMeaningfulEngineer 22.12.2014 / 11:31

1 resposta

1

Você pode adicionar suas próprias regras de rastreamento (usando a porta tcp não utilizada, por exemplo):

for table in $(</proc/net/ip_tables_names);do while
    read dsc nam foo ;do
        if [ "$dsc" == "Chain" ];then
            iptables -t $table -I $nam -p tcp --dport 8 -j LOG --log-prefix "start-${table}-${nam} "
            iptables -t $table -A $nam -p tcp --dport 8 -j LOG --log-prefix "end-${table}-${nam} "
          fi
      done < <(iptables -n -t $table -L)
  done

Quando as regras estiverem prontas, você poderá fazer uma conexão de outro lugar:

nc 192.168.1.31 8
(UNKNOWN) [192.168.1.31] 8 (?) : Connection refused

Então, dê uma olhada no seu kern.log :

Dec 22 12:15:33 localhost kernel: [4237698.275654] start-nat-PREROUTING IN=br0 OUT= PHYSIN=eth0 MAC=01...
Dec 22 12:15:33 localhost kernel: [4237698.275662] end-nat-PREROUTING IN=br0 OUT= PHYSIN=eth0 MAC=01...
Dec 22 12:15:33 localhost kernel: [4237698.275674] start-filter-INPUT IN=br0 OUT= PHYSIN=eth0 MAC=01...
Dec 22 12:15:33 localhost kernel: [4237698.275681] end-filter-INPUT IN=br0 OUT= PHYSIN=eth0 MAC=01...
Dec 22 12:15:33 localhost kernel: [4237698.275688] start-nat-INPUT IN=br0 OUT= PHYSIN=eth0 MAC=01...
Dec 22 12:15:33 localhost kernel: [4237698.275695] end-nat-INPUT IN=br0 OUT= PHYSIN=eth0 MAC=01...

Estas regras de teste podem ser removidas simplesmente:

iptables-save |
    sed -ne '/^\*/{s/^.//;h;};
             /dport 8 -j LOG/{G;s/^-A\(.*\)\n\(.*\)$/iptables -t  -D/;p}
    ' | sh
    
por 22.12.2014 / 12:22