【发布时间】:2012-02-17 21:44:41
【问题描述】:
背景:
- C# .net 同步 Tcp 服务器
- 通过使用 AcceptTcpClient 方法阻塞 TcpListener 来分配 TcpClient 对象
- 一旦有了 TcpClient 对象,我就将它传递给调用客户端的 GetStream 方法以创建 NetworkStream 的线程
- 此 NetworkStream 循环,在每次迭代中执行 networkStream.Read(someBuffer, 0, 4096)
- 现在客户端和服务器位于同一个网络上,没有拥塞可言
- 我的服务器有足够的可用内存
- 如果我将服务器软件加载到另一台机器上,问题就会消失
- 踢球者:来自网络 Linux 机器的流量可以按时顺利通过
我的服务器已经运行好几个月了。然而,在过去的周末,进程开始的地方( tcpListener.AcceptTcpClient() )每隔几分钟才发生一次,而不是快速连续接收小字节组。所以我的服务器处于空闲状态,然后将 30-50 个客户端请求全部捆绑到一个巨大的字节块中。不用说,这会导致巨大的延迟并给我的服务器带来压力。如果客户端请求的集群足够大,我的服务器可能需要 30 分钟才能赶上。
在我的客户端内置的日志记录中,我可以看到它们进行网络写入,并在每个写入之间刷新。所以客户端运行正常。
这意味着某种系统干预。是我的 Tcp 服务器(如上所述)坏了,还是 Windows 中的某些东西干扰了我的流量,我怎么知道?
谢谢大家。
【问题讨论】:
-
我想问题是,周末发生了什么变化?代码更改?网络维护?清洁工将路由器换成真空吸尘器?
-
不更改代码,不更改服务器。我正在四处寻找更多,看看还有什么可以改变的。
-
没有服务包应用到服务器?这听起来像是一个连接问题,尤其是。因为您的代码已经运行了一段时间并且仍然在另一台机器上运行。不确定您所在的组织类型,但在大公司,如果网络管理员更改您的交换硬件或服务器管理员应用 SP,则可能会发生这种情况。
-
@ChrisShain 奇怪的是,我基于 Windows 的客户端流量延迟了,但从 Linux 服务器到我的 .net Tcp 服务器的流量按时通过,很好。
-
也许您的客户都被转移到了另一个子网,与您的服务器子网的连接很糟糕。这绝对是网络问题。