gpt4 book ai didi

c++ - 多个 tcp 套接字,一个停止

转载 作者:可可西里 更新时间:2023-11-01 02:42:35 25 4
gpt4 key购买 nike

我正试图找到一个起点,了解从哪里开始了解可能导致套接字停顿的原因,并感谢你们中的任何人提供的任何见解。

因此,服务器是运行 windows 2012 的现代双路至强处理器(2 x 6 核 @ 3.5 ghz)。在单个进程中,有 6 个具有默认选项的阻塞 tcp 套接字,每个都在自己的线程上运行(未指定 numa/core)。其中 5 个连接到同一个远程服务器并接收非常重的负载(每秒数十万个 ~75 字节的小消息)。最后一个套接字连接到另一个服务器,发送/接收负载非常轻,用于管理消息传递。

我遇到的问题是管理消息套接字中的 5 秒停顿。对套接字的多次发送调用成功返回,但是没有从远程服务器收到任何东西(应该在几毫秒内收到协议(protocol)确认)或者远程管理服务器在 5 秒内没有收到任何东西。就好像那个 socket 刚刚关闭了一点。 5秒停顿过后,所有的ack齐发,之后一切正常。在此期间,其他套接字接收到的消息数量比正常情况多得多,但是没有任何中断或停顿的迹象,因为数据日志没有显示任何异常(轻记录,可能是 500 条消息/秒)。

据我所知,socket send 调用并不能确保数据已经通过网络发送出去,只是确保成功传输到 tcp 堆栈。所以,我试图了解可能发生的不同场景,这些场景会导致管理套接字出现 5 秒的停顿。是否有可能由于接收到大量数据,tcp 堆栈基本上不堪重负,并优先考虑使用最频繁的套接字?还有哪些其他情况可能会导致这种情况?

谢谢!

最佳答案

如果套接字每秒接收数十万条 75 字节的消息,则服务器可能已达到最大容量并拥有某些资源。也许不是带宽,因为 100K 消息可能会消耗大约 10Mbps。但这可能是 CPU 利用率。

你应该使用两种工具来理解你的问题:

  • perfmon 查看 CPU(用户和特权 https://technet.microsoft.com/en-us/library/aa173932(v=sql.80).aspx)、内存、带宽和磁盘队列长度的利用率。您还可以使用 perfmon 检查中断和上下文切换的数量。
  • 像 Wireshark 这样的嗅探器,用于查看是否在 TCP 级别传输数据以及是否收到响应。
  • 我会做的另一件事是在发送调用之后以及读取调用之前和之后在负责管理套接字的线程中写入时间戳。可能是编码问题。

发送调用成功返回的事实并不意味着数据被立即发送。在 TCP 中,数据将存储在发送缓冲区中,TCP 堆栈将数据从那里发送到另一端。

如果你的系统是 CPU bound(你可以用 perfmon 查看是否是这样),那么你应该注意@EJP 写的评论,这是当机器负载很重时可能发生的事情。使用我提到的工具,您可以查看管理套接字中的接收窗口是否已关闭,或者只是套接字读取在管理套接字中占用了时间。

关于c++ - 多个 tcp 套接字,一个停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31867620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com