Serviço de rede do Windows de baixo atraso (alta capacidade de resposta)?

1

Eu escrevi um Serviço de Rede do Windows usando o C # que foi projetado para rodar em uma máquina com Windows 7. Ele foi projetado para lidar com várias solicitações em um único milissegundo, com as quais ele parece lidar na maior parte do tempo, sem atrasos.
Ocasionalmente, após alguns milhares de milissegundos, o servidor pode ter um longo atraso de até 40ms quando, durante o qual o cliente enviou tantos pacotes, mas não recebeu uma única resposta. De repente, o servidor será ativado e responderá a todas as solicitações em alguns milissegundos (o tempo de processamento de cada solicitação é de 0,1 ms). Como posso alterar meu código ou configurações de serviço do Windows para tornar o servidor mais responsivo? Seria melhor minimizar picos de longos atrasos (10 ms é suportável, < 5 é mais razoável, < 1ms é o objetivo), mas a regularidade dos atrasos também é uma preocupação.

Obrigado.

EDIT: A máquina do servidor em que estou testando tudo é um laptop com processador Core 2 Duo e armazenamento SSD

    
por user1585968 25.09.2013 / 08:12

1 resposta

3

Você está solicitando latências extremamente baixas e previsíveis de um idioma com um coletor de lixo. O GC irá pausar seu programa por X milissegundos a cada intervalo Y enquanto o encadeamento GC estiver sendo executado.

Você pode usar o Windows Performance Toolkit para verificar isso, se quiser.

Você pode ajustar um pouco o coletor de lixo com

GCSettings.LatencyMode = GCLatencyMode.LowLatency;

Mas ainda terá que ser executado eventualmente.

Esta é uma das razões pelas quais você não vê muitos jogos 3D de grande sucesso escritos em C #.

Ajuste o GC se quiser, mas acho que a melhor solução para esse tipo de aplicativo é mudar para código nativo.

Você também está executando o Windows 7, que é configurado para quantums de encadeamentos mais curtos do que um SO do servidor, o que significa que o contexto é alternado com mais frequência. (Ironicamente, isso é assim que a máquina se sente "mais rápida".)

Você pode mudar isso com a configuração ' Ajustar para melhor desempenho dos Serviços em Segundo Plano '. Essa é uma configuração de todo o sistema e é a configuração do Windows Server. O que ele faz é tornar o encadeamento do sistema mais longo, o que significa que os encadeamentos são executados muito antes de outra decisão de planejamento de encadeamento ser feita, o que significa menos opções de contexto. A idéia é que, com quantums de thread mais longos, um thread de servidor, uma vez selecionado para execução pelo agendador de thread, poderá continuar funcionando por mais tempo e ter uma melhor chance de terminar seu trabalho (ou seja, atendendo a uma solicitação do cliente) antes de ser interrompido / preempção por outro thread no sistema.

Finalmente, se nenhuma das opções acima ajudar, pode ser outra coisa. Neste ponto, você desejaria analisar o sistema com o Windows Performance Toolkit e descobrir que as intermitências de latência são causadas pelo driver da NIC, a plataforma de filtragem do Windows, algo na pilha de E / S ... quem sabe .

    
por 25.09.2013 / 14:58