【发布时间】: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),那么同时写入多个文件可能会导致硬盘磁头来回寻找很多,并且这可能是一个真正的性能杀手。