加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 为什么数据位于Send-Q? TCP会话冻结

发布时间:2020-12-14 02:43:32 所属栏目:Linux 来源:网络整理
导读:问题 我为20-50个用户运行IRC服务器.我们有时会遇到没有及时到达或根本没有到达的消息的问题.在一些数据包捕获后,我们确定消息位于服务器的“Send-Q”中.当消息没有到达时,我将查看“netstat -ct”输出并看到如下内容: Proto Recv-Q Send-Q本地地址外部地址
问题

我为20-50个用户运行IRC服务器.我们有时会遇到没有及时到达或根本没有到达的消息的问题.在一些数据包捕获后,我们确定消息位于服务器的“Send-Q”中.当消息没有到达时,我将查看“netstat -ct”输出并看到如下内容:

Proto Recv-Q Send-Q本地地址外部地址状态
tcp 0 1756 ubuntu:ircd 10.8.1.7:63602 ESTABLISHED

有时,如果我等待几分钟,Send-Q将转到0并且消息将被传递,其他时间客户端超时.我的问题是,为什么不只是传递信息?是什么原因让他们坐在Send-Q这么久?

sshd也表现出类似的行为,我的ssh会话有时会冻结,有时会超时.

背景

不确定这里的基础设施是否与问题有关,所以这就是它的样子:这些客户端在Windows 7上与OpenVPN连接. OpenVPN服务器位于PFSense上,IRC服务器位于连接到PFSense的本地(NAT’d)LAN上.我有一个防火墙规则允许客户端与服务器上的6667通信.

调查…

延迟/丢失 – 看起来足够好.不是最好的链接,但我认为这对IRC和SSH没问题.这是从我的客户端到服务器的ping,这是我的IRC和SSH间歇性挂起:

Ping statistics for 10.8.5.2:
    Packets: Sent = 4478,Received = 4460,Lost = 18 (0% loss)

以毫秒为单位的近似往返时间:
最小值= 17.2 ms,最大值= 273.4 ms,平均值= 32.3 ms

MSS / MTU问题 – MTU似乎没问题.我的客户端上的OpenVPN mtu-test说:

Thu Dec 03 12:41:21 2015 NOTE: Empirical MTU test completed [Tried,Actual] local->remote=[1589,1589] remote->local=[1589,1589]

……这是我的手动测试:

> ping -f -l 1472 10.8.5.2

Pinging 10.8.5.2 with 1472 bytes of data:
Reply from 10.8.5.2: bytes=1472 time=23ms TTL=63

> ping -f -l 1473 10.8.5.2

Pinging 10.8.5.2 with 1473 bytes of data:
Packet needs to be fragmented but DF set.

带宽/吞吐量 – 进行了一些iperf测试,以确保没有吞吐量问题.再次,看起来不错:

iperf -c 10.8.5.2
------------------------------------------------------------
Client connecting to 10.8.5.2,TCP port 5001
TCP window size: 63.0 KByte (default)
------------------------------------------------------------
[  3] local 10.8.0.23 port 18587 connected with 10.8.5.2 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  26.0 MBytes  21.8 Mbits/sec

谢谢,任何帮助理解“发送Q”或有关此问题的更具体的想法将不胜感激.如果我能在这里提供更多信息,请告诉我.

更新

发现我实际上有大量数据包丢失.来自客户端> VPN的ping没有显示这一点,但是当使用来自VPN->客户端的fping时非常明显.我注意到它只是Windows客户端,重新安装最新的OpenVPN客户端似乎已经修复了损失.它可能与通过磁盘映像安装的OpenVPN TAP适配器有关.每台机器手动安装似乎可以解决问题.

解决方法

当应用程序将数据写入其本地内核TCP堆栈时,数据将进入发送队列.当另一方的TCP堆栈确认收到数据时,数据将从发送队列中删除.如果它们位于发送队列中,这意味着您的IRC服务器代码已将它们发送到您的内核,但连接的另一端尚未确认它们.这可能是因为它们尚未发送.这可能是由服务器带宽限制或服务器性能限制引起的,但最常见的仅仅是因为另一方没有像服务器发送数据那样快地接收数据.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读