El misterioso caso del Linux que iba lento

Febrero 27th, 2009

Desde hace tiempo estoy buscando alguna excusa para instalar mi querido Debian en el ordenador del trabajo. Por fin la excusa llegó de mano de un proyecto muy interesante sobre clusters Red Hat y sistemas de ficheros compartidos. El caso es que tras instalarlo fui tan contento a bajar algunas herramientas que necesitaba vía apt-get. No podéis imaginar mi sorpresa cuando la velocidad de descargar no superaba los 6KB, más o menos la velocidad a la que iba mi antiguo modem, allá por el principio de los tiempos.

Me digo, ¡No puede ser! Windows va estupendamente y nadie se queja, así que tiene que ser cosa del repositorio APT, voy a probar otro mirror.  Pues no, todos iguales.

¿Me afectará también a la hora de navegar? Pues sí y no. En algunas páginas va genial y en otras se arrastra. Que cosa más rara.

Quizás es algún bug que hay en este kernel tan nuevo, mañana traigo el portátil de casa y comparo. Y lo traje y vi asombrado como mi portátil no superaba los 6KB.  También llevé el equipo del trabajo a casa y vi como la velocidad de descarga no bajaba de los 200KB.

Ajá, hay algo en la red del trabajo que le está haciendo la puñeta a mi pobre Linux y que dejá a los Windows tan tranquilos. Esto en sí mismo es bastante raro, pero ya puestos me puse a trastear con switches y routers. Mmmmm… todo parece correcto.

¿Y que dice Google? Seguro que ya ha habido muchos casos como éste antes. Y sí, efectivamente ha habido muchos casos como éste. Búsquedas tan originales como linux internet lento o simpelmente internet lento arrojan miles de resultados. Algunos coinciden exactamente con mi problema, sin embargo las soluciones que ofrece la comunidad son del estilo: revisa el cable, formatea el equipo o desfragmenta el disco. Es más, este problema no se limita sólo a los Linux, hay otros S.O. como Windows Vista que también lo sufren.

Pero…

¿Por qué en casa va bien?

¿Por qué con algunos servidores no hay problemas?

¿Por qué me pasa a mi esto (y a los demás no)? Es inevitable pensar que somos las personas más desgraciadas del universo…

Vale, habrá que tomarse las cosas con calma, ¿Qué sabemos?

* Es un problema que ocurre en la red del trabajo, por lo tanto hay algún elemento de la misma que está haciendo algo que no debe.

* Por los resultados de la búsqueda podemos deducir que es un problema que afecta a S.O. relativamente recientes.

* No todas las comunicaciones están afectadas (esto sí que es condenadamente raro)

Armado con mi wireshark sigo haciendo pruebas y descubro que el problema sólo parece darse con conexiones TCP. Ya la cosa tiene más sentido. Quizás alguna optimización de la pila TCP que se ha incluido en los nuevos núcleos y no es bien vista por equipos de comunicaciones antiguos. Ahora que ya sé lo que estoy buscando vuelvo a Google y no tardo en encontrar el RFC1323 y los problemas que tienen alguno routers con él. Voy a resumir un poco para no aburriros demasiado…

El RFC1323 es una extensión al protocolo TCP para resolver un problema conocido como TCP Window Scaling. Uno de los campos del protocolo TCP, llamado window, especifica la cantidad de datos que esta preparado a recibir el sistema que envía el paquete. De esta manera comunicamos al otro extremo como estamos de carga y lo que estamos dispuesto a procesar, es el mencanismo de control de flujo básico de TCP.

El campo window tiene una longitud de 16bits, lo que implica que podemos especifar una ventana máxima de 64Kb, en aquellos tiempos en los que se diseñó el protocolo era un tamaño ridículamente exagerado, hoy en día es un tamaño ridículamente limitado. Así que en el 92 salió a la luz el RFC1323 en el que se especificaba una manera de acabar con esta limitación.

Lo solución que se dió es la siguiente, se incluye un campo de opciones TCP llamado scale.  El valor de este campo multiplicado por el valor del campo window especifica el tamaño real de la ventana TCP (para los puristas: no se realiza una multiplicación, sino un desplazamiento hacia la izquierda de bits). Así pues, de esta manera tan sencilla se había acabado con el problema de ventanas TCP demasiado pequeñas.

Ahora bien, había otro problema que solucionar. No todos los sistemas tenían que implementar esta optimización y aún así todos deberían poder seguir comunicándose entre sí. Se decidió que la mejor manera de solucionar esto era negociarlo durante el 3-way-handshake (SYN/SYN+ACK/ACK). Si un sistema desea usar las optimizaciones del tamaño de ventana, manda en el paquete SYN la opción TCP adecuada con la escala que considere oportuna, si el sistema destino soporta la optimización, devolverá en el paquete SYN-ACK esta opción, si no siemplemente elminará la opción del paquete de vuelta, que es la forma estándar de proceder en el caso de ignorar el significado de una opción TCP. La limitación de esta negociación es que el tamaño de la ventana permanece constante durante toda la sesión TCP, un mal menor.

