Pergunta

Eu tenho um aplicativo de servidor cliente que troca documentos XML pelos dados solicitados pelo cliente. Essencialmente, o usuário insere algumas restrições de pesquisa (atributos para corresponder) e o cliente se comunica com dois sistemas para recuperar os dados (alguns dados de um banco de dados e alguns dados dos servidores de arquivos).

Os dados retornados dos servidores de arquivos (arquivos de dados arquivados) são um pouco maiores que os metadados retornados do servidor e, correspondentemente, leva mais tempo para executar.

Os usuários me pediram para fornecer algumas métricas sobre quanto tempo leva para baixar os dados do arquivo e a taxa na qual eles estão sendo baixados (após o download).

O servidor cliente se comunica com E/S assíncrona e vários threads, por isso não posso apenas usar um timer de partida/parada para realizar isso.

Minha implementação atual funciona como tal:

  1. Registre os ticks atuais (este é um processo de longa execução, para que a resolução de carrapatos seja boa)
  2. Entregar a solicitação ao serviço da web de forma assíncrona.
  3. --- Espere ---
  4. Obtenha os ticks atuais
  5. Obtenha o tamanho do documento retornado (há alguma sobrecarga não explicada pelo envelope Soap, mas tudo bem, eu acho)
  6. Taxa = (tamanho do documento / 1024) / (ticks finais - start ticks) * ticks / segundo (eu deixei um objeto de tempo fazer isso)

No começo, pensei que esse método estava OK, mas tenho relatórios de usuários que a taxa é muito menor para amostras pequenas do que para amostras grandes e que as taxas variam muito ao longo de uma única execução.

Existe uma maneira melhor de calcular essa taxa que seria mais imune a isso? Faz sentido que a taxa seja maior para arquivos maiores, mas, nos testes, vejo 10-40x mais alto do que para um arquivo ter o tamanho, o que não faz sentido.

Foi útil?

Solução

A taxa de transferência medida na questão assume que o tempo de transferência é homogêneo. Não é. Há um custo de configuração no início da sessão que inclui o aperto de mão de 3 vias do TCP e o tempo do servidor necessário para produzir o resultado. Depois que a configuração é concluída, o restante é dominado principalmente pela taxa de transferência de rede.

Para cargas grandes, o tempo de configuração é uma pequena fração do tempo geral de transferência e, portanto, a taxa de transferência calculada se aproxima do que você esperaria. Para pequenas cargas úteis, o tempo medido é principalmente o tempo de configuração! Como resultado, a taxa de transferência calculada pode ser desativada por ordens de magnitude.

O que você pode fazer? Encontre uma maneira de soltar os componentes de configuração da equação.

  1. Se você conseguir uma notificação quando os dados começarem a chegar, poderá iniciar a contagem de ticks lá. Isso deve funcionar para todas, exceto as respostas mais curtas (onde o conteúdo se encaixa em um único pacote de rede.)

  2. Como alternativa, peça ao servidor um registro de data e hora à resposta antes de enviá -lo. Você pode usar isso como o horário de início, tomando cuidado para ajustar as diferenças de relógio entre as máquinas.

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