Gargalo de E / S do Linux com movedores de dados


8

Eu tenho uma máquina de 24 núcleos com 94.6GiB de RAM executando o servidor Ubuntu 10.04. A caixa está apresentando um alto% de iowait, diferente de outro servidor que temos (4 núcleos) executando os mesmos tipos e quantidades de processos. Ambas as máquinas estão conectadas a um servidor de arquivos VNX Raid, a máquina de 24 núcleos por meio de 4 placas FC e a outra por meio de placas Ethernet de 2 gigabits. Atualmente, a máquina de 4 núcleos supera a de 24 núcleos, possui maior uso de CPU e% iowait mais baixo.

Em 9 dias de atividade, o% iowait fica em média em 16% e é rotineiramente acima de 30%. Na maioria das vezes, o uso da CPU é muito baixo, cerca de 5% (devido ao alto iowait). Há ampla memória livre.

Uma coisa que não entendo é por que todos os dados parecem passar pelo dispositivo sdc, em vez de passar diretamente pelos movedores de dados:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           6.11    0.39    0.75   16.01    0.00   76.74

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.00         0.00         0.00       1232          0
sdb               0.00         0.00         0.00       2960          0
sdc               1.53        43.71        44.54   36726612   37425026
dm-0              0.43        27.69         0.32   23269498     268696
dm-1              1.00         1.86         7.74    1566234    6500432
dm-2              0.96         1.72         5.97    1442482    5014376
dm-3              0.49         9.57         0.18    8040490     153272
dm-4              0.00         0.00         0.00       1794         24
dm-5              0.00         0.00         0.00        296          0

Outra peça do quebra-cabeça é que as tarefas frequentemente entram no modo de suspensão ininterrupta (na parte superior), provavelmente também devido à suspensão do io.

O que posso olhar para ajudar a diagnosticar o problema? Por que todos os dados estão passando por / dev / sdc? Isso é normal?

ATUALIZAR:

A conexão de rede e a capacidade de leitura / gravação do VNX foram descartadas como gargalos. Podemos atingir velocidades de 800 MB / s com as 4 NICs ligadas (round-robin). As placas Fibre Channel ainda não estão sendo usadas. O VNX é capaz de lidar com E / S (discos RAID6, 30x2TB 7.2kRPM por pool em dois pools (60 discos no total), cerca de 60% de leitura).

Ignore acima sobre dm e sdc, todos eles são discos internos e não fazem parte do problema.

Achamos que o problema pode estar nas montagens nfs ou TCP (temos de 5 montagens a 5 partições no VNX), mas não sabemos exatamente o que. Algum conselho?


Um pequeno ponto: nesse contexto, dmsignifica mapeador de dispositivo, não movedor de dados. Essa pergunta provavelmente seria muito melhor em Falha no servidor.
Michael Hampton

Você está usando NFSv4 ou NFSv3? O seu iowait está apenas nas conexões NFS ou você o obtém ao executar o dd para testar a velocidade do disco (supondo que você tenha feito isso)? Se sua espera estiver no NFS e você estiver usando o V4, tente o V3. O NFSv4 tem algum comportamento aleatório com altas cargas e recentemente tivemos que desativá-lo em toda a nossa rede.
Erik Aronesty

Respostas:


6

Primeiro de tudo, se suas CPUs (e caramba! São 24) que comem dados mais rapidamente do que o que pode fornecer o armazenamento de dados, então você obtém o iowait. É quando o kernel pausa um processo durante um bloqueio io (uma leitura muito lenta ou uma gravação de sincronização).
Portanto, verifique se o armazenamento pode fornecer taxa de transferência suficiente para 24 núcleos.

Por exemplo, vamos supor que seu armazenamento possa fornecer taxa de transferência de 500 MB / s, se você estiver conectado via linha 2 Gigabit Ethernet (bond), a rede já limitará a taxa de transferência máxima a algo em torno de 100-180 MB / s. Se o seu processo consumir dados na velocidade de 50 MB / se você executar 4 threads em sua máquina com 4 núcleos: 4 x 50 MB / s = 200 MB / s consumidos. Se a rede puder suportar 180 MB / s, você não terá muita latência e suas CPUs serão carregadas. A rede aqui é um pequeno gargalo.
Agora, se você dimensionar isso para até 24 núcleos e 24 threads, precisará de 1200 MB / s; mesmo se alterar a fiação para permitir essa taxa de transferência, seu sistema de armazenamento não fornecerá mais de 500 MB / s, isso se tornará um gargalo.

