gpt4 book ai didi

c# - 异步服务器设计

转载 作者:太空宇宙 更新时间:2023-11-03 13:41:10 25 4
gpt4 key购买 nike

我们有一个服务器从 500-1500 个 GPS 设备接收数据。每个设备每 10-30 秒发送一个包含大约 1-4 个 GPS 坐标的数据包。服务器是异步设计的,监听器使用 BeginEndAccept 处理连接,使用 BeginEndReceive 处理通信。一旦接收到数据包,数据就会被处理并存储在数据库中。

在少数设备(500-700 台设备)的情况下,这只需要 50 毫秒,并且我们运行的并发线程少于 50 个,CPU 使用率是真实的 (20-40%)。然而,当服务器承受连接压力(1000+)时,线程数量激增至 500-600,CPU 使用率也下降到百分之几。处理时间也增加到几分钟。

对于以这种速率发送许多小数据包的这种特定情况,异步设计是否不利,或者可能是代码中的问题?

我们目前不得不在三台服务器上分配负载以容纳所有设备,它们都是 Hyper-V 服务器上托管的具有 6 个 CPU 和 4GB 内存的虚拟机。

解决方案:

我从人们的回答中找到的解决方案是使用 .Net 并行库将其立即安排为任务,因为这在跨多个内核安排线程时更加智能:

void EndReceive(IAsyncResult res)
{
Task.Factory.StartNew((object o) => { HandleReceive(o as IAsyncResult); }, res, TaskCreationOptions.PreferFairness);
}

现在线程很少超过50个。

最佳答案

这听起来像是在您的应用程序的某处使用了非异步 IO,您在其中阻塞了操作的结果。您可能在许多地方使用了适当的异步,例如从服务器与客户端的主要连接,但在连接到数据库或类似的东西时您可能没有使用。这种异步和非异步的混合可能是您创建这么多线程的原因。

通过确保您没有阻塞 IO,它应该确保您没有大量线程池线程无所事事,这似乎就是您所处的情况。

关于c# - 异步服务器设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16964712/

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