Estou usando o Powershell para extrair dados do Exchange via API EWS.
Import-Module "C:\ews_api\Microsoft.Exchange.WebServices.dll"
$ExchangeServer = 'EXCHANGE'
$ExchangeService = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013_SP1)
$ExchangeService.Url = "https://$ExchangeServer/ews/exchange.asmx"
$SearchRootFolder = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar)
$SearchFolderView = New-Object Microsoft.Exchange.WebServices.Data.FolderView([int]::MaxValue)
$SearchResult = $ExchangeService.FindFolders($SearchRootFolder, $SearchFolderView)
A execução da última linha de código causará uma conexão HTTP com o servidor Exchange, que será deixado no estado TCP TIME_WAIT
por 2 minutos com as configurações padrão do Windows. Atingir o servidor Exchange com muitas consultas resultará na TIME_WAIT
existência de muitas sessões ao mesmo tempo.
Get-NetTCPConnection | Group-Object State
Count Name
----- ----
28 Listen
10 Bound
5 Established
6 CloseWait
189 TimeWait
Parece haver um limite em torno de 190 TIME_WAIT
sessões no Windows, porque em torno dessa marca estou recebendo o seguinte erro no Powershell.
Microsoft.Exchange.WebServices.Data.ServiceRequestException: The request failed. Unable to connect to the remote server
---> System.Net.WebException: Unable to connect to the remote server
---> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted 10.50.222.87:443
Achei que o Windows poderia alocar muito mais portas efêmeras do que para sessões TCP. E, de fato, ao usar outro exemplo de código Powershell, não tenho problemas.
$connections = @()
for ($i = 0; $i -lt 1000; $i++) {
$connections += [System.Net.Sockets.TcpClient]::new($ExchangeServer, 443)
}
Mil conexões são abertas sem problemas. No entanto, eles estão no estado TCP ESTABLISHED
e não no estado TIME_WAIT
. Por que estou enfrentando esse problema apenas em TIME_WAIT
estados de sessão e existe uma maneira de aumentar esse limite?
Get-NetTCPConnection | Group-Object State
Count Name
----- ----
28 Listen
1010 Bound
1003 Established
8 CloseWait
Não consigo encontrar nenhuma documentação sobre esse limite, mas você pode modificar a quantidade de tempo que um soquete permanece no estado TIME_WAIT:
https://learn.microsoft.com/en-us/biztalk/technical-guides/settings-that-can-be-modified-to-improve-network-performance
Na verdade, o artigo recomenda reduzi-lo do padrão (120) para 30 segundos para melhorar o desempenho da rede:
Não consegui reproduzir o problema em uma nova instalação do Windows Server 2022. Primeiro pensei que estivesse relacionado a alguma configuração de Política de Grupo, mas não foi o caso.
Desde então, descobri que algo mais estava limitando as portas que podem ser alocadas por usuário. No nosso caso foi o
Palo Alto Networks Terminal Server Agent
. Este agente é responsável por identificar usuários em servidores de terminal para que as regras de firewall possam ser aplicadas a cada usuário.O efeito colateral infeliz disso foi que as portas por usuário são limitadas. Para mim a solução é usar outro servidor onde este agente não esteja presente.