Isolando causa de maior uso da CPU no RHEL 6 vs RHEL 5

9

Atualmente, estou procurando mover nosso sistema do RHEL 5 para o RHEL 6, mas encontrei um problema inesperado com alto uso da CPU nas máquinas do RHEL 6. Parece que isso pode ser devido, pelo menos em parte, ao uso de select para fazer um sono interrompível. Veja um exemplo simples que mostra o comportamento:

#include <sys/select.h>

int main()
{
  timeval ts;
  for (unsigned int ii=0; ii<10000; ++ii) {
    ts.tv_sec = 0;
    ts.tv_usec = 1000;
    select(0, 0, 0, 0, &ts);
  }

  return 0;
}

Em uma máquina RHEL 5 ela permanecerá com 0% de uso da CPU, mas no mesmo hardware com RHEL 6 instalado usará cerca de 0,5% da CPU, portanto, quando 30 a 50 programas estiverem sendo executados usando select para executar um sono, consome desnecessariamente uma grande quantidade de CPU.

Eu abri um Bugzilla e tentei rodar o OProfile e ele simplesmente mostra 100% em main para o aplicação e pouco mais de 99% em poll_idle ao olhar para o kernel (eu tenho idle = poll set em minhas opções de grub para que tudo possa ser capturado).

Alguma outra idéia do que eu posso fazer para tentar isolar qual é a causa do maior uso da CPU?

UPDATE: encontrei a ferramenta perf e obtive a seguinte saída:

# Events: 23K cycles
#
# Overhead  Command        Shared Object                                Symbol
# ........  .......  ...................  ....................................
#
    13.11%  test_select_sma  [kernel.kallsyms]    [k] find_busiest_group
     5.88%  test_select_sma  [kernel.kallsyms]    [k] schedule
     5.00%  test_select_sma  [kernel.kallsyms]    [k] system_call
     3.77%  test_select_sma  [kernel.kallsyms]    [k] copy_to_user
     3.39%  test_select_sma  [kernel.kallsyms]    [k] update_curr
     3.22%  test_select_sma  ld-2.12.so           [.] _dl_sysinfo_int80
     2.83%  test_select_sma  [kernel.kallsyms]    [k] native_sched_clock
     2.72%  test_select_sma  [kernel.kallsyms]    [k] find_next_bit
     2.69%  test_select_sma  [kernel.kallsyms]    [k] cpumask_next_and
     2.58%  test_select_sma  [kernel.kallsyms]    [k] native_write_msr_safe
     2.47%  test_select_sma  [kernel.kallsyms]    [k] sched_clock_local
     2.39%  test_select_sma  [kernel.kallsyms]    [k] read_tsc
     2.26%  test_select_sma  [kernel.kallsyms]    [k] do_select
     2.13%  test_select_sma  [kernel.kallsyms]    [k] restore_nocheck

Parece que o uso mais alto da CPU é do agendador. Eu também usei o seguinte script bash para lançar 100 destes simultaneamente:

#!/bin/bash

for i in {1..100}
do
  ./test_select_small &
done

No RHEL 5, o uso da CPU fica próximo de 0%, mas no RHEL 6, há uma quantidade não trivial de uso da CPU no usuário e no sistema. Alguma idéia de como rastrear a verdadeira fonte disso e, esperamos, consertá-lo?

Eu também tentei este teste em uma versão atual do Arch Linux e no Ubuntu 11.10 e vi um comportamento similar, então isso parece ser algum tipo de problema no kernel e não apenas um problema do RHEL.

UPDATE2: Eu hesito um pouco em trazer isso porque sei que é um grande debate, mas eu testei um kernel com os patches do BFS no Ubuntu 11.10 e ele não mostrou o mesmo alto uso de CPU do sistema (cpu do usuário). o uso parecia quase o mesmo).

Existe algum teste que eu possa executar com cada um deles para testar se esse alto uso da CPU é apenas uma diferença na contabilização do uso da CPU que a faz parecer artificialmente alta? Ou se os ciclos reais da CPU estão sendo roubados pelo CFS?

UPDATE3: A análise feita envolvendo essa questão parece indicar que é algo relacionado ao scheduler, então eu criei um UPDATE4: adicionei mais algumas informações à outra pergunta .

UPDATE5: Adicionei alguns resultados à outra pergunta de uma forma mais simples teste que ainda demonstra o problema.

    
por Dave Johansen 24.04.2012 / 20:25

1 resposta

1

Você pergunta:

Is there some test I can run with each of them to test if this high CPU usage is just a difference in accounting of CPU usage that is making it look artificially high? Or if actual CPU cycles are being stolen by the CFS?

E se você executasse um teste de desempenho da CPU enquanto estava executando o programa test_select_small e verificasse se seu desempenho muda dependendo da versão do sistema operacional host?

Existem muitas opções: o conselho clássico é sempre "usar algo que represente o tipo de carga que você terá". Mas as crianças legais sempre usavam apenas povray

    
por 26.04.2012 / 09:51