Linux内核程序员,请问对于套接字或文件的write(2)
系统调用,从性能角度考虑,合理的缓冲区大小是多少?很明显,它应该是某个页面大小的倍数,但是是哪个呢?这是否重要?什么样的大小算是“太小”或“太大”?
Linux内核程序员,请问对于套接字或文件的write(2)
系统调用,从性能角度考虑,合理的缓冲区大小是多少?很明显,它应该是某个页面大小的倍数,但是是哪个呢?这是否重要?什么样的大小算是“太小”或“太大”?
取决于您与同行之间的延迟时间有多长,假设您拥有100MBps的连接速度和50ms的延迟时间,则可以进行计算:
100MBps * 0.050 sec / 8 = 0.625MB = 625KB
但是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));
write
将写入少于您请求的数量(返回该数量)。在任何情况下,它都能正常工作。 - Damonwrite
无论如何都会进行复制,所以...没有人关心。 - Damonwrite
会复制,没有对齐或大小限制。如果write
无法处理你传入的几TB数据,它将返回它能够写出的字节数,并且你需要再次调用write
,减去已经写出的字节数。 - Damon