如何加速写入tcp套接字?

时间:2017-08-25 06:09:19

标签: c++ sockets tcp

我在Web服务器上工作,返回微小的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) { ... }
......

提前谢谢!

1 个答案:

答案 0 :(得分:0)

Nagle算法可能有所帮助,但只有当您的瓶颈是往返转移本身时才有用。假设您的“写入时间”仅基于数据包TX时间(例如:从写入套接字到数据离开适配器的时间),禁用此算法将无法修复您的解决方案。基于TCP连接的固有流特性,可能没有可靠的解决方法......如果时间确实非常重要,请考虑使用UDP,尤其是因为您的数据包很小。如果TCP是必需的,可以考虑使用不同的套接字库。但老实说,你的时间对我来说似乎并不那么可怕。