Quando se trata de esperar, gargalos podem estar em toda parte. Não apenas nas camadas físicas, mas também nos buffers de software e espaço do kernel. Realmente depende dos padrões de uso. Mas como os gargalos do software são muito mais difíceis de identificar, geralmente é preferível verificar o rendimento teórico do hardware antes de investigar as pilhas de software.

Como dito, um iowait ocorre quando um processo faz uma leitura e os dados levam tempo para chegar, ou quando faz uma gravação de sincronização e o reconhecimento da modificação de dados leva seu tempo. Durante uma gravação de sincronização, o processo entra em suspensão ininterrupta para que os dados não sejam corrompidos. Há uma ferramenta útil para ver qual chamada faz pendurar um processo: latencytop. Não é o único de seu tipo, mas você pode tentar.

Nota: para sua informação, dm significa mapeador de dispositivos e não movedores de dados.


1
Concordo plenamente (e sinto que é menos compreendido) que é importante manter um recurso de sistema / solução equilibrado. Mas também quero salientar que o IOWait também pode ser causado por uma alta taxa de E / S aleatória (seja um processo realizando muitas buscas ou muitos processos exigindo a busca de seus dados). Nesse caso, o IOWait pode ser alto sem que a largura de banda do IO seja o fator do problema.
Matthew Ife

@ MIfe Você está totalmente certo sobre isso. Também comecei a mencionar esse aspecto quando apontei para inspecionar a camada de software. Se o canal for grande o suficiente entre o armazenamento de hardware e os processos de hardware, o problema estará nas pilhas de software, desde buffers TCP (exemplo no espaço do kernel) até acesso aleatório a dados simultaneamente (exemplo no espaço do usuário). E isso é muito mais difícil de identificar.
Huygens

5

Primeiro de tudo, inferno santo, isso é muito ferro! :)

Infelizmente, como sua configuração parece muito complexa, acho que ninguém será capaz de fornecer imediatamente "Esse é o seu problema!" resposta, a menos que eles tenham feito algo com uma configuração extremamente semelhante ou idêntica e tenham encontrado o mesmo problema. Portanto, embora este texto seja rotulado por SU como uma "Resposta", você provavelmente deve considerá-lo mais como uma "Sugestão". E não posso colocar nos comentários porque são muitas palavras. : S

Sem o conhecimento de como o seu hardware é mapeado para os dispositivos, é difícil dizer por que a E / S está indo para um lugar e não para outro. Como você montou os dispositivos? Seus programas estão acessando os sd*dispositivos diretamente ou todos os seus sistemas de arquivos estão montados nos dmdispositivos e todos os acessos a arquivos ocorrem por lá?

Outras coisas que tenho que perguntar sobre:

  • Que tipo de RAID é esse? Se você está calculando bits de paridade com RAID5 ou RAID6, esperamos que isso seja resolvido pelo hardware do servidor RAID ... caso contrário, os servidores de processamento estão fazendo isso ... o que é subótimo e pode causar latência de E / S se feito em software.

  • Você isolou uma das principais diferenças entre os dois servidores em sua mensagem. Um está usando o canal de fibra e o outro está usando a Ethernet. O Fibre Channel deve fornecer melhor latência e largura de banda, mas talvez isso também seja um problema: se estiver fornecendo muita taxa de transferência, poderá estar deixando o servidor RAID muito ocupado ... e o congestionamento leva ao preenchimento de buffers / caches, o que aumenta a latência, o que causa maiores esperas de E / S.

É quase como se você pode ter um problema inchaço tampão com suas matrizes de disco - você sabe? Os controladores RAID de hardware normalmente têm uma grande quantidade de cache on-board, não têm? Assim, à medida que a E / S da mídia é enfileirada e os caches ficam cheios de páginas sujas, eventualmente tudo fica saturado (se o armazenamento mecânico não puder acompanhar a carga) e a latência navega pelo telhado ... certamente você pode produzir mais carga com 24 núcleos + FC do que com 4 núcleos + GbE :) Verifique o servidor RAID e veja como os discos estão ocupados ... muitas das "E / S" podem ser apenas pacotes de controle, etc. não tenho certeza de como o FC funciona, mas se for algo como TCP, você verá retransmissões se as latências forem muito altas.

Por exemplo, se você fizer uma pergunta por telefone e ela não responder por alguns segundos, você diz "Alô?" - os protocolos de rede (e o FC é apenas um protocolo de rede) fazem a mesma coisa, apenas em uma escala de tempo mais curta. Mas é claro que esse "alô?" é caro no contexto da rede porque adiciona ainda mais dados a um canal já congestionado.

