Saltar al contenido

Bandwidth Mod : Dos arreglos .. en un intento

Jacky Yuen me contacto por un bug en el mod. No parecia un bug, pero…

El problema :

En su servidor windows (win2003 y XP) el mod funcionaba pero no era capaz de alcanzar altas velocidades (1MB/s). Esto ocurre en algunos sistemas, y para ello se puede cambiar el tamano del paquete en la configuracion.
Sin embargo eso no corrigio el problema. Lo intente en mi servidor y obtuve cerca de 500KB/s. Colocar el paquete en 16384 obtuve cerca de 1MB/s. Jacky me dijo que aun asi, tenia problemas. Yo probe lo mismo en cada equipo Windows que pude.

Windows 2003 server, y Windows 7 (32bits) mostraron el problema. (la velocidad maxima no superaba 490KB/s). Windows 7 64bits y Win 2003 SP2 no fallaban.

Lo mas entretenido era que si corrias Chrome, una aplicacion Flash o Windows Media Player, el mod podia dar las velocidades que queriamos.

Me tomo un poco, pero descubri que Windows no usa un timer de alta resolucion constantemente. En los servidores con el problema, el timer corre cada 10ms.
Al correr una de las aplicaciones mencionadas, cambiaban la configuracion del timer a la mas alta posible (en mis equipos, 1ms). Este cambio afecta a todas las aplicaciones, por lo que el mod podia hacer esperas mas cortas para enviar la informacion a la velocidad necesitada.
Asi que escribi 2 arreglos. El primero, que no queria, hace que el mod fuerce el timer a su mayor resolucion posible (avisa en lo logs, por si quieres mirar). Y el segundo, es evitar las esperas muy cortas antes de enviar informacion. El tiempo minimo para esperar es de 200ms ahora, y los datos se ajustan para esto (solo en Windows). Ambos arreglos estan bajo defines que habilitan la compilacion solo en Windows, por lo que usuarios de otros sistemas no notaran diferencia alguna.

Lo bueno, para usuarios de Windows, es que con estos arreglos he logrado obtener velocidades hasta 2.45MB/s. Usando Apache solo, obtengo 1.2MB/s. Solo por habilitar el mod y poner un limite alto, la velocidad mejoro.

Y eso es. Al menos para esto.

  • Corregidos 2 errores molestos.
  • MinBandWidth -1 estaba causando problemas a veces. Todo por usar un entero sin signo para guardar el valor. Si… Mi culpa.
  • El handler limitador tenia fuga de memoria. Un par de bytes cada vez, pero para archivos grandes (muy muy grandes) esto puede causar que el proceso apache sirviendo el archivo podria llegar a consumir toda la memoria permitida. Gracias a Christian Spielberger quien me insistio del problema y me ayudo a encontrarlo. En mis servidores no pude reproducirlo dado que reciclaba los procesos frecuentemente.
  • Hecho Divertido : Encontre el bug limpiando el codigo de pruebas que hice. Y el me envio un correo con practicamente la misma solucion que habia creado. Mentes geniales piensan similar, eh ? :)

Tambien agregue un callback para obtener datos de estado para el mod. Un detalle de los segmentos de memoria usados para limitar el ancho de banda.
Son datos sumamente simples, pero mucha gente lo queria. Recibi muchos correos solicitando algo asi.

Es sencillo de habilitar ahora :

En tu vhost para administrar (si usas uno. Si no, puede ser cualquiera.), usa un bloque location para configurar un handler que llame al callback :

Por ejemplo, dentro de un vhost para 127.0.0.1 :

<location /modbw>
  SetHandler modbw-handler
</location>

Ahora te puedes conectar a la pantalla de estado visitando https://127.0.0.1/modbw
Tambien puedes obtener la informacion como un volcado en csv, con la url https://127.0.0.1/modbw?csv

Prueben los cambios, comentenme como funcionan.
Si tienes alguna idea de informacion que se puede agregar, siempre son bien recibidas. Dependiendo de si es posible agregarla en esta version o una siguiente, se vera.

Publicado enApachemod_bw
Ivn Systems/Software ©2020