gpt4 book ai didi

sockets - 异步套接字通信和堆碎片

转载 作者:行者123 更新时间:2023-12-03 12:05:28 26 4
gpt4 key购买 nike

我编写了一个多线程的Socket Server应用程序,该应用程序接受1000个以上的并发连接。最近,我们发生了应用程序崩溃;分析转储文件后,我们知道应用程序由于堆损坏而崩溃。我发现在以下链接中讨论了相同的问题。

.NET Does NOT Have Reliable Asynchronouos Socket Communication?
http://support.microsoft.com/kb/947862

讨论还提出了3个解决方案。

  • 网络应用程序应在其发布的未完成异步IO数量上设置上限。
  • 使用Microsoft CCR
  • 使用TPL

  • 由于时间因素,我本来会坚持使用#1,但是我不清楚如何实现此目标。可以给一个好的起点吗?

    还有没有人将Async与TPL结合使用来解决此问题?

    最佳答案

    在您所指的答案中,您的意思是比blog posting that I linked to更好的起点吗?

    问题是这样的:

  • 在异步写操作期间使用的内存和其他每操作资源通常被“使用”,直到远程对等方的TCP堆栈确认数据并且本地堆栈可以完成异步写操作以告诉您可以重用缓冲区为止。
  • 本地对等方对此无能为力,因为这全部由远程对等方从其套接字读取数据的速度以及两个对等方之间的链路拥塞所决定。

  • 由于上述原因,您需要对任何时候都未完成的异步写入数量进行硬性限制。您可以在发出异步写入并在完成处理程序中将其递减之前通过增加一个计数器来对其进行跟踪。

    达到该极限后,您该怎么做取决于您自己。在原始文章中,我赞成将要写入的数据放入其中的队列。然后,可以在写入完成时将此队列用作数据源。队列为空后,您可以再次正常发送。当然,这只是解决了问题-您仍然拥有由远程同位体控制的内存资源(排队的数据),但是您也没有使用其他操作系统资源(非页面缓冲池,I/O页面锁定限制,等等)。

    您可以在达到限制时停止对等方的发送-现在,基于异步API构建的API需要具有“目前无法发送,请稍后重试”的功能,而以前的发送方式通常是“工作”。

    如果执行此操作,我还将认真考虑避免发生固定内存问题,方法是在一个连续的块中分配一个较大的缓冲区,然后从池中使用它们。

    关于sockets - 异步套接字通信和堆碎片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19970135/

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