Desempenho insatisfatório do aplicativo no Windows Server 2008 R2

2

Eu tenho um aplicativo simples que ouve conexões TCP em uma porta específica e cria um novo thread para lidar com cada conexão. O aplicativo é escrito em c # .NET 4.0 e usa o objeto TCPListener para manipular as conexões de soquete subjacentes.

Eu também tenho uma ferramenta de teste de carga simples que cria uma conexão TCP para o meu serviço e, em seguida, desconecta. Eu posso configurá-lo para enviar milhares de solicitações ao mesmo tempo.

Portanto, se eu executar o aplicativo do servidor tcp no Windows Server 2003, posso enviar mais de 10.000 solicitações para ele sem que nenhuma delas falhe. Mas, quando eu executo no windows server 2008 R2, posso enviar apenas 2.000 sem falhas.

Aqui estão os resultados dos meus testes para o Windows Server 2008 R2 ...

D:\>EchoServerTest.exe -server server01 -port 8000 -connections 10000
Creating 10000 connections
All connections in progress
All connections complete in 20816ms
7252 established. 2748 failed.
Connection establishment errors
1693 - The semaphore timeout period has expired.
1055 - The remote computer refused the network connection.
Test Passed

Aqui estão os resultados dos meus testes para o Windows Server 2003 ...

D:\>EchoServerTest.exe -server server02 -port 8000 -connections 10000
Creating 10000 connections
All connections in progress
All connections complete in 3807ms
10000 established. 0 failed.
Connections reset
642 - An existing connection was forcibly closed by the remote host.
Test Passed

Dois sistemas operacionais diferentes, mas o mesmo código está sendo executado. Alguém tem alguma idéia sobre por que o desempenho é pior em 2008 R2?

Obrigado.

    
por Dan 19.10.2011 / 21:08

2 respostas

3

Eu descobri o que estava acontecendo e como consertar isso. O problema foi o esgotamento da porta TCP / IP. Aqui está a correção que resolveu o meu problema. (Encontrei as informações a seguir do link )

Aumenta o intervalo superior de portas efêmeras que são alocadas dinamicamente a conexões de soquete TCP / IP do cliente.

1) Inicie o Editor do Registro.

2) Procure e clique na seguinte chave no registro: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters

3) No menu Editar, clique em Novo, Valor DWORD e, em seguida, adicione o seguinte valor do Registro para aumentar o número de portas efêmeras que podem ser alocadas dinamicamente a clientes:

Nome do valor: MaxUserPort

Dados do valor: <Enter a decimal value between 5000 and 65534 here>

4) Feche o Editor do Registro.

Observação: você deve reiniciar o computador para que esta alteração entre em vigor.

Observação: o aumento do intervalo de portas efêmeras usadas para conexões TCP / IP do cliente consome a memória do kernel do Windows. Não aumente o limite superior dessa configuração para um valor maior do que o necessário para acomodar as conexões de soquete de aplicativo cliente para minimizar o consumo desnecessário da memória do kernel do Windows.

Agora posso enviar 20000 solicitações para a caixa 2008 R2 e recebo 0 falhas. Obrigado!

    
por 20.10.2011 / 16:31
0

O hardware dos dois sistemas é idêntico? Quando você testa, eles estão usando a mesma porta de rede? Pode ser uma porta ruim.

Isso poderia ser algo relacionado ao SNP (Scalable Networking Pack)? Se você não tiver o SNP aplicado em sua máquina 2k3, mas tiver instalado e com um driver NIC desatualizado na máquina 2k8, você poderá ter um desempenho ruim até que você atualize o driver ou desative o TCP Chimney Offload.

Adicionalmente, você poderia colocar algumas instruções de depuração de tempo em seu código para ajudar a determinar exatamente quais operações estão ou estão demorando mais em 2k8 - isso realmente ajudaria a determinar o que, no sistema operacional , o problema é.

    
por 19.10.2011 / 21:58