Escenario: Tenemos un número de clientes de Windows con regularidad la carga de archivos grandes (FTP/SVN/HTTP PUT/SCP) para servidores Linux que son ~100-160ms de distancia. Hemos de 1Gbit/s síncrona de ancho de banda en la oficina y los servidores son instancias de AWS o físicamente alojados en NOSOTROS DCs.
El informe inicial fue que sube a una nueva instancia de servidor eran mucho más lentos de lo que podrían ser. Este orificio de salida en la prueba y de localizaciones múltiples, los clientes estaban viendo estable 2-5Mbit/s para el host de sus sistemas Windows.
Estalló iperf -s
en una instancia de AWS y, a continuación, a partir de un Windows cliente 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, (Caprichos de la AWS), pero suele ser entre 70 y 130Mbit/s, que es más que suficiente para nuestras necesidades. Uso de wireshark con la sesión, puedo ver:
iperf -c
Windows SYN - Ventana de 64kb, Escala 1 - Linux SYN, ACK: Ventana de 14kb, Escala: 9 (*512)iperf -c -w1M
Windows SYN - Windows de 64 kb, Escala 1 - Linux SYN, ACK: Ventana de 14kb, Escala: 9
Claramente el vínculo puede mantener este alto rendimiento, pero tengo que expresamente establece el tamaño de la ventana para hacer uso de ella, que la mayoría de las aplicaciones del mundo real no me deja hacer. El TCP apretones de mano se utilizan los mismos puntos de partida en cada caso, pero la forzada escalas
Por el contrario, desde un cliente Linux en la misma red recta, iperf -c
(utilizando el sistema por defecto 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, como las escalas de espera. Esto no puede ser algo en el transcurso de los saltos o con uno de nuestros switches/routers y parece afectar a Windows 7 y 8 clientes por igual. He leído un montón de guías en el auto-ajuste, pero estos suelen ser acerca de cómo desactivar el escalado por completo para evitar el mal terrible home kit de red.
¿Alguien puede decirme qué está pasando aquí y me dan una manera de arreglarlo? (De preferencia algo que puede pegarse en el registro a través de GPO.)
Notas
La AWS instancia de Linux en cuestión tiene las siguientes opciones del núcleo aplicado 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 usado dd if=/dev/zero | nc
redireccionar /dev/null
en el servidor para descartar iperf
y eliminar otras posibles cuellos de botella, pero los resultados son prácticamente los mismos. Pruebas con ncftp
(Cygwin, Nativo de Windows, Linux) escala en mucho la misma manera que el anterior iperf pruebas en sus respectivas plataformas.
Editar
He detectado otro consistente cosa en la que puede ser relevante:
Este es el primer segundo de la 1MB de captura, la imagen ampliada. Usted puede ver de Inicio Lento de la acción, como la ventana de escalas y el buffer se hace más grande. Hay entonces esta pequeña meseta de ~0.2 s exactamente en el punto en el que el valor predeterminado de la ventana de iperf prueba se aplana para siempre. Este curso de escalas mucho dizzier alturas, pero es curioso que hay una pausa en la escala (Valores son 1022bytes * 512 = 523264) antes de que se lo hace.
Actualización 30 de junio.
El seguimiento de las distintas respuestas:
- La habilitación de CTCP - Esto no hace ninguna diferencia; el escalado de la ventana es idéntica. (Si lo entiendo correctamente, este valor aumenta la velocidad a la que la ventana de congestión se agranda más que el tamaño máximo que puede alcanzar)
- Habilitar TCP marcas de tiempo. - No cambio por aquí.
- El algoritmo de Nagle - que tiene sentido y Que al menos significa que probablemente puede ignorar que en particular picos en la gráfica como cualquier indicación del problema.
- pcap archivos: archivo Zip disponible aquí: https://www.dropbox.com/s/104qdysmk01lnf6/iperf-pcaps-10s-Win%2BLinux-2014-06-30.zip (Anónima con bittwiste, se extrae ~150MB como hay uno de cada sistema operativo de cliente para la comparación)
Actualización 2 - 30 de junio
O, por lo que después de op en Kyle sugerencia, he habilitado el ctcp y movilidad de la chimenea de descarga: TCP Parámetros Globales
----------------------------------------------
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.
Tengo una causa/efecto de la pregunta, sin embargo: Los gráficos son de la RWIN valor configurado en el servidor del Ack para el cliente. Con los clientes de Windows, estoy en lo cierto al pensar que Linux no es el escalado de este valor, más allá de que su punto más bajo debido a que el cliente es limitada CWIN impide incluso que el buffer se llene? Puede haber alguna otra razón que Linux es limitar artificialmente el RWIN?
Nota: he intentado encender ECN para el infierno; pero no hay cambio, no.
Actualización 3 de junio 31.
Ningún cambio después de la desactivación de la heurística y RWIN de autoajuste. Se han actualizado los de Intel de la red de controladores a la última (12.10.28.0) con el software que expone functioanlity ajustes viadevice administrador de pestañas. La tarjeta es una 82579V Chipset de la placa de NIC - (voy a hacer algunas pruebas más de los clientes con realtek o de otros proveedores)
Centrándose en la NIC por un momento, he intentado lo siguiente (más que nada por descartar raro culpables):
- Aumento de búferes de recepción a 2k de 256 y búferes de transmisión a 2k de 512 (Ambos ahora en el máximo): Sin cambio
- Desactivado todos los IP/TCP/UDP descarga de suma de comprobación. - Ningún cambio.
- Deshabilitado La Descarga De Envío Grande - Nada.
- Apagado IPv6, QoS programación - Nowt.
Actualización 3 - 3 de julio
Tratando de eliminar el servidor Linux lado, comencé a subir un Server 2012R2 instancia y repite las pruebas mediante iperf
(cygwin binario) y NTttcp.
Con iperf
, tuve que especificar explícitamente -w1m
en ambos lados antes de la conexión de la escala más allá de ~5Mbit/s. (Por cierto, yo podría ser revisado y la BDP de ~5Mbits en 91ms latencia es casi con precisión de 64 kb. Spot el límite...)
El ntttcp binarios mostró ahora tal limitación. El uso de ntttcpr -m 1,0,1.2.3.5
en el servidor y ntttcp -s -m 1,0,1.2.3.5 -t 10
sobre el cliente, puedo ver mucho mejor rendimiento:
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 pone hasta en los niveles en los que estaba recibiendo con explícitamente grandes ventanas en iperf
. Curiosamente, a pesar de que, 80MB en 1273 buffers = un búfer de 64 kb de nuevo. Una más wireshark muestra, variable RWIN viniendo desde el servidor (factor de Escala de 256) que el cliente parece cumplir; así que tal vez ntttcp está falseando la ventana de envío.
Actualización 4 - 3 de julio
En @karyhead petición, he hecho algunas pruebas más y generado un poco más capturas, aquí: https://www.dropbox.com/s/dtlvy1vi46x75it/iperf%2Bntttcp%2Bftp-pcaps-2014-07-03.zip
- Dos más
iperf
s, tanto de Windows al mismo servidor Linux como antes (1.2.3.4): Uno con un 128k Socket predeterminada y de tamaño de 64 kb de la ventana (restringe a ~5Mbit/s de nuevo) y uno con un 1MB ventana de envío y predeterminado de 8 kb de tamaño de socket. (escalas mayores) - Uno
ntttcp
de seguimiento desde el mismo cliente de Windows a un Server 2012R2 instancia de EC2 (1.2.3.5). aquí, el rendimiento de las escalas. Nota: NTttcp hace algo extraño en el puerto 6001 antes de que se abra la conexión de la prueba. No estoy seguro de lo que está pasando ahí. - Uno de los datos FTP de seguimiento, la carga de 20MB de
/dev/urandom
a cerca de un idéntico host de linux (1.2.3.6) usando Cygwinncftp
. De nuevo, el límite es de allí. El patrón es casi el mismo de Windows utilizando Filezilla.
El cambio de la iperf
la longitud del búfer hace la diferencia esperada para el tiempo de la secuencia gráfica (mucho más secciones verticales), pero el rendimiento real es invariable.