Escenario: Tenemos varios clientes de Windows que cargan regularmente archivos grandes (FTP / SVN / HTTP PUT / SCP) a servidores Linux que están a ~ 100-160 ms de distancia. Tenemos un ancho de banda síncrono de 1 Gbit / s en la oficina y los servidores son instancias de AWS o están físicamente alojados en DC de EE. UU.
El informe inicial fue que las cargas a una nueva instancia de servidor fueron mucho más lentas de lo que podrían ser. Esto se confirmó en las pruebas y desde múltiples ubicaciones; los clientes estaban viendo de 2 a 5 Mbit / s estables al host desde sus sistemas Windows.
Estallé iperf -s
en una instancia de AWS y luego de un cliente de Windows en la oficina:
iperf -c 1.2.3.4
[ 5] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 55185
[ 5] 0.0-10.0 sec 6.55 MBytes 5.48 Mbits/sec
iperf -w1M -c 1.2.3.4
[ 4] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 55239
[ 4] 0.0-18.3 sec 196 MBytes 89.6 Mbits/sec
La última cifra puede variar significativamente en las pruebas posteriores, (Vagaries of AWS), pero generalmente está entre 70 y 130Mbit / s, que es más que suficiente para nuestras necesidades. Wiresharking la sesión, puedo ver:
iperf -c
Windows SYN - Ventana 64kb, Escala 1 - Linux SYN, ACK: Ventana 14kb, Escala: 9 (* 512)iperf -c -w1M
Windows SYN - Windows 64kb, Escala 1 - Linux SYN, ACK: Ventana 14kb, Escala: 9
Claramente, el enlace puede mantener este alto rendimiento, pero tengo que establecer explícitamente el tamaño de la ventana para hacer uso de él, lo que la mayoría de las aplicaciones del mundo real no me dejan hacer. Los protocolos de enlace TCP utilizan los mismos puntos de partida en cada caso, pero el forzado escala
Por el contrario, desde un cliente Linux en la misma red, una línea recta iperf -c
(usando el sistema predeterminado 85kb) me da:
[ 5] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 33263
[ 5] 0.0-10.8 sec 142 MBytes 110 Mbits/sec
Sin forzar, se escala como se esperaba. Esto no puede ser algo en los saltos intermedios o en nuestros conmutadores / enrutadores locales y parece afectar a los clientes de Windows 7 y 8 por igual. He leído muchas guías sobre el autoajuste, pero generalmente se trata de deshabilitar la escala por completo para evitar el kit de red doméstica terrible y malo.
¿Alguien puede decirme qué está pasando aquí y darme una manera de arreglarlo? (Preferiblemente, algo que pueda pegar en el registro a través de GPO).
Notas
La instancia de AWS Linux en cuestión tiene las siguientes configuraciones de kernel aplicadas en sysctl.conf
:
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
net.ipv4.tcp_rmem = 4096 1048576 16777216
net.ipv4.tcp_wmem = 4096 1048576 16777216
He utilizado la dd if=/dev/zero | nc
redirección al /dev/null
servidor para descartar iperf
y eliminar cualquier otro posible cuello de botella, pero los resultados son muy parecidos. Las pruebas con ncftp
(Cygwin, Native Windows, Linux) se escalan de la misma manera que las pruebas iperf anteriores en sus respectivas plataformas.
Editar
He visto otra cosa consistente aquí que podría ser relevante:
Este es el primer segundo de la captura de 1 MB, ampliada. Puede ver el inicio lento en acción a medida que la ventana se amplía y el búfer se hace más grande. Luego está esta pequeña meseta de ~ 0.2s exactamente en el punto en que la prueba de ventana predeterminada iperf se aplana para siempre. Por supuesto, esta escala a alturas mucho más vertiginosas, pero es curioso que haya una pausa en la escala (los valores son 1022bytes * 512 = 523264) antes de hacerlo.
Actualización - 30 de junio.
Seguimiento de las diversas respuestas:
- Habilitación de CTCP: esto no hace ninguna diferencia; La escala de la ventana es idéntica. (Si entiendo esto correctamente, esta configuración aumenta la velocidad a la que se amplía la ventana de congestión en lugar del tamaño máximo que puede alcanzar)
- Habilitación de marcas de tiempo TCP. - No hay cambio aquí tampoco.
- Algoritmo de Nagle: eso tiene sentido y al menos significa que probablemente pueda ignorar esos puntos en particular en el gráfico como cualquier indicación del problema.
- Archivos pcap: archivo Zip disponible aquí: https://www.dropbox.com/s/104qdysmk01lnf6/iperf-pcaps-10s-Win%2BLinux-2014-06-30.zip (Anónimo con bittwiste, se extrae a ~ 150MB ya que hay uno de cada cliente OS para comparar)
Actualización 2 - 30 de junio
O, así que, siguiendo la operación de la sugerencia de Kyle, habilité ctcp y deshabilité la descarga de la chimenea: Parámetros globales TCP
----------------------------------------------
Receive-Side Scaling State : enabled
Chimney Offload State : disabled
NetDMA State : enabled
Direct Cache Acess (DCA) : disabled
Receive Window Auto-Tuning Level : normal
Add-On Congestion Control Provider : ctcp
ECN Capability : disabled
RFC 1323 Timestamps : enabled
Initial RTO : 3000
Non Sack Rtt Resiliency : disabled
Pero lamentablemente, no hay cambio en el rendimiento.
Sin embargo, tengo una pregunta de causa / efecto aquí: los gráficos son del valor RWIN establecido en los ACK del servidor para el cliente. Con los clientes de Windows, ¿estoy en lo cierto al pensar que Linux no está escalando este valor más allá de ese punto bajo porque el CWIN limitado del cliente evita que incluso ese búfer se llene? ¿Podría haber alguna otra razón por la que Linux está limitando artificialmente el RWIN?
Nota: He intentado activar ECN por el placer de hacerlo; pero no hay cambio, ahí.
Actualización 3 - 31 de junio.
Ningún cambio después de deshabilitar la heurística y el autoajuste RWIN. He actualizado los controladores de red Intel a la última versión (12.10.28.0) con un software que expone ajustes de funcionalidad a través de pestañas del administrador de dispositivos. La tarjeta es una NIC integrada en el chipset 82579V (voy a hacer más pruebas de clientes con Realtek u otros proveedores)
Centrándome en la NIC por un momento, he intentado lo siguiente (principalmente descartando culpables poco probables):
- Aumente los búferes de recepción a 2k desde 256 y los búferes de transmisión a 2k desde 512 (Ambos ahora al máximo) - Sin cambios
- Deshabilitó toda la descarga de suma de verificación IP / TCP / UDP. - Ningún cambio.
- Desactivado Descarga de envío grande - Nada.
- Desactivado IPv6, programación de QoS - Nowt.
Actualización 3 - 3 de julio
Intentando eliminar el lado del servidor Linux, inicié una instancia de Server 2012R2 y repetí las pruebas usando iperf
(cygwin binary) y NTttcp .
Con iperf
, tuve que especificar explícitamente -w1m
en ambos lados antes de que la conexión escalara más allá de ~ 5Mbit / s. (Por cierto, podría ser revisado y el BDP de ~ 5 Mbits a 91 ms de latencia es casi exactamente 64 kb. Encuentra el límite ...)
Los binarios ntttcp mostraron ahora tal limitación. Utilizando ntttcpr -m 1,0,1.2.3.5
en el servidor y ntttcp -s -m 1,0,1.2.3.5 -t 10
en el cliente, puedo ver un rendimiento mucho mejor:
Copyright Version 5.28
Network activity progressing...
Thread Time(s) Throughput(KB/s) Avg B / Compl
====== ======= ================ =============
0 9.990 8155.355 65536.000
##### Totals: #####
Bytes(MEG) realtime(s) Avg Frame Size Throughput(MB/s)
================ =========== ============== ================
79.562500 10.001 1442.556 7.955
Throughput(Buffers/s) Cycles/Byte Buffers
===================== =========== =============
127.287 308.256 1273.000
DPCs(count/s) Pkts(num/DPC) Intr(count/s) Pkts(num/intr)
============= ============= =============== ==============
1868.713 0.785 9336.366 0.157
Packets Sent Packets Received Retransmits Errors Avg. CPU %
============ ================ =========== ====== ==========
57833 14664 0 0 9.476
8MB / s lo coloca en los niveles que estaba obteniendo con ventanas explícitamente grandes iperf
. Sin embargo, curiosamente, 80 MB en 1273 búferes = un búfer de 64kB nuevamente. Un wirehark adicional muestra un buen RWIN variable que regresa del servidor (Factor de escala 256) que el cliente parece cumplir; entonces quizás ntttcp está informando erróneamente la ventana de envío.
Actualización 4 - 3 de julio
A pedido de @ karyhead, hice algunas pruebas más y generé algunas capturas más, aquí: https://www.dropbox.com/s/dtlvy1vi46x75it/iperf%2Bntttcp%2Bftp-pcaps-2014-07-03.zip
- Dos
iperf
s más , ambos desde Windows al mismo servidor Linux que antes (1.2.3.4): uno con un tamaño de socket de 128k y una ventana predeterminada de 64k (se restringe a ~ 5Mbit / s nuevamente) y uno con una ventana de envío de 1MB y un socket predeterminado de 8kb Talla. (escalas más altas) - Una
ntttcp
traza desde el mismo cliente de Windows a una instancia Server 2012R2 EC2 (1.2.3.5). aquí, el rendimiento escala bien. Nota: NTttcp hace algo extraño en el puerto 6001 antes de abrir la conexión de prueba. No estoy seguro de lo que está pasando allí. - Un seguimiento de datos FTP, cargando 20 MB de
/dev/urandom
un host Linux casi idéntico (1.2.3.6) usando Cygwinncftp
. De nuevo el límite está ahí. El patrón es muy similar usando Windows Filezilla.
Cambiar la iperf
longitud del búfer hace la diferencia esperada en el gráfico de secuencia de tiempo (muchas más secciones verticales), pero el rendimiento real no cambia.
netsh int tcp set global timestamps=enabled