2

我们正在设计一个压力测试应用程序,它将向特定的 Web 服务发送大小为“1 MB”的大量 HTTP 请求。为了实现压力,我们在应用程序中使用了多个线程。结构类似于我们有 X EnqueueThreads,它将创建 HTTPRequest 数据并将其添加到队列中。Y WorkerThreads 会将请求出列,并将它们提交给 Web 服务。所有请求都是异步的。现在这里的问题是,Enqueue 线程的工作速度比 WorkerThreads 快得多,因此如果没有停止/等待条件,它们将添加请求,直到抛出内存不足异常,从而使注入器(该实用程序将在其中运行)慢的。目前我们正在处理 OutOfMemory 异常并使 enqueuethreads 休眠一段时间。

但是我想知道对使用有限系统资源(特别是内存)的最佳方法应该是什么的看法。?提前致谢。

4

2 回答 2

4

在这样的场景中,您可以并且可能应该使用MemoryFailPoint 类

如果您收到OutOfMemoryException,则应用程序状态可能已损坏,您不应尝试从中恢复。MemoryFailPoint旨在通过允许您确定降低应用程序的速度来避免这种情况,从而避免内存不足。您让框架确定您是否可以执行该操作,而不是根据您的应用程序使用的内存量来猜测您“认为”可以逃脱多少。

您还应该通过垃圾收集器检查内存使用情况,而不是通过进程来准确读取实际分配了多少托管内存。使用私有内存大小将使您的读数低得多,并且您仍然可能陷入内存不足的情况,尽管看起来您有足够的余地。

MSDN 页面上的代码示例显示了如何估计操作的内存使用情况,并使用该信息等待内存可用,然后再尝试处理更多请求。如果您可以确定需要大量内存的代码区域,这是限制它并避免内存不足的好选择。

于 2013-06-02T07:26:17.053 回答
3

好吧,根据问题的主题,避免内存不足异常的最佳方法是不创建填充该内存的对象。

处理异常是最简单的解决方案,尽管随着时间的推移可能会给应用程序带来不同的困难和不一致。另一种方法是获取可用大小的内存资源,如下所示:

Process currentProcess = Process.GetCurrentProcess();
long memorySize = currentProcess.PrivateMemorySize64

然后,您可以根据对一个对象内存容量的估计来计算队列的长度。

另一种方法是检查每个工作线程中的内存大小。只要没有内存,线程就可以结束。这样,许多线程将产生和死亡,但应用程序将处于最大可用容量。

于 2012-04-06T05:42:53.367 回答