2011-12-01 12 views
5

Per favore, kernel hacker Linux, qual è una dimensione del buffer ragionevole per write(2) syscall in socket o file, in termini di prestazioni? È chiaro che è un pò di pagine multiple, ma quale? Importa? Cosa è "troppo piccolo" e "troppo grande"?Dimensioni del buffer raccomandate per socket e file

+0

Qualsiasi cosa meno di 128 kilobyte, perché questo è ciò che si inserisce nella coda di invio di default (a meno che tu non voglia giocare con setsockopt) . – Damon

+1

@Damon: non sono sicuro che "qualsiasi cosa" sia una risposta giusta. I tamponi dovrebbero essere sicuramente allineati, almeno. – Cartesius00

+0

L'impostazione predefinita funziona per la maggior parte delle persone la maggior parte delle volte (è ragionevole presumere che le persone che scrivono lo stack di rete non siano idioti completi). A meno che non sia necessario inviare regolarmente enormi quantità di dati (davvero enormi) e avere alcuni vincoli rigorosi sulla latenza, normalmente non c'è motivo di preoccuparsi. Tutto ciò che è una dimensione "ragionevole" viene semplicemente copiato nel buffer di invio e inviato, non importa quanto sia. Se non tutto si adatta, 'write' scriverà meno di quello che chiedi (restituendo l'importo). In ogni caso, funziona. – Damon

risposta

7

dipende da quanto è grande il tuo ritardo al peer è, diciamo che si dispone di una connessione 100 Mbps e un ritardo di 50 ms, quindi è possibile calcolare

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

ma la dimensione della finestra di default in Linux 2.6 è di circa 110KB, che limiterà la vostra throught fuori a circa 2.2MBps (110KB/0,050) così, per risolvere che si può si 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)); 
Problemi correlati