2010-01-19 14 views
26

En Linux, se puede especificar por defecto del sistema reciben tamaño de búfer para los paquetes de red, por ejemplo UDP, usando los siguientes comandos:Especificación UDP recibir tamaño del búfer en tiempo de ejecución en Linux

sysctl -w net.core.rmem_max=<value> 
sysctl -w net.core.rmem_default=<value> 

Pero me pregunto, ¿es posible para una aplicación (por ejemplo, en c) para anular los valores predeterminados del sistema especificando el tamaño del búfer de recepción por socket UDP en tiempo de ejecución?

Respuesta

28

Puede aumentar el valor del valor predeterminado, pero no puede aumentarlo más allá del valor máximo. setsockopt utilizar para cambiar la opción SO_RCVBUF:

int n = 1024 * 1024; 
if (setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)) == -1) { 
    // deal with failure, or ignore if you can live with the default size 
} 

Tenga en cuenta que esta es la solución portátil; debería funcionar en cualquier plataforma POSIX para aumentar el tamaño del búfer de recepción. Linux ha tenido autotuning desde hace un tiempo (desde 2.6.7, y con reasonable maximum buffer sizes desde 2.6.17), que ajusta automáticamente el tamaño del búfer de recepción en función de la carga. En kernels con autotuning, se recomienda que no establezca el tamaño del búfer de recepción usando setsockopt, ya que eso desactivará el autotuning del kernel. Sin embargo, puede ser necesario utilizar setsockopt para ajustar el tamaño del búfer en otras plataformas.

+0

justo lo que estaba buscando :) También me pregunto si especifico el tamaño del buffer en un valor pequeño, ¿será estático? ¿O el sistema redimensionará dinámicamente el buffer para manejar la presión del tráfico, si hay alguno? –

+0

He ampliado un poco mi respuesta para mencionar el autotuning TCP de Linux; en Linux, si el autoajuste está habilitado, probablemente no deberías ajustar el tamaño del buffer usando 'setsockopt'; pero en otros sistemas, es posible que aún quieras hacerlo. –

+4

autotuning se aplica solo a TCP o se aplica a TCP y UDP? – kumar

Cuestiones relacionadas