Linux TCP:发送方为高Send-Q,接收方为零Recv-Q

时间:2016-12-24 12:59:54

标签: linux sockets tcp

怎么可能:

  1. 两台计算机之间有一个TCP套接字
  2. 经过一些成功的双向通信后,发送方应用程序在读取时无法写入套接字和接收方
  3. netstat报告发送方的套接字的Send-Q(几兆字节)很高(即使经过几个小时的等待,该值也不会改变)
  4. netstat报告接收器上的套接字零Recv-Q
  5. tcpdump报告套接字上唯一的活动是周期性(双分钟)ACK,没有来自发送方的数据和立即ACK响应,没有来自接收方的数据
  6. 为什么发送方机器不会尝试将排队数据发送到接收方?

2 个答案:

答案 0 :(得分:2)

这很可能是由其他问题引起的,但是如果您没有尝试过,可能会在可能的帮助下(这些数字是示例,请您找到自己的数字):

  1. 估计发送方和接收方文件系统的读写速度以及网络速度,并在rsync中设置适当的带宽限制: -bwlimit = 1024 (1024 KBps )
  2. 如果发送方和接收方在此局域网中都有专用的NIC,请帮帮忙,增加这些NIC的MTU: ifconfig eth1 mtu 65744
  3. 增加发送方传输队列的长度: ifconfig eth1 txqueuelen 4096
  4. 增加内核的发送/接收内存:
    将它们添加到 /etc/sysctl.conf 文件中
    net.core.wmem_max = 16777216
    net.core.rmem_max = 16777216
    net.ipv4.tcp_rmem = 4096 262144 16777216
    net.ipv4.tcp_wmem = 4096 262144 16777216

    之后再运行 sysctl -p
  5. 如果您同步非常大的文件系统,请确保fs.file-max足够大,
    进行检查: sysctl fs.file-max >
    要增加它,请在文件 /etc/sysctl.conf 中添加一行 fs.file-max = 327679
    在您的rsync用户上,运行: ulimit -n 327679

答案 1 :(得分:0)

我的情况是,客户端以8KB的块数写入数据,服务器尝试读取8KB,然后服务器将其写入RAID0磁盘。对于上传大文件,我遇到了类似的情况,并且增加了我从服务器端套接字读取的数据量。我将从套接字读取的内部缓冲区的大小增加到1MB(从8 kB开始)并且它有所帮助。我不确定这是因为RAID还是tcp,但它可能是你想尝试的另一件事。