2011-12-01 10 views
5

Por favor, hackers del kernel de Linux, ¿cuál es un tamaño de búfer razonable para write(2) syscall a sockets o archivos, en cuanto al rendimiento? Está claro que es un múltiplo de páginas, pero ¿cuál? ¿Importa? ¿Qué es "demasiado pequeño" y "demasiado grande"?Tanto el zócalo como el archivo recomiendan tamaño de búfer

+0

Cualquier cosa menos de 128 kilobytes, porque eso es lo que encaja en la cola de envío por defecto (a menos que quieras jugar con setsockopt) . – Damon

+1

@Damon: No estoy seguro de que "nada" sea una respuesta correcta. Los buffers deberían estar definitivamente alineados, al menos. – Cartesius00

+0

El valor predeterminado funciona para la mayoría de las personas la mayor parte del tiempo (es razonable suponer que las personas que escriben la pila de la red no son idiotas completos). A menos que regularmente deba enviar grandes cantidades de datos (realmente enormes) y tenga algunas restricciones estrictas sobre la latencia, normalmente no hay motivo para molestarse. Cualquier cosa que tenga un tamaño "razonable" simplemente se copia en el búfer de envío y se envía, sin importar cuánto sea. Si no todo encaja, 'write' escribirá menos de lo que pide (devolviendo el monto). En cualquier caso, simplemente funciona. – Damon

Respuesta

7

depende de cuán grande es su retraso a los pares es, digamos que usted tiene una conexión de 100 Mbps y un retraso de 50 ms, entonces se puede calcular

100MBps * 0.050 sec/8 = 0.625MB = 625KB 

pero el tamaño de la ventana por defecto en Linux 2.6 es de alrededor 110KB, lo que limitará su throught a alrededor de 2,2 Mbps (110KB/0.050) lo tanto, para fijar que pueda usted setsockopt

int ret, sock, buf_size; 
sock = socket(AF_INET, SOCK_STREAM, 0); 
buf_size = 625*1024; 
ret = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&buf_size, sizeof(buf_size)); 
ret = setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&buf_size, sizeof(buf_size)); 
Cuestiones relacionadas