Gestor de congestion autonomo.
Su funcionamiento a grandes rasgos es el siguiente:
- El campo getsockopt (...SO_RCVBUF...) nos da el tamaño maximo del buffer de recepcion para un socket dado. Segun hemos visto puede varias desde 32K hasta 80 K, dependiendo del sistema operativo y la configuracion. Independientemente del valor particular este sera nuestro limite maximo (100%), ya que si la longitud de la cola de espera alcanza este valor, el socket dejara de estar disponible para todos los clientes.
- El metodo ioctl (....FIONREAD...) nos da el numero de bytes pendientes de tratar en el socket.
- La carga del socket estara definida por (2) * 100 / (1).
- Con esta clase podemos limitar la carga maxima soportada por los sockets de nuestra aplicacion. Por defecto sera 60% del valor (1), un valor mas conservador podria ser 40%.
- La zona sin congestion estara entre 0% y el valor (4). La zona de congestion estara entre (valor (4) + 1)% y el 100%.
- La zona de congestion se divide, a su vez, en 4 zonas logicas: Si la carga del socket esta en el primer 25% se descartan mensajes con una probabilidad del 25%. Si la carga esta en el segundo 25% se descartan mensajes con una probabilidad del 50%. Si la carga esta entre el 51% y el 85% se descartan paquetes con una probabilidad del 85% y si esta entre el 86% y el 100% se descartan los paquetes con una probabilidad del 99%.
Ventajas:
- Trata cada socket de forma independiente, con lo que ajustamos mucho mejor el rendimiento de nuestra aplicacion.
- No hay que imaginar los 4 niveles de a8_controlniveles. Solo tendremos que establecer el nivel de carga maximo y el resto lo hace el proceso por si mismo. Sea como sea, es mucho mas facil ajustar un unico valor que los 8 o 10 necesarios con el sistema anterior.
- No requiere ninguna configuracion en base de datos.