Para finalizar, uma dica geral:

Ao depurar problemas de latência / E / S / espera / taxa de transferência, sempre meça . Meça em qualquer lugar. Meça no cabo, meça o que os programas estão fazendo, meça no final do processamento, meça no servidor RAID, etc. Não olhe apenas de uma perspectiva - tente considerar cada componente individual do sistema. responsável pelo processamento, leitura ou gravação de qualquer dado no pipeline. Desmonte uma transação ou uma unidade de trabalho discreta e disseca exatamente o caminho percorrido pelo seu hardware e meça em cada componente distinto para ver se há gargalos ou locais com latência indevida etc. Um amigo meu chamou isso de "peeling" back the onion ", e eu usei a frase desde então para me referir à tarefa de depurar um fluxo de dados.


2

Uma pequena adição. Você pode querer observar os ajustes de nível de bloco e os planejadores de E / S neste caso. Eu não estou tão familiarizado com o Ubuntu, mas há uma boa quantidade de botões de desempenho de armazenamento para ajustar. Isso definitivamente se aplica no caso de armazenamento e bancos de dados SAN.

  • Dê uma olhada no planejador de E / S do sistema . O CFQ é o padrão, mas noop e prazo são escolhas comuns para cargas de trabalho de banco de dados.
  • Consulte este link para outros parâmetros de ajuste que podem ajudar.
  • Você menciona NFS e bloqueia o armazenamento. Se bloco, quais sistemas de arquivos estão em uso? A espera de E / S parece uma situação de bloqueio de gravação a partir daqui. As barreiras de gravação estão ativadas? Remonte seus sistemas de arquivos com nobarrier. ( Dica para o Ubuntu )

Alguns links relevantes de falha do servidor ...

Linux - ajuste do controlador RAID de hardware do mundo real (scsi e cciss)


1

Obrigado a todos pelas idéias e sugestões. O problema estava relacionado a uma combinação de configuração de ligação Ethernet não ideal, combinada com um módulo de E / S com defeito no próprio VNX. A taxa de E / S agora está próxima de onde esperamos. É interessante notar que os testes de gravação e leitura de arquivos dd e os benchmarks iozone não foram capazes de detectar isso e puderam ler e escrever quase tão rápido quanto o esperado.


A EMC forneceu suporte / análise para ajudá-lo a chegar a esse conflito?
precisa saber é o seguinte

Sim. (mais personagens)
Benjamin

0

Editarei com mais informações em breve, mas primeiro gostaria de dizer que você não deve deixar a saída dm- * do iostat confundi-lo. O mapeador de dispositivos é um dispositivo intermediário no kernel, assim como md * (md0, md1 etc.), para que você realmente se preocupe apenas com os dispositivos subjacentes. Todos os dados que passam para seus discos passam por dm / md no caminho e os totais reais (bytes, segundos, etc.) são precisos, mas o utilitário é enganoso.

Além disso, é uma quantidade muito grande de memória. Coisas engraçadas começam a acontecer tão alto (eu mesmo corro 2x64s e 2x96s), especialmente se você tiver um processo que ocupa mais da metade da memória RAM. Leia este artigo para obter mais informações . O artigo menciona mysql, mas nota por favor que é nãoespecífico do mysql. Todo processo de software incorre em multas pelo acesso à memória de outro processador físico - pense que 48gb pertence a um processo, 48 a outro. O processo só pode pertencer a um processo e, para alcançar a outra memória de procs (depois que os seus 48 GB se esgotarem), ele deve decidir armazenar alguns dos seus 48 em troca ou pagar um preço enorme para chegar e sair do processo. memória de outro proc. O artigo sugere a execução de um comando numactl para forçar o software a não trocar e, em vez disso, pagar a penalidade. Pessoalmente, vejo melhorias maciças com isso. Em outras palavras - verifique se algumas de suas E / S serão trocadas! Use free -m (ou similar) para isso. Se você tiver bastante memória livre, mas uma quantidade não trivial de troca (digamos 10% mais), esse pode ser o seu problema.


0

Olhando para isso da perspectiva do armazenamento, você tem uma maneira de medir a latência de SCSI? O tempo de espera do SO io inclui várias coisas fora do controle do armazenamento, mas quando entro na minha caixa de armazenamento e vejo a latência de E / S às 2 ms, sei que, independentemente do que o servidor está recebendo internamente, os comandos scsi estão sendo respondidos rapidamente, e posso eliminar o armazenamento como uma variável.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.