(如何)我可以减少套接字延迟吗?

Ray*_*y2k 2 c sockets linux latency client-server

我编写了一个HTTP代理,它做了一些与此无关的东西,但它增加了客户的服务时间(600us没有代理,60000us).我想我已经找到了大部分时间来自哪里 - 在我的代理完成发送回客户端和客户完成接收之间.目前,服务器,代理和客户端在同一主机上运行,​​使用localhost作为地址.

一旦代理完成发送(至少从send()返回后),我打印gettimeofday的结果,给出一个绝对时间.当我的客户收到时,它会输出gettimeofday的结果.由于它们都在同一主机上,因此这应该是准确的.所有send()调用都没有标志,因此它们是阻塞的.两者之间的差异大约是40000us.

它侦听客户端连接的代理套接字使用提示AF_UNSPEC,SOCK_STREAM和AI_PASSIVE进行设置.推测来自accept()的套接字将具有相同的参数?

如果我正确地理解了这一切,那么Apache设法在600us内完成所有工作(包括导致40000us延迟的相应内容).任何人都可以提出可能导致此问题的原因吗?我已经尝试设置TCP_NODELAY选项(我知道我不应该,只是为了看它是否有所不同)并且完成发送和完成接收之间的延迟时间下降,我忘记了数字但是<1000us.

这一切都在Ubuntu Linux 2.6.31-19上.谢谢你的帮助

mar*_*k4o 39

40ms是Linux上的TCP ACK延迟,这表明您可能在延迟的acks和Nagle算法之间遇到了错误的交互.解决这一问题的最好的办法是所有的数据使用单个调用发送send()或者sendmsg(),等待响应之前.如果不可能,则某些TCP套接字选项TCP_QUICKACK(包括(在接收方),TCP_CORK(发送方)和TCP_NODELAY(发送方))可以提供帮助,但如果使用不当也可能会受到影响. TCP_NODELAY简单地禁用Nagle算法并且是套接字上的一次性设置,而其他两个必须在连接的生命周期中的适当时间设置,因此可能更难以使用.

  • 对于"如何减少套接字延迟?"这个问题,这个答案是最好的答案. - 这是个问题.不要高举解决OP特定问题的答案,这不是使这个网站如此强大的原因.这个网站很棒,因为我们可以快速找到解决我们问题的方法.所以,如果你是一个真正的StackOverflow'er,这种答案是你评价的那个(至少恕我直言). (5认同)

Mar*_*rkR 5

您无法在同一主机上的客户端,代理和源服务器的代理上进行有意义的性能测量.

将它们全部放在网络上的不同主机上.使用真正的硬件机器或专用硬件测试系统(例如思博伦).

你的方法没有意义.无论如何,在实践中没有人有600us的原始服务器延迟.在同一主机上运行所有任务会产生争用和完全不可靠的网络环境.

  • -1:你当然可以通过localhost学习很多关于延迟的知识,比如有一个Nagle算法和一个40毫秒的延迟和非常短的数据包. (3认同)