PowerStore: Técnicas eficazes para avaliar o desempenho do storage array
Summary: Como avaliar o desempenho de um storage array usando abordagens e técnicas adequadas para medir e analisar o desempenho de um array.
Symptoms
O usuário está testando, comparando ou validando um novo array antes de entrar em operação e não acredita que o desempenho que está sendo alcançado seja aceitável.
Uma tendência comum é procurar abordagens de teste simples para validar o novo armazenamento. Embora o uso de testes simples possa fornecer um resultado positivo ou negativo, ele geralmente retrata uma visão atípica do desempenho do armazenamento, pois não reflete uma carga de trabalho de produção real.
Alguns dos testes simples que podem ser irrelevantes e desviar a atenção da carga de trabalho desejada são:
- Executando testes de gravação com thread único
- Uma cópia de um ou mais arquivos
- Consulte aqui
a explicação da Microsoft sobre os testes de cópia de arquivo.
- Consulte aqui
- Testando o desempenho arrastando e soltando arquivos (copiar e colar)
- Extrair/excluir/criar arquivos/pastas
- Usar métodos de teste que não refletem a carga de trabalho/ambiente
- Usando mecanismos de carga/cargas de trabalho síncronos em vez de assíncronos
Cause
Ao testar o desempenho de E/S de rede para um storage array ou servidor de arquivos, certifique-se de que os testes reflitam padrões reais de E/S do ambiente de processamento de dados. Testes simples, como tarefas de leitura ou gravação com thread único, podem ser tentadores, mas não fornecem testes de aceitação válidos. Esses testes não se comparam às atividades de vários usuários e aplicativos que acessam o armazenamento compartilhado.
Se o sistema de armazenamento for necessário para funções de leitura/gravação simples e sequenciais, o teste de thread único será apropriado para o teste de aceitação. No entanto, se o sistema precisar oferecer suporte a vários usuários e aplicativos com atividades simultâneas de leitura/gravação, o teste deverá refletir a carga de trabalho real dos negócios.
Resolution
- Teste usando variáveis semelhantes ao que será a carga de trabalho/ambiente real. Lembre-se de que a maioria das ferramentas são simuladores e nunca atingem 100% de uma verdadeira carga de trabalho de produção simulada.
- Se a carga de trabalho variar amplamente, considere fazer várias iterações de testes de leitura/gravação com diferentes tamanhos de bloco e padrões de acesso.
- Use operações ou testes com multithread e assíncronos para garantir recursos de desempenho paralelos ou simultâneos e garantir que o potencial geral agregado de throughput esteja sendo exercido.
- Considere e analise as referências de desempenho padrão do setor para o equipamento que está sendo avaliado em relação à carga de trabalho de produção de sua empresa.
- Evite fazer testes em sistemas de arquivos e/ou volumes vazios ou com pouca utilização de espaço. Se você não pré-alocar espaço nas cargas de trabalho de gravação, poderá ver latência devido à alocação instantânea de espaço durante o teste.
- Não se esqueça de testar a E/S de leitura, pois ela geralmente é a dominante das duas na maioria dos ambientes. Esteja atento à perda de pacotes/quadros na infraestrutura de rede durante o teste.
- Verifique se você está testando em vários dispositivos para simular um ambiente típico com muitos hosts ou clients. Por exemplo, no PowerStore, um bom número é 16 volumes. A contagem de volumes normalmente corresponde aos números de hosts ou clients usados (físicos ou virtuais); É aqui que a simultaneidade é alcançada.
Ferramentas e simuladores
de benchmarkingTenha em mente que a maioria das ferramentas são simuladores e provavelmente nunca conseguem simular 100% de uma carga de trabalho de produção verdadeira. Essas ferramentas de benchmarking são usadas para ter uma ideia de como o desempenho poderia, deveria ou seria em determinadas situações. A Dell não possui essas ferramentas e não é responsável por quaisquer problemas ou prejuízos que possam estar associados a elas.
Em qualquer situação de teste de desempenho, certifique-se de que as ferramentas com recursos assíncronos e multithread sejam usadas. Exemplos dessas ferramentas são:
- Testador de E/S flexível (FIO)
- Medidor de I/O
- Vdbench
(requer uma conta Oracle)
- Medidor NFSometer
(Somente Fedora/NFS)
- Checklist de desempenho do NAS da Intel
Evite os seguintes tipos de testes:
- Copiar e colar
- Arrastar e soltar
- Backup de file system único em disco
- Testes DD
- Rlarge
- Wlarge
- Mkfile
- Descompactando, extraindo e compactando
Additional Information
Uma profundidade de E/S baixa (ou não alta o suficiente) pode limitar sua taxa de transferência potencial, dependendo da situação. Portanto, sempre verifique se a profundidade de E/S é alta o suficiente para refletir ou emular os requisitos de simultaneidade de uma carga de trabalho. Uma profundidade de E/S muito baixa pode não usar corretamente o dispositivo em todo o seu potencial. Além disso, desconfie de uma profundidade de E/S muito alta, pois isso pode causar algumas filas significativas no dispositivo e, dependendo do tempo de serviço do dispositivo, pode haver tempos de resposta maiores como resultado. Isso pode refletir a aparência de um sistema sobrecarregado.
Para este teste, os números são significativamente menores quando há uma profundidade de E/S de um em comparação com uma profundidade de E/S de algo mais real, como 64. Tenha em mente que isso é com um all-flash-array e, portanto, esse conceito é visto em sua forma extrema, mas cada vez mais comum."
IOdepth=1" é de cerca de ~30.000 operações de entrada e saída por segundo (IOPS) em média para o teste.
"IOdepth=64" é de cerca de ~107.000 IOPS médio para o teste.
Como mencionado, o desempenho nivela a uma certa profundidade de E/S na maioria das configurações. Aqui, há um tamanho de fila de 512 e há apenas um pequeno aumento no IOPS de um tamanho de E/S de 64."
IOdepth=512" é cerca de ~146.000 IOPS médio para o teste.
Assíncrono vs Sincronização
Existem dois motores principais distintos que são usados. A mais popular e, de longe, a mais eficiente em termos de desempenho é a "E/S assíncrona". O tipo de mecanismo menos eficiente e menos eficiente é a E/S síncrona e normalmente é usado com aplicativos que têm requisitos rígidos de integridade e garantia de dados. A E/S síncrona também pode ser encontrada em tecnologias de replicação RPO (Recovery Point Objective, objetivo de ponto de recuperação) quase nulo. Em testes e análises comparativas de desempenho, do ponto de vista do host, assíncrono significa que uma confirmação não é necessária para uma única E/S a fim de solicitar a próxima E/S. Em cargas de trabalho síncronas, uma confirmação é necessária para uma E/S antes que a próxima seja emitida e uma confirmação (ACK) para cada E/S subsequente solicitada. Portanto, a E/S síncrona geralmente tem uma fila de 1 ou menos e nunca usa totalmente o recurso em todo o seu potencial. O acoplamento de operações síncronas com uma contagem de threads baixa ou única pode limitar severamente o potencial de desempenho, portanto, sempre verifique se você está fazendo testes assíncronos e, se estiver usando testes síncronos, certifique-se de empregar vários threads, a menos que o ambiente do aplicativo aponte explicitamente para não fazê-lo.
Async (Libaio - Linux nativo async) = 1 thread
Sync (E/S síncrona):
Contagem
de threadsOs tópicos são importantes. Os testes sempre devem ser feitos usando vários threads, especialmente em testes/cargas de trabalho síncronos. Isso é para tentar simular várias iterações de um trabalho/teste com base no comportamento do processo de um aplicativo corporativo. Vários threads associados à atividade simultânea são onde o throughput agregado de um sistema é alcançado. A maioria dos mecanismos assíncronos emprega vários threads, portanto, você não precisa se preocupar tanto com a contagem de threads. Sem ter threads suficientes durante cargas de trabalho síncronas, você pode limitar severamente o throughput potencial total de um teste de carga em relação a um sistema."
"Multithreaded" significa vários threads fazendo trabalho em paralelo. Por exemplo, se você tiver um único dispositivo que pode atender a 1.000 IOPS em uma carga de trabalho síncrona, o dispositivo terá um tempo de resposta de 1 ms sem uma fila (portanto, sem fila, tempo de serviço e tempo de resposta devem ser sinônimos). Obviamente, dispositivos com tempos de resposta de 1 ms podem fazer muito mais trabalho do que 1.000 IOPS, e isso é obtido empilhando vários threads ou fluxos paralelos da mesma carga de trabalho. Então, se você aumentar os threads (ou "coisas que fazem esse trabalho específico") para 10, agora você tem 10 threads individuais fazendo E/S para um dispositivo a 1 ms. Cada thread de carga de trabalho individual ainda está recebendo 1 ms, o que significa que cada thread ainda está atingindo apenas 1.000 IOPS, mas agora todo o "processo" ou "trabalho" que está sendo executado por esses vários threads está recebendo 10.000 IOPS.
Existem ferramentas e cargas de trabalho que podem atingir adequadamente os limites de um dispositivo com um único thread, e algumas precisam de mais. Em resumo, ao simular uma carga síncrona, você deseja ter o máximo possível de threads/trabalhadores/fluxos sem afetar o tempo de resposta geral. Há um ponto em que o aumento da contagem de threads deixa de ter um efeito positivo (quando o dispositivo fica 100% ocupado). Geralmente, com cargas de trabalho assíncronas, a contagem de threads é cuidada por padrão. Por exemplo, abaixo você ainda pode ver uma diferença entre 1 thread e 10 para uma carga de trabalho assíncrona, embora não significativa. A moral da história é que, com cargas de trabalho assíncronas, você não deve se preocupar tanto com threads.
Um único thread aqui pode alcançar 68.000 IOPS usando o mecanismo "libaio" (assíncrono).
Se você aumentar os threads (numjobs) para 10, ainda poderá ver um aumento no IOPS.
Quando se trata de cargas de trabalho síncronas, embora este seja um caso extremo, você pode ter dois fatores principais que tornam este um teste de mau desempenho, sendo a natureza síncrona.
enviar I/O-1, aguardar ACK, enviar I/O-2, aguardar ACK etc.E não ser capaz de empilhar vários threads para a mesma finalidade.
job1=enviar E/S-1 - job2=enviar E/S-1 - job3=enviar E/S-1..... job1=get ack, send I/O-2 - job2=get ack, send I/O-2 - job3= get ack, send I/O-2 etc.
Sinalizador direto
Largura de banda (MB/s) vs. throughput (IOPS)
Largura de banda (MB/s) — largura de banda é a medida de dados que você pode ajustar de uma só vez (ou dentro do intervalo X, geralmente "por segundo") em um tubo ou sistema. Isso significa que ele está medindo a quantidade de dados que você transferiu durante um período de tempo. Embora a largura de banda e o IOPS não sejam mutuamente exclusivos, você pode ter números maiores ou menores de largura de banda com a mesma quantidade de IOPS, tudo depende do tamanho do bloco. Lembre-se de que você não está medindo a velocidade com largura de banda, a velocidade é algo totalmente diferente e, embora afete a largura de banda, geralmente é algo que você não pode controlar com cargas de trabalho de largura de banda pesada. Portanto, se estiver testando a largura de banda, sempre use blocos maiores (dentro do razoável) para que seus dados por E/S sejam maiores do que se você estivesse testando IOPS, já que blocos maiores naturalmente levarão mais tempo para funcionar. Se, por exemplo, você quiser atingir 1 MB/s, mas estiver usando tamanhos de bloco de 8 KB, deverá enviar cerca de 125 IOPS para conseguir isso. No entanto, se você estivesse usando blocos de 512 KB, seriam necessárias apenas duas (2) IOPS.
(Se você mantivesse os 125 IOPS e ainda aumentasse o tamanho do bloco de 8 KB para 512 KB, agora você está enviando 64 MB/s!)
No entanto, como há mais dados em uma única E/S, geralmente leva mais tempo para "empacotar" essa E/S (localizar, agrupar e assim por diante). Portanto, os tempos de atendimento podem ser naturalmente maiores. Às vezes, você tem uma fila menor, então seus tempos de resposta, embora naturalmente mais altos, devem ser bastante próximos. Lembre-se de que, embora o tempo de resposta tenha um papel na largura de banda que você pode alcançar, o aumento na quantidade de dados que há por E/S geralmente supera qualquer ligeiro aumento no tempo de resposta (RT) por esse tipo de E/S. Como os tempos de resposta são maiores, você não quer que as cargas de trabalho de blocos grandes precisem ser aleatórias. Portanto, as cargas de trabalho de largura de banda tendem a ser sequenciais. Quando você introduz uma natureza aleatória em uma carga de trabalho de bloco grande, sua taxa de transferência de dados estável é consistentemente interrompida e você começa a sentir os efeitos dos tempos de resposta ligeiramente mais altos por E/S.
Throughput (IOPS) — o throughput/IOPS é a perspectiva mais comum com cargas de trabalho de blocos pequenos, especialmente à medida que se tornam mais aleatórias. Qualquer coisa acima de 32 KB-64 KB pode ser considerada um bloco grande. Com o throughput, os fatores mencionados acima são mais importantes (coisas como contagem de threads, sincronização ou assíncrona, tamanho da fila e assim por diante). Aqui você está tentando medir não quantos dados gerais você pode transferir durante o intervalo X, mas sim quantos pacotes individuais (solicitações de E/S) carregando esses dados você está tentando atender (a cada intervalo X). Ambientes como o OLTP (serviços bancários) pouco se importam com a quantidade de dados que podem transferir, pois o espaço ocupado pelos dados geralmente é pequeno. No entanto, esses pequenos conjuntos de dados podem estar ocupados e normalmente estão ocupados. Esses conjuntos de dados têm uma alta distorção (uma pequena quantidade de espaço é referenciada, mas variam agressiva e consistentemente). Os pacotes pequenos de dados geralmente contêm apenas solicitações para alterar/atualizar blocos com valores de string numéricos ou menores e, portanto, grandes pacotes de E/S não são necessários. No entanto, devido à natureza das transações e porque há muitas delas, queremos verificar se podemos acompanhar cada demanda individual. Normalmente, quanto menor o tamanho do bloco, mais IOPS você pode alcançar em um determinado cenário e, embora as cargas de trabalho de bloco pequeno estejam principalmente associadas ao acesso aleatório, você pode obter ainda mais throughput com cargas de trabalho sequenciais de blocos pequenos. No entanto, as cargas de trabalho sequenciais de blocos pequenos são específicas e não são tão comuns, portanto, teste esses cenários somente se seu ambiente exigir.