【发布时间】:2015-10-30 07:14:30
【问题描述】:
我正在尝试从哪里开始了解可能导致套接字停止的原因,并且希望你们中的任何人都可以提供任何见解。
因此,服务器是运行 Windows 2012 的现代双套接字至强(2 x 6 核 @ 3.5 ghz)。在单个进程中,有 6 个具有默认选项的阻塞 tcp 套接字,每个都在自己的线程上运行(未指定 numa/core)。其中 5 个连接到同一个远程服务器并接收非常重的负载(每秒数十万个约 75 字节的小消息)。最后一个套接字连接到不同的服务器,管理消息的发送/接收负载非常轻。
我遇到的问题是管理消息套接字中的 5 秒停顿。对套接字的多次发送调用成功返回,但是没有从远程服务器收到任何内容(应该在毫秒内收到协议确认)或远程管理服务器收到 5 秒。就好像那个插座刚刚关了一会儿。 5秒的失速过去后,所有的ack都来了,之后一切正常。在此期间,其他套接字接收到的消息数量比正常情况多得多,但是没有任何中断或停止的迹象,因为数据日志没有显示任何异常(光记录,可能是 500 消息/秒)。
据我了解,套接字发送调用并不能确保数据已经在线上输出,只是成功传输到 tcp 堆栈。因此,我试图了解可能发生的不同情况,这些情况会导致管理套接字上的 5 秒停顿。是否有可能由于接收到大量数据,tcp 堆栈基本上不堪重负,并优先考虑那些使用最频繁的套接字?还有哪些其他情况可能导致这种情况?
谢谢!
【问题讨论】:
-
服务器的 SSD 是否快满了?
-
不,它非常简单且全新。 23gb 使用 65gb 分区。 2 磁盘 150gb 板载 raid1。我也考虑过磁盘,但记录器在它自己的线程中,并且在停顿期间没有任何打嗝。
-
欢迎使用 TCP/IP。延迟的可能性几乎是无限的。我不是在开玩笑。 TCP 保证交付,但不保证何时交付。不要将它用于时间紧迫的消息。由于拥塞控制导致的一些丢失数据包的重传延迟是最有可能的候选者。
-
可以想象,内核忙于处理由入站数据引起的中断,以至于它无法处理出站数据,这比中断处理的优先级低。 或者 admin peer 读取速度很慢,所以它的接收窗口被关闭了,所以出站数据根本无法传输。
-
@user4581301,是的,但是 5 秒?从阅读 Windows TCP 传输延迟,据我了解,最大等待时间应该是 200 毫秒。
标签: c++ windows sockets networking tcp