【问题标题】:Performance Implication of Creating New TCP Connection Per Message每条消息创建新 TCP 连接的性能影响
【发布时间】:2011-10-06 00:43:26
【问题描述】:

过去,我们的服务器应用程序被设计成客户端创建一个 TCP 连接,无限期地保持此连接建立,并在需要时发送消息。这些消息可能以高容量突发形式出现,或者中间有较长的空闲时间。我们现在正在切换到不同的连接协议,客户端将为每条消息创建一个新连接,然后在发送后断开连接。

我有几个问题:

  1. 我知道 3 次握手建立连接有一些开销。但这种开销是否很大(cpu、内存、带宽等)?

  2. 已建立的已空闲几分钟的 TCP 连接传输消息的延迟与创建新连接并发送消息的延迟之间是否存在差异?

  3. 如果我试图确定切换到这种新连接协议与旧连接协议相比对性能的影响,是否还有其他因素/考虑因素需要考虑?

非常感谢任何帮助。

【问题讨论】:

  • 您还应该考虑每次发送消息时启动 3 次握手的延迟影响
  • 你为什么要这样做?你走错了方向。几十年来,其他所有人都在疯狂地向他们的应用程序和中间件层添加连接池。

标签: performance sockets networking service tcp


【解决方案1】:

打开和关闭大量 TCP 会话可能会影响连接跟踪防火墙和负载平衡器,导致它们变慢甚至失败并拒绝连接。有些,如 Linux iptables conntrack,对跟踪的连接数有中等的默认值。

如果程序循环消息太快,可能会用完可用的本地端口号。在套接字可以被视为“关闭”之前有一个 TCP 超时。通常有一个操作系统计时器来清理这些关闭的连接。如果过多的套接字打开得太快,操作系统可能来不及清理。

握手会为您的带宽成本增加大约 80 个字节。 TCP 连接关闭也涉及到 FIN 或 RST 数据包,尽管这些标志可能与数据包结合使用。

如果为消息发送者打开 Nagle 算法,已建立的 TCP 会话中的延迟可能会稍高一些。 Nagle 使操作系统在发送部分填充的数据包之前等待更多数据。正在关闭的 TCP 会话将刷新所有数据。通过使用 TCP_NODELAY 标志禁用 Nagle,可以在打开的会话中获得相同的效果。

【讨论】:

  • 握手需要三个最小大小为 40 字节的 TCP 段,共 120 个,最后一个可以捎带数据。
  • @EJP:你还有两个 F 包。
  • 握手还是三段。结束的 FIN segments 和它们的 ACKS 是另外 四个 段,所有这些都可以被搭载。
  • @EJP:是的。将其固定为 80 字节。
猜你喜欢
  • 2012-10-18
  • 2016-02-04
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 2021-08-15
  • 2021-02-18
  • 1970-01-01
  • 2015-07-04
相关资源
最近更新 更多