Quantos Context Switches são “normais” (como uma função de núcleos de CPU (ou outros))?

33

Hi Overlords do Linux / UNIX,

Algum de vocês tem uma regra geral de quantas opções de contexto (por núcleo de processador) é Normal em um servidor Linux?

Minha faculdade aqui cresceu, e ele está vendo 16K em uma máquina x86_64 de 8 núcleos.

Aqui estão algumas estatísticas do sarface nos últimos dias ...

texto alternativo http://src.autonomy.net.au/imagebin/81895e338fae67d3d205c09db44a81e6-Picture_10.png

E para ver as estatísticas de criação do processo, aqui está uma visão logarítmica do mesmo gráfico ...

texto alternativo http://src.autonomy.net.au/imagebin/7481f7e52bead4effc90248fc23c72fe-Picture_11.png

E os 8 núcleos estão entediados até a morte ...

texto alternativo http://src.autonomy.net.au/imagebin/0e94326652e977fd74edcd840f94200f-Picture_12.png

CS vs IOwait (escala de x10000)

texto alternativo http://src.autonomy.net.au/imagebin/a52a2a8a120394849c0da4045933e306-Picture_13.png

Mais informações inúteis, caso alguém pergunte ...

  • O armazenamento no qual o servidor trabalha é uma SAN de 0,5 TB via FC
  • Há 8 GB de RAM, principalmente cache - sem troca.
por Xerxes 29.05.2009 / 03:45

5 respostas

24

Isso depende muito do tipo de aplicativo que você executa. Se você tem aplicativos que são muito fáceis de usar no WRT, você pode esperar ver grandes quantidades de mudança de contexto. Se a maioria de seus aplicativos ficar inativa e só acordar quando houver coisas acontecendo em um soquete, você poderá ver taxas baixas de troca de contexto.

Chamadas do sistema

Chamadas de sistema causam mudanças de contexto por sua própria natureza. Quando um processo faz uma chamada de sistema, ele basicamente diz ao kernel para assumir o ponto atual no tempo e memória para fazer coisas que o processo não é privilegiado para fazer, e retornar ao mesmo ponto quando estiver pronto.

Quando olhamos para a definição do syscall write (2) do Linux, isso fica muito claro:

NAME
       write - write to a file descriptor

SYNOPSIS
       #include 

       ssize_t write(int fd, const void *buf, size_t count);

DESCRIPTION
       write() writes up to count bytes from the buffer pointed buf to the file
       referred to by the file descriptor fd. [..]

RETURN VALUE
       On success, the  number of bytes written is returned (zero indicates
       nothing was written). On error, -1 is returned, and errno is set
       appropriately.
       [..]

Isso basicamente diz ao kernel para assumir a operação do processo, mover para count bytes, começando do endereço de memória apontado por *buf para o descritor de arquivo fd do processo atual e, em seguida, retornar para o processo e diga-lhe como foi.

Um bom exemplo para mostrar isso é o servidor de jogo dedicado para jogos baseados em Valve Source, hlds . link mostra um segundo valor de syscalls feito por uma única instância de um servidor de jogo que não tinha jogadores nele. Esse processo leva cerca de 3% do tempo de CPU em um Xeon X3220 (2.4Ghz), apenas para dar uma idéia do quanto isso é caro.

Multitarefas

Outra fonte de mudança de contexto pode ser processos que não fazem syscalls, mas precisam ser removidos de uma determinada CPU para abrir espaço para outros processos.

Uma boa maneira de visualizar isso é cpuburn . O cpuburn não faz nenhum syscalls em si, apenas faz a iteração da sua própria memória, por isso não deve causar nenhuma mudança de contexto.

Pegue uma máquina ociosa, inicie o vmstat e execute um burnMMX (ou qualquer teste diferente do pacote cpuburn) para cada núcleo de CPU que o sistema tiver. Você deve ter a utilização total do sistema até então, mas dificilmente haverá maior troca de contexto. Em seguida, tente iniciar mais alguns processos. Você verá que a taxa de troca de contexto aumenta à medida que os processos começam a competir pelos núcleos da CPU. A quantidade de comutação depende da relação processos / núcleo e da resolução multitarefa do seu kernel.

Leitura adicional

linfo.org tem uma boa descrição sobre quais opções de contexto e chamadas do sistema são. Wikipedia tem informações genéricas e uma boa coleção de links nas chamadas do Sistema.

    
por 31.05.2009 / 04:58
6

meu servidor web moderadamente carregado fica em torno de 100-150 switches por segundo na maioria das vezes, com picos em milhares.

As altas taxas de troca de contexto não são um problema, mas podem apontar o caminho para um problema mais significativo.

edit: Mudanças de contexto são um sintoma, não uma causa. O que você está tentando executar no servidor? Se você tiver uma máquina multiprocessador, convém tentar configurar a afinidade da CPU para os processos do servidor principal.

Como alternativa, se você estiver executando o X, tente descer no modo de console.

edite novamente: a 16k cs por segundo, cada cpu tem a média de dois comutadores por milissegundo - que é de metade a um sexto da fatia de tempo normal. Ele poderia estar executando muitos encadeamentos vinculados a E / S?

edite novamente os gráficos de postagem: certamente parece vinculado a E / S. o sistema está gastando a maior parte do tempo em SYS quando as alternâncias de contexto são altas?

edite mais uma vez: Alta iowait e sistema no último gráfico - eclipsando completamente o espaço do usuário. Você tem problemas de OI.
Qual cartão do FC você está usando?

edite: hmmm. alguma chance de obter alguns benchmarks em seu acesso SAN com bonnie ++ ou dbench durante deadtime? Eu estaria interessado em ver se eles têm resultados semelhantes.

edite: Pensei nisso no fim de semana e vi padrões de uso semelhantes quando Bonnie está fazendo a passagem "escreva um byte de cada vez". Isso pode explicar a grande quantidade de chaveamento, pois cada gravação exigiria um syscall separado.

    
por 29.05.2009 / 06:39
1

Estou mais inclinado a me preocupar com a taxa de ocupação da CPU do estado do sistema. Se estiver perto de 10% ou mais, isso significa que seu sistema operacional está gastando muito tempo fazendo as mudanças de contexto. Embora mover alguns processos para outra máquina seja muito mais lento, ele merece isso.

    
por 29.05.2009 / 08:23
0

Não há regra geral. Uma mudança de contexto é apenas a CPU passando do processamento de um thread para outro. Se você executar muitos processos (ou alguns altamente segmentados), verá mais switches. Felizmente, você não precisa se preocupar com quantas opções de contexto existem - o custo é pequeno e mais ou menos inevitável.

    
por 29.05.2009 / 04:02
0

Coisas como essa são as razões pelas quais você deve tentar manter as linhas de base de desempenho para seus servidores. Dessa forma, você pode comparar coisas que percebe de repente com coisas que você gravou no passado.

Dito isto, tenho servidores em execução (não muito ocupados, principalmente, servidores Oracle), que estão em torno de 2k com alguns picos de 4k. Para os meus servidores, isso é normal, para servidores de outras pessoas que podem ser muito baixos ou muito altos.

Até que ponto você pode voltar aos seus dados?

Que tipo de informação de CPU você pode nos dar?

    
por 29.05.2009 / 10:17