Y ahora el problema, algunos routers y firewalls, como medida de “seguridad”, cuando ven alguna opción TCP que no reconocen la ponen a 0, lo que claramente viola el estándar: o bien se quita el campo de opción completo o bien se ignora su contenido, pero alterarlo de esa manera sólo puede producir problemas. Veamos lo que pasa, nuestro Linux que soporta la optimización del RFC1323 pone el campo scale como opción TCP. Nuestro router no ve con buenos ojos esa opción que no reconoce y la pone a 0. El sistema final, que también soporta el RFC1323 hace los calculos para una escala de 0 y devuelve el SYN+ACK con esta opción activa. El resultado es una confusión en el tamaño de ventana que hay que utilizar. Los problemas que esto genera van desde una comunicación extremadamente lenta o la pérdida total de comunicación. Por otro lado, si el sistema final no soporta las optimización, el campo scale es ignorado y eliminado del paquete de vuelta, y se usa el antiguo método de control de flujo, por lo que todo va estupendamente bien. De ahí que con algunos sistemas dé problemas y con otros no.

SOLUCIÓN

El workaround es desactivar esta optimización, en Linux esto lo puedes hacer así:

echo 0 > /proc/sys/net/ipv4/tcp_window_scaling

Lo que cambiará esta opción hasta el próximo reinicio de la máquina, para dejarlo fijo añade la siguiente línea al /etc/sysctl.conf:

net.ipv4.tcp_window_scaling = 0

Para Windows Vista tienes una guía paso a pasa en el siguiente enlace:

http://www.tech-recipes.com/rx/1744/vista_tcp_cannot_communicate_primary_dns_server/

Si alguno se ha quedado con ganas de más, podéis ampliar información en: http://lwn.net/Articles/92727/

Categorías: curiosidades, interesante |

