Testando o sucesso de um algoritmo de congestionamento

3

Como você testa se um algoritmo de congestionamento específico está funcionando para você? Eu pergunto porque não é como se eu pudesse recriar facilmente uma carga de trabalho representativa para a maioria dos algoritmos.

Estou olhando para duas coisas, mas estou aberto a mais sugestões:

  • Os "segmentos retransmitidos" da saída de netstat -s

Meu pensamento atual é que o congestionamento pode resultar em pacotes perdidos em uma porcentagem do tempo, embora possa não haver uma relação 1: 1 entre um pacote sendo descartado e o servidor sendo notificado de um evento de congestionamento. correlação a ser desenhada se a mudança para um algoritmo resultasse em menos pacotes descartados.

Esta figura mostra segmentos que foram retransmitidos devido a congestionamento ou estão limitados a links com perdas? Se assim for (e eu estou pensando que pode ser o caso) que pode turvar as águas ainda mais ao ponto de não ser uma boa métrica para usar.

  • Existe uma métrica disponível para medir a idade média das conexões TCP?

Meu pensamento aqui é que as conexões TCP que terminam antes (sem um pico de erros e pacotes descartados) podem indicar que os dados estão sendo enviados com menos atraso.

    
por Bratchley 27.06.2014 / 19:39

2 respostas

1

Versão concisa:

Como apontado @ninjalj, o aplicativo de carga de trabalho provavelmente deve ser considerado a fonte autoritativa sobre se qualquer ajuste fornecido foi benéfico para o desempenho da carga de trabalho. Dependendo se seus requisitos são de latência ou apenas de taxa de transferência geral no sistema, você pode fazer o julgamento para determinar se as mudanças no comportamento atendem melhor aos seus requisitos de desempenho.

Nesse caso, estaria fazendo a alteração e percebendo se a latência geral do httpd diminuiu.

Versão mais longa com exemplos específicos:

Para elaborar, vou colocar isso em contexto. Vamos ver o Apache httpd . Você pode registrar a hora para concluir uma solicitação em microssegundos e o tamanho de cada solicitação usando as diretivas LogFormat e CustomLog . Por exemplo:

LogFormat "%h %m %D %b" perflog
CustomLog /var/log/httpd/performance.log perflog

Que produz uma saída semelhante a esta:

xxx.xxx.28.20 GET 41140 86
xxx.xxx.28.20 GET 34468 28
xxx.xxx.28.20 GET 47612 1434
xxx.xxx.28.20 GET 54860 868
xxx.xxx.28.20 POST 97055 6283
xxx.xxx.28.20 GET 33754 53
xxx.xxx.28.20 GET 68964 8416
xxx.xxx.28.20 GET 1143827 11528
xxx.xxx.28.20 GET 38055 61
xxx.xxx.64.208 HEAD 6255 -
xxx.xxx.28.20 GET 36922 142
xxx.xxx.28.20 GET 51871 5581

Vou me preocupar apenas com GET solicitações para isso:

root@xxxxxxvlp14 /tmp $ grep GET /var/log/httpd/performance.log > work.log
root@xxxxxxvlp14 /tmp $ sed -i 's/-$/0/g' work.log
root@xxxxxvlp14 /tmp $ 

(por qualquer motivo, httpd fornece um hífen em vez de um inteiro 0).

Podemos, então, programaticamente separá-lo:

#!/bin/bash

totalRequests=$(cat /tmp/work.log | wc -l )

totalTime=$(awk 'BEGIN{ count=0 } {count = count + $3} END { print count }' /tmp/work.log)
averageTime=$( printf "%.2f" $(bc -l <<< "$totalTime / $totalRequests "))
minTime=$(sort -nk 3 work.log | head -1 | awk '{print $3}')
maxTime=$(sort -rnk 3 work.log | head -1 | awk '{print $3}')

totalBytes=$(awk 'BEGIN{ count=0 } {count = count + $4} END { print count }' /tmp/work.log)
minBytes=$(sort -nk 4 work.log | head -1 | awk '{print $4}')
maxBytes=$(sort -rnk 4 work.log | head -1 | awk '{print $4}')

echo "Total Requests In Sample: $totalRequests"

echo

echo "Total Time Taken: $totalTime ms (average: $averageTime ms)"
echo "Longest Request: $maxTime ms"
echo "Shortest Request: $minTime ms"

echo

echo "Total Data Moved: $totalBytes bytes"
echo "Largest Request: $maxBytes bytes"
echo "Smallest Request: $minBytes bytes"

Por favor, nenhum comentário sobre o roteiro, é escrito para maior clareza, não eficiência. O acima produz o seguinte:

Total Requests In Sample: 207

Total Time Taken: 15138613 ms (average: 73133.40 ms)
Longest Request: 1143827 ms
Shortest Request: 1788 ms

Total Data Moved: 409825 bytes
Largest Request: 20476 bytes
Smallest Request: 0 bytes

Obviamente, o item acima ilustra por que é importante obter uma amostra longa. Os números estão corretos (o pedido de um minuto e meio era alguém gerando um relatório no formato Word que incluía imagens / gráficos, para os curiosos).

Assim, você convenceria o apache a fornecer uma amostra longa (provavelmente durante o dia inteiro) de atividade normal, fazer a alteração, girar os logs e começar a coletar registros novamente (por exemplo, aguardando por outro período de 24 horas) .

Cada serviço (NFS, outros servidores HTTP, Samba, servidores FTP, etc) terá sua própria maneira de coletar informações, mas geralmente haverá algum meio de registro de tempo e taxa de transferência.

    
por 28.06.2014 / 00:48
4

Does this figure show segments that were retransmitted due to congestion or is it limited to lossy links? If so (and I'm thinking it might be the case) that might muddy the waters even more to the point of this not being a good metric to use.

segments retransmitted in netstat -s inclui todas as retransmissões TCP do kernel por qualquer motivo, incluindo aquelas listadas na sua pergunta. Essas razões também podem incluir:

  • Erros de link
  • congestionamento do switch Ethernet
  • Host local cai devido a qos ou esgotamento de recursos
  • Host remoto cai (talvez devido a alguma forma de esgotamento de qos / recursos no host remoto)

Os engenheiros de teste de desempenho lidam rotineiramente com todas essas variáveis e garantem que possam medi-las adequadamente. Um dos primeiros testes que você deve fazer é garantir que o cabeamento / rede seja executado nos tamanhos de pacote e nas taxas de tráfego em questão. Isso normalmente é feito com um dispositivo de teste dedicado, como os da Ixia ou da Spirent.

Depois de realizar o desempenho de rede de referência, você está em condições de realizar o teste que está fazendo. Mesmo que a rede tenha sido testada como limpa, você ainda deve monitorar os erros / interrupções da interface do switch durante o teste TCP do host para garantir que eles não distorçam seus resultados.

Quanto às suas idéias sobre a criação de condições de congestionamento, você pode achar útil gerar intencionalmente o tráfego de fundo iperf UDP logo abaixo do limite de enfileiramento da classe qos antes de executar seu tráfego TCP. Se você achar que não pode saturar o link que possui, também poderá ser útil negociar o NIC até 1GE ou 100M.

Tudo isso pode parecer complicado e, de certa forma, talvez seja; no entanto, o teste do qos é totalmente factível com foco e visibilidade adequados a todos os componentes do sistema.

    
por 28.06.2014 / 22:49