【问题标题】:Multiple TCP streams interfere with each other多个 TCP 流相互干扰
【发布时间】:2013-05-09 01:04:37
【问题描述】:

我有一个连接到 NFS 服务器并写入数据的客户端。它是一个多进程应用程序,可以创建与进程一样多的 TCP 连接。问题是,如果我尝试一个进程,写入时的套接字阻塞很少(即 poll() 不会暂停)。如果我将进程数增加到 8 个或更多,我会发现自己在大约 30% 的时间里被每个套接字上的 poll() 阻塞。使用具有独立发送/接收缓冲区的多个 TCP 流的目的不是这样,所以它们不应该像这样阻塞吗?为什么有多个流相互干扰?链接远未达到饱和(用 iperf 测试)。

我的想法是 NFS 服务器将为每个 TCP 连接创建一个套接字,并且它们将拥有自己的接收缓冲区。我知道我正在为每个进程创建单独的 TCP 套接字,所以它们应该有自己的发送缓冲区。如果我没有使链接饱和,为什么套接字会阻塞?

【问题讨论】:

  • 你有pollout设置吗? linux.die.net/man/2/poll
  • 是的,我正在调用 poll 并设置 pollout 以查看 poll() 是否会阻塞,记录结果,然后使用实际超时值调用 poll。这样做可以让我在 30% 的时间内进行轮询阻塞,并且性能不是我所期望的。
  • 难道 NFS 服务器无法满足您应用的所有请求吗?
  • 是否所有的套接字都连接到同一个 NFS 服务器?如果是这样,可能是 NFS 服务器没有跟上传入 TCP 数据的多个流。如果服务器读取速度不够快,无法跟上,TCP 协议会告诉您的发送进程放慢速度。
  • 请注意,如果 NFS 服务器正在写入旋转硬盘(即不是 SSD),那么同时写入多个文件可能会导致硬盘磁头来回寻找很多,并且这可能是一个真正的性能杀手。

标签: c sockets tcp


【解决方案1】:

您假设网络具有无限带宽,并且服务器具有无限容量来处理您发送的请求。在任何一种情况下都不是。线性增加 TCP 连接的数量不会线性增加性能。只有一个网络;只有一台服务器;它只有这么多 CPU;而且它只有这么多磁盘。网络迟早会被填满,或者服务器会陷入瘫痪,这将作为写入停滞反映给您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多