Pergunta

Eu tenho um aplicativo de servidor que lida com clientes solicitações de maneira diferente.

Eu quero saber quantos usuários podem ser servidos com latência mínima, por isso fiz um aplicativo pequeno teste de estresse que simulam as solicitações de usuários; ao mesmo tempo, uma outra aplicação monitorizar a utilização de memória / CPU.

A ferramenta de teste de estresse cria enfiar a cada segundo, onde cada segmento representa um usuário. Se o teste de estresse não pode criar um novo segmento devido à falta de recursos que inicia uma nova instância da ferramenta de teste de estresse.

O problema é, cada thread escreve para o arquivo a latência para cada pedido e o número atual de threads em execução de modo que este causas problema I / O como após alguns minutos você tem um monte de tópicos que precisam gravar em disco também este comportamento não será exist no cenário real quanto o cliente só solicitar os dados.

Como posso superar este problema como eu quiser medir a latência máxima por usuário?

PS:

Algumas respostas dizer para rodar em máquina diferente de levar em consideração o ok latência da rede, este muito bem ser o meu teste de stress final, neste momento estou fazendo este teste no mesmo servidor para encontrar quantos usuários são suportados com latência mínima.

Foi útil?

Solução

Não é muito claro se esta é uma aplicação em rede ou não. Se ele está em rede, em seguida, você pode simplesmente escalar o teste de estresse por roubar área de trabalho de todos no fim de semana para executar o teste de estresse. Esta pode ser a maneira mais fácil para escalar o teste se é testes apenas um ad-hoc poucos.

No entanto, ele faz som como poderia haver algumas melhorias simples. Se isso é feito para ser um teste de estresse de longa duração, em vez de criar uma nova thread para cada solicitação, você pode criar um pool de threads para o trabalho a partir de (ou ainda mais fácil, use o pool de threads, que irá dimensionar automaticamente). Então você definiria um teste para ser dizer 2000 usuários, e girar até 2000 threads que martelo do servidor. Cada thread seria essencialmente em um loop que faz o teste, e repete.

Outro item que não está claro é se tudo que você está segmentos estão tentando compartilhar um único arquivo. Uma maneira de fazer isso menos de um gargalo seria a de manter a informação na memória até que o programa está sendo desligado. Ou girar um fio escritor, que é responsável pela gravação de arquivos, e tudo que você está outros tópicos dar-lhe informações. Se IO se obter backup, você está fio escritor vai simplesmente segurar na memória até IO está disponível, e você está segmentos de trabalho pode continuar a martelar o servidor no tempo médio. Basta ter em mente, que, devido à sincronização de segmentos envolvidos, isso pode não escala bem, então você pode querer para amortecer algumas entradas no segmento de trabalho e apenas sincronizar para o segmento escritor ficheiro uma vez a cada 100 pedidos. Eu não acho que isso vai ser um grande problema, uma vez que não soa como você está acompanhando nada mais do que o tempo de resposta.

Edit: Baseado no comentário Gostaria de sugerir tentar usar um único segmento de gerente você está a operações de IO neste caso. Todos vocês estão segmentos de trabalho, ao invés de escrever para arquivo, criar um objeto com o que os detalhes são, e passá-lo para uma fila para ser escrito para o arquivo. Para reduzir o tempo de bloqueio / desbloqueia, use uma fila dentro do segmento de trabalho, bem como, e apenas sincronizar a cada tantas vezes. Certifique-se de fazer bloqueio quando você está trocando a informação no tópico. Além disso, eu talvez ver o uso de memória uma vez que irá permitir que nada pendente para construir na memória. Se isso ainda está causando está io para o bloco, eu olharia para qualquer escrita menos, ou talvez sintonizando ou adicionando um disco rígido mais rápido.

Outras dicas

Se você está interessado na latência máxima por usuário, porque não basta recolher este na linha e quando parar o teste tem todos os segmentos escrever o nosso lá latência max. Você poderia fazer estatísticas, bem como, cálculo min / max / variância e número de fios / usuários em execução. Você não deve atualizar saída de tela também. se você tem medo de perda de dados, gravar os dados no disco com freqüência.

Threads são suboptimal fazer este teste para um aplicativo cliente / servidor. Tendo apenas um número limitado de núcleos, muito poucos dos tópicos realmente correm em paralelo, mas recebem seus timeslices. É muito melhor, e dá-lhe alguns números sobre latência de rede, bem como, para iniciar o seu programa em vários clientes. O software do servidor pode - se for capaz de fazê-lo -. Usá-lo de hardware como ele será no ajuste final, onde os clientes poderão correr em uma LAN ou WAN

Obviamente você vai ter um ambiente misto, como você não pode ter uma muitas máquinas clientes como usuários simulados, mas cenários como chamadas simultâneas de hardware independente vai aparecer em tal Stresstest como chamadas não são quasi serializado através timeslicing.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top