2011-12-01 66 views
5

请问Linux内核的黑客,什么是合理的缓冲区大小为write(2)系统调用套接字或文件,性能明智吗?很明显,这是一些页面大小,但哪一个?有关系吗?什么是“太小”和“太大”?套接字和文件建议的缓冲区大小

+0

任何小于128千字节,因为这是适合默认情况下,发送队列(除非你想玩setsockopt) 。 – Damon

+1

@Damon:我不确定“什么”是正确的答案。缓冲区至少应该一致。 – Cartesius00

+0

默认情况下大部分时间都适用于大多数人(这是合理的假设编写网络堆栈的人不是完全白痴)。除非您经常需要发送大量数据(真的很大),并且对延迟有严格的限制,否则通常没有理由打扰。只要是“合理”的大小,只要将其复制到发送缓冲区并发送,无论它是多少。如果不是全部适合,'write'将会写得比你要求的要少(返回金额)。无论如何,它只是起作用。 – Damon

回答

7

取决于有多大的延迟,以对等关系,比方说你有100Mbps的连接,以及50毫秒的延迟,那么你就可以计算出

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

但在Linux 2.6中默认的窗口大小约为110KB,这将限制了你的throught围绕2.2MBps(110KB/0.050) 所以,要解决这个问题,你可以你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)); 
相关问题