19 comentarios

  1. Bitacoras.com

  2. shanakadu

    Entonces basicamente por eso mi emule en el curro va lento, por que usan switch no compatibles, les dare un toque a la gente del CAU (Centro de atencion de Usuario) para que me arreglen el emule. jejejeje

  3. Duda tecnica - Foros Softonic

    [...] ha acabado de corregir ni instalandolo en el disco duro. mirando por otros foros, me encontre con esto, el problema es que debo de estar torpe, porque por mas que lo leo no consigo saber que es lo que [...]

  4. Sergio

    Hola, la verdad es que el articulo esta bastante desmenusadito, tanto que hasta me he enterado siendo yo bastante novatillo :).
    Te relato mi caso.
    Instale el Ubuntu 8.10 hace apenas un mes y la verdad es que estoy bastante contento por lo general, pero tengo un único problemilla.
    Descargo a velocidades altas desde bittorrent y amule, e incluso cualquier archivo desde mi navegador, pero cuando me dispongo a navegar, tarda un rato en mostrarme las páginas, va muy lento. Pero solo cuando la página lleva un rato descargada, es decir, abro una página, me pongo a leerla y cuando termino (30 segundos por ejemplo) abro un enlace y me toca esperar, tarda una eternidad. Otra cosa distinta me pasa cuando abro la página y seguidamente abro el enlace, entonces va rapido.
    La verdad es que me pareció bastante raro cuando lo instalé.
    A ver si me puedes ayudar, porque ando bastante mosca con esto.
    he abierto el terminal de linux y he puesto:
    #sudo echo 0 > /proc/sys/net/ipv4/tcp_window_scaling

    pero no se me ha resuelto.

    Gracias por el articulo y por escucharme. Un saludo

  5. SynWenn

    Hola Sergio,

    Tu caso no tiene nada que ver con el que comento en este artículo, más bien parece que se trata de un problema con los DNS o un conflicto con ipv6.

    Te remito a un artículo de un blog amigo en el que se explica como solucionar estos problemas: http://freesoftwareando.com/830/internet-va-lento-en-ubuntu-solucion/

  6. Manuel Ricardo

    Definitivamente un buen artículo para comenzar este 2009, el Informe de lo que has hecho este 2009 sin lugar a dudas, nos deja alentados a enviar un abrazo desde aquí, y desear éxitos en esta nueva vida, por otro lado, enhorabuena por este aporte, y ojala de a pocos vuelvan los post a esta pagina.

  7. fanta

    Ventana deslizante ¡¡¡ creo que asi es como me lo enseñaron.
    Se agradece que regreses con este tipo de información.
    Solo por el titulo apostaria a que en poco tiempo está entrada va a recivir bastantes visitas :D.

  8. kis

    Hola ¡

    Llevo cosa de 1 mes que el emule me va fatal lentisimo cuando toda la vida las cosas me bajaban a lo bestia, tengo ID alta, es decir aparentemente todo va bien pues esta bien configurado etc, alguien tiene el mismo problema ?

    Gracias por aydarme.

  9. alexandre

    he leido tu articulo tengo exactamente el mismo proble en casa xq fuera me va rapdisimo y e casa linux va lento resolviendo las direcciones y en el apt-get.. pero las descargas van rapidas sin embargo windows va perfectamente incluao windows virtualizado dentro de linux va rapido , pero linux no, hw aplicado lo del window scaling y nada, y el proble me ocurre solo en la red de casa, router blanco de telefonica y fuera va perfectamente, gracias de antemano

  10. SynWenn

    Hola Alexandre, tu problema parece coindir con el de Sergio (ver más arriba), ve al blog que le recomendé a él.

  11. Alexandre

    Ya hice lo del blog, pero sigue igual parece ser que el problema tiene que ver con el ruter Xavi, he leido por ai que da problemas con mac y con linux

  12. marqus

    Hola, SynWenn

    a mí lo que me ocurre es que la velocidad de descarga es notablemente menor desde Ubuntu que desde la partición que tengo con Windows. El mismo archivo de megaupload, por ejemplo, baja a unos 600kb/s desde Win y a 20kb/s desde Ubuntu. Además cuando abro varias pestañas en Firefox (4 o 5) el navegador se resiente y hasta tengo que forzar el cierre en ocasiones; esto en cambio no me ocurre en Windows, donde puedo tener esas 4 o 5 más otras tantas sin que el navegador se resienta.

    He probado a hacer tanto lo que dices tú en esta entrada como lo que aconsejan en Freesoftwareando en el post que le recomiendas a Sergio un poco más arriba, pero la descarga directa sigue a 20 kb/s. Siento contarte este rollo aquí pero es que llevo mucho tiempo buscando una solución y no encuentro nada en la red. Estoy cableado y todas los problemas que encuentro planteados se refieren a conexiones inalámbricas.

    Gracias y disculpa por el testamento que te he dejado aquí :)
    Un saludo.

  13. SynWenn

    Hola Marqus, me temo que con la información que me das poco puedo ayudarte. Casi mejor que seguimos esta conversación por e-mail e intento echarte una mano. Yo lo primero que haría sería probar con una LiveCD, por si se trata de algo concreto de la versión/distribución/kernel que estás usando y luego, según los resultados, elegir las pruebas… lo dicho, seguimos por email.

  14. UnoQPasabaPorAqui

    shanakadu– [...] les dare un toque a la gente del CAU (Centro de atencion de Usuario) para que me arreglen el emule [...]

    de verdad, los que habeis salido del CAU/Helpdesk o como lo quieras llamar no os perdonais vuestro propio pasado, lo veo todos los dias en el trabajo, los que salen del CAU, pisotean y abusan a su ex-compañeros… a ver cuanto duras en tu nueva posicion, ¿que eres? programador java de esos de copy/paste.

    no te molestes en responder, no creo q vuelva a esta pagina.

    saludos en general !!

  15. Sergi

    Lo he hecho y parece que vaya mejor. Hay webs que se cargan al instante. De acuerdo, todo parece muy bonito, pero algo raro pasa con el torrent, que tengo el qbittorrent (bastante parecido al utorrent de Windows) y baja las cosas como en Windows, pero a la hora de navegar estamos otra vez en las mismas. En cambio en Windows mientras me bajo torrents puedo navegar (un pelín más lento que sin bajarme nada, pero casi ni se nota). En el Linux Mint 7 que tengo yo parece que haya conflicto de puertos a la hora de compartir varios procesos de internet. Otra cosa que me ayudó (pero no del todo) a navegar mejor fue poner las Open DNS.

  16. leofer

    hola: pos aqui ando , soy bastante inexperto en esto, pero me gustaria un comentario acerca de jap/jondo , se trata de saber si realmente se consigue un verdadera privacidad a la hora de navegar, sobre todo acerca de lo que se registra en el disco duro de un ordenador,pues lo encuentro interesante, ¿queda ahí registrado?, es imposible de borrar?, y como siempre saber si en USA han descubierto algo nuevo (lo pregunto por si sabes algo), pues he oido que algo hay y afecta gravemente a la seguridad de internet, ¿o puede ser todo paranoia?,muchas gracias

  17. Oxkhar

    Eres la caña, tio…
    Me has resuelto el problema que tenia.
    Estaba leyendo el articulo y es el mismo problema que teníamos en la oficina. Clavao.
    Estaba leyendo como si lo hubiera escrito yo (excepto por la solución, claro, que todavía no había encontrado).
    Y cuando he cambiado la configuración y he realizado las pruebas se me caían lagrimones de ver como funciona la red.
    Hasta ahora (varios meses) simplemente la actualización del sistema dejándolo bajar de un día para otro.
    Ahora todo lava más limpio… ;)
    Bravo, tío, te lo has currado, estas cosas son las que hace que internet sea cada vez más grande.
    Es que no tengo palabras… \(^_^)/

  18. elcarajitoloco

    Soy nuevo y estoy probando linux vengo de mac y me flipa cacharrear con los ordenadores, por deporte mas que por otra cosa, la experiencia esta siendo realmente, increible, gracias

  19. beco

    A mi me paso con ubunto 10.10 y con windows iva bien. Era el cacharro que ponen los de telefónica entre la linea de mi casa y la linea del bloque de pisos. Me la cambiaron cuando me cambie de companía y me empezó a funcionar correctamente.

Deja un comentario