首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何加速对tcp套接字的写入?

如何加速对tcp套接字的写入?
EN

Stack Overflow用户
提问于 2017-08-25 14:09:19
回答 1查看 287关注 0票数 4

我在一个web服务器上工作,它返回极小的JSON (大约200字节)。业务逻辑花费大约2-3微秒,但是写入套接字花费大约25微秒。我对单缓冲区使用write,对多缓冲区使用writev

我已经通过启用TCP_NODELAY禁用了Nagle的算法。有没有其他加速写作的方法?

侦听套接字选项:

代码语言:javascript
复制
......
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) { ... }
......

接受的套接字选项:

代码语言:javascript
复制
......
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) { ... }
......

提前谢谢你!

EN

回答 1

Stack Overflow用户

发布于 2017-08-25 20:00:36

Nagle算法可能会有所帮助,但只有当您的瓶颈是往返传输本身时,它才会有所帮助。假设您的“写入时间”仅基于数据包TX时间(例如:从写入套接字到数据离开适配器的时间),禁用此算法将无法修复您的解决方案。基于TCP连接的固有流特性,可能没有可靠的workaround...If。计时真的那么关键,考虑使用UDP,特别是当你的数据包很小的时候。如果TCP是必需的,可以考虑使用不同的套接字库。不过,老实说,你的时机对我来说并不是那么可怕。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45875350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档