套接字和文件都建议缓冲区大小

Car*_*s00 5 c c++ linux gcc linux-kernel

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

ess*_*kar 7

取决于你对同伴的延迟有多大,假设你有一个100MBps的连接,延迟50ms,那么你可以计算

100MBps * 0.050 sec / 8 = 0.625MB = 625KB
Run Code Online (Sandbox Code Playgroud)

但Linux 2.6中的默认窗口大小约为110KB,这将限制你的通过大约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));
Run Code Online (Sandbox Code Playgroud)