【问题标题】:App for sending large HTTPWebRequest is crashing with outofmemory exception用于发送大型 HTTPWebRequest 的应用程序因内存不足异常而崩溃
【发布时间】:2012-04-20 14:24:18
【问题描述】:

要求是为 Web 服务的压力测试创建一个应用程序。 想法是将 1000K 大小为 4 KB 的 HTTPWebRequest 轰炸到 Web 服务 为了实现这一点,我们创建了一个应用程序,其结构类似于几个线程正在添加要在队列中发送的数据,而线程池正在异步发送这些请求。 Task responseTask = Task.Factory.FromAsync(testRequest.BeginGetResponse, testRequest.EndGetResponse, null);" 但是现在发生的事情是经过一段时间后,每秒请求数显着减少(可能是因为服务的响应时间增加了..但是如果我们再次异步发送请求,响应会时间问题?)。除此之外,一段时间后,该工具崩溃并显示“应用程序已停止工作”消息,并且异常显示为内存不足异常。

我观察到的一件事是在应用程序崩溃之前,Web 服务的响应时间显着增加。是不是间接导致崩溃的原因?

有什么治疗方法?

【问题讨论】:

  • 我认为减速是由 GC 试图跟上造成的。

标签: c# httpwebrequest


【解决方案1】:

也许您在没有限制的情况下将任务排队,因此待处理请求的数量会无限增加。即使使用异步行为,您也需要节流。

【讨论】:

  • 感谢您的回复。早些时候我也认为这可能是原因。但是,我通过将进程的私有字节限制为 500 MB 来限制排队。我知道这是更高的限制。我还观察到,在限制之后,应用程序的处理器利用率显着增加。有什么理由吗?
  • 好的,当你限制进程的内存时(你是怎么做到的?)你当然会导致 OOM 错误。毕竟,你否认自己的记忆。应用程序变慢了,因为 GC 正疯狂地尝试释放字节,因为它没有剩余空间来扩展。大量 G2 集合拖慢了您的进程。
  • System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess(); long privateSetSizeInBytes = currentProcess.PrivateMemorySize64;长 privateSetSizeInMBytes=privateSetSizeInBytes/1024/1024; if (privateSetSizeInMBytes
  • 嗯,我的解释不适用于这种情况(我假设您使用了 Windows 作业对象)。我的下一个猜测是使用和释放大量缓冲区会导致内存碎片。 Socket IO 正在固定 IO 中使用的 byte[]。尝试将所有缓冲区合并为一个或几个大数组(大小为 16mb 左右)。
  • dint 让您正确.. 将所有缓冲区合并到一个或几个大数组中是什么意思?
猜你喜欢
  • 2013-04-18
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 2016-08-06
  • 2012-10-25
  • 2012-07-01
相关资源
最近更新 更多