我在网络服务器上工作,它返回微小的 JSON(大约 200 字节)。业务逻辑大约花费 2-3 微秒,但写入套接字大约花费 25 微秒。我对单个缓冲区使用 write
,对多个缓冲区使用 writev
。
我已经通过启用 TCP_NODELAY 禁用了 Nagle 的算法。还有其他加速写作的方法吗?
监听套接字选项:
......
if (listen(sfd, SOMAXCONN) == -1) { ... }
int val = true;
if (setsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val)) == -1) { ... }
if (setsockopt(sfd, IPPROTO_TCP, TCP_DEFER_ACCEPT, &val, sizeof(val)) == -1) { ... }
if (setsockopt(sfd, IPPROTO_TCP, TCP_QUICKACK, &val, sizeof(val)) == -1) { ... }
auto flags = fcntl(sfd, F_GETFL, 0);
if (flags == -1) { ... }
flags |= O_NONBLOCK;
if (fcntl(sfd, F_SETFL, flags) == -1) { ... }
......
接受套接字选项:
......
int infd = accept(sfd, &in_addr, &in_len);
if (infd == -1) { ... }
auto flags = fcntl(infd, F_GETFL, 0);
if (flags == -1) { ... }
flags |= O_NONBLOCK;
if (fcntl(infd, F_SETFL, flags) == -1) { ... }
int val = true;
if (setsockopt(infd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val)) == -1) { ... }
......
提前致谢!
最佳答案
Nagle 算法可能会有所帮助,但只有当您的瓶颈是往返传输本身时,它才会有所帮助。假设您的“写入时间”仅基于数据包 TX 时间(例如:从写入套接字到数据离开适配器的时间),禁用此算法不会解决您的解决方案。基于 TCP 连接的固有流性质,可能没有可靠的解决方法……如果时间真的那么关键,请考虑使用 UDP,尤其是因为您的数据包很小。如果 TCP 是必需的,可以考虑使用不同的套接字库。不过老实说,我觉得你的时机并没有那么可怕。
关于c++ - 如何加速写入tcp套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45875350/