套接字和文件建议的缓冲区大小
问题描述:
请问Linux内核的黑客,什么是合理的缓冲区大小为write(2)
系统调用套接字或文件,性能明智吗?很明显,这是一些页面大小,但哪一个?有关系吗?什么是“太小”和“太大”?套接字和文件建议的缓冲区大小
答
取决于有多大的延迟,以对等关系,比方说你有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));
任何小于128千字节,因为这是适合默认情况下,发送队列(除非你想玩setsockopt) 。 – Damon
@Damon:我不确定“什么”是正确的答案。缓冲区至少应该一致。 – Cartesius00
默认情况下大部分时间都适用于大多数人(这是合理的假设编写网络堆栈的人不是完全白痴)。除非您经常需要发送大量数据(真的很大),并且对延迟有严格的限制,否则通常没有理由打扰。只要是“合理”的大小,只要将其复制到发送缓冲区并发送,无论它是多少。如果不是全部适合,'write'将会写得比你要求的要少(返回金额)。无论如何,它只是起作用。 – Damon