2012-02-14 20 views
13

Para ver qué tan bien me está yendo en el procesamiento de los datos entrantes, me gustaría medir la longitud de la cola en mis sockets TCP y UDP.¿Cómo obtengo la cantidad de datos en cola para el socket UDP?

Sé que puedo obtener el tamaño de la cola a través de la opción de socket SO_RCVBUF, y que ioctl(<sockfd>, SIOCINQ, &<some_int>) me dice la información para los sockets TCP. Pero para UDP el SIOCINQ/FIONREAD ioctl devuelve solo el tamaño del siguiente datagrama pendiente. ¿Hay alguna manera de obtener el tamaño de cola para UDP, sin tener que analizar tablas del sistema como /proc/net/udp?

+4

Me temo que no puede obtener esta información directamente ya que el kernel no la admite. – ldx

Respuesta

6

Como se menciona en ldx, no es compatible con ioctl o getsockopt. Me parece que la implementación actual de SIOCINQ tenía como objetivo determinar cuánto buffer se necesita para leer todo el buffer de espera (pero supongo que no es tan útil para eso, ya que puede cambiar entre la lectura del mismo y el real lectura de tampón).

Hay muchas otras telemetrías que no son compatibles con tales llamadas al sistema, supongo que no hay una necesidad real en el uso de producción normal.

Puede comprobar las caídas/errores a través de "netstat -su", o mejor usando SNMP (udpInErrors) si solo desea controlar el estado de la máquina.

BTW: Siempre tiene la opción de hackear el código Kernel y agregar este valor (u otros).

6

FWIW, hice algunos experimentos para trazar el comportamiento de FIONREAD en diferentes plataformas.

plataformas donde FIONREAD devuelve todos los datos pendientes en una toma de SOCK_DGRAM:

Mac OS X, NetBSD, FreeBSD, Solaris, HP-UX, AIX, Ventanas

plataformas donde FIONREAD retornos solo los bytes para el primer datagrama pendiente:

Linux

También vale la pena señalar que algunas implementaciones incluyen encabezados u otros bytes generales en el recuento, mientras que otros solo cuentan los bytes de la carga útil. Parece que Linux devuelve el tamaño de la carga útil, sin incluir los encabezados de IP.

+2

Me temo que esto no funciona, por [udp (7)] (http://www.kernel.org/doc/man-pages/online/pages/man7/udp.7.html): _ "FIONREAD (SIOCINQ): Devuelve el tamaño del siguiente datagrama pendiente en el entero en bytes, o 0 cuando no hay datagrama pendiente. "_ – che

+2

Malo: Olvidé que' FIONREAD' funciona de manera diferente en Linux que en los * BSD y Solaris. Editaré mi respuesta para mostrar las diferencias de la plataforma. –

Cuestiones relacionadas