Aumento de throughput de rede e Window Auto-Tunning

Quando se utiliza TCP para transferência de dados, os dois factores mais importante são o TCP window size e latência de round trip; se conhecermos ambos os valores é possível calcular o máximo throughput possível durante uma transferência de dados entre dois hosts, independentemente da largura de banda disponível. Neste post vamos aprender a optimizar o throughput de uma rede.

A seguinte fórmula permite calcular o throughput de TCP:

TCP-Window-Size-em-bits / Latência-em-segundos = Throughput-em-bits-por-segundo

Podemos observar este cálculo através de um exemplo simples. Se tivermos um link Ethernet a 1Gig que liga Lisboa ao Porto, com uma latência de round trip de 30 milisegundos e tentarmos transferir um ficheiro de grande dimensão - de um servidor em Lisboa para um servidor no Porto - usando FTP, qual é o melhor throughput que posso esperar?

 

clip_image002

Primeiro vamos converter a TCP window size de bytes para bits. Neste caso estamos a utilizar o tamanho standard numa máquina Windows de 64KB como TCP window size:

64KB = 65536 Bytes. 65536 * 8 = 524288 bits

 De seguida, vamos usar o valor em bits e dividir pela latência de round trip do link em segundos. Portanto, se a nossa latência é de 30 milisegundos vamos usar 0.030 nos nossos cálculos:

524288 bits / 0.030 segundos = 17476266 de throughput em bits por segundo = 17.4 Mbps de throughput máximo

Podemos verificar que embora eu tenha um link de 1GE entre estas duas localizações, não devo esperar mais do que 17Mbps quando estiver a fazer transferências de ficheiros entre estes dois servidores, tendo em conta os valores de TCP window size e latência.

Questão: o que posso fazer para tornar as transferências mais rápidas? R: Aumentar o TCP window size e/ou reduzir a latência.

Para aumentar o TCP window size podemos fazer ajustes manuais em cada um dos servidores, para negociar um window size maior, mas isso leva-nos a uma outra questão: qual o valor de TCP Windows Size que deve ser usado? Podemos usar o inverso dos cálculos anteriores para determinar o TCP window size ideal.

A fórmula para calcular o TCP window size ideal é a seguinte:

Bandwidth-em-bits-por-second * Latência-em-segundos-de-Round-trip = TCP-Window-Size-em-bits / 8 = TCP window size em bytes

No nosso exemplo os cálculos seriam feitos da seguinte forma:

1,000,000,000 bps * 0.030 seconds = 30,000,000 bits / 8 = 3,750,000 Bytes

 Portanto, se tivermos configurado os nossos servidores para um TCP window size de 3750KB, a nossa transferência vai ser capaz de atingir o throughput de 1Gbps:

 

clip_image004

Um dos contras em aumentar a TCP window size nos nossos servidores é que necessitamos de mais memória no servidor para buffering, dado que toda a informação que ainda não foi acknowledged pelo outro servidor tem de ser mantida em memória para a eventualidade de ser necessário retransmiti-la.

Um outro problema é a performance (ironicamente) quando existe perca de pacotes, porque qualquer pacote perdido de uma determinada window vai requerer o reenvio de toda a window – a não ser que a stack TCP/IP no servidor esteja configurada para “selective acknowledgments”.

No caso dos sistemas operativos Microsoft, os “selective acknowledgments” são suportados e podemos tirar partido desta funcionalidade para ultrapassar os problemas de performance acima mencionados.

Se pretendermos calcular a latência máxima para conseguir atingir um determinado throughput podemos utilizar uma outra fórmula; para atingir 10Gbps de throughput entre dois servidores utilizando TCP window sizes de 64KB a fórmula seria a seguinte:

TCP-window-size-em-bits / Throughput-desejado-em-bits-por-segundo = Latência Máxima de RTT

524288 bits / 10,000,000,000 bits por segundo = 52.4 micro-segundos

Apesar de ser possível ajustar manualmente todos estes valores, podemos utilizar a funcionalidade “Window Auto-Tunning”, disponível desde o Windows Vista/Windows 2008, que se encarrega de automaticamente optimizar todos estes valores discutidos anteriormente.

Esta funcionalidade baseia-se na RFC 1323 onde é definido o window scalling como algo que permite ao enpoint de destino anunciar um window size maior que 65,535 bytes. Desta forma conseguimos ter window sizesde dimensão superior e assim tirar proveito de links com maiores velocidades de transmissão.

Sempre que esta funcionalidade está activa é feito o cálculo do window size ideal, ao medir o throughput do link e ajustando automaticamente o window size durante a transmissão de dados que estejam a ocorrer na altura.

O “Receive Window Auto-Tuning” activa o TCP window scaling por pré-definição, permitindo assim um window size com um máximo de 16MB.

A partir do Windows Vista/Windows 2008 a stack de TCP/IP deixou de utilizar o parâmetro de registry “TCPWindowSize".

Podem encontrar informação adicional sobre “Receive Window Auto-Tuning” neste link:

https://technet.microsoft.com/en-us/magazine/2007.01.cableguy.aspx

A equipa de Suporte,

SF