Out of Memory Threading - Perf Test Tool

时间:2013-02-25 20:03:02

标签: c# multithreading threadpool out-of-memory

我正在创建一个加载测试的工具(发送http:GETs),它运行正常但最终因为内存不足错误而死亡。

ASK:如何重置线程,以便此循环可以连续运行而不会出错?

    static void Main(string[] args)
    {
       System.Net.ServicePointManager.DefaultConnectionLimit = 200;

       while (true)
        {
            for (int i = 0; i < 1000; i++)
            {
                new Thread(LoadTest).Start(); //<-- EXCEPTION!.eventually errs out of memory
            }
            Thread.Sleep(2);
        }
    }

    static void LoadTest()
    {
        string url = "http://myserv.com/api/dev/getstuff?whatstuff=thisstuff";

        // Sends http get from above url ... and displays the repose in the console....
    }

3 个答案:

答案 0 :(得分:1)

使用ThreadPool并使用QueueUserWorkItem而不是创建数千个线程。线程是昂贵的对象,毫不奇怪,你的内存不足,而且你将无法在这么多线程中获得任何性能(在你的测试工具中)。

答案 1 :(得分:1)

你的代码片段创建了很多线程,难怪它最终耗尽了内存。最好在这里使用一个线程池。 你的代码看起来像这样:

    static void Main(string[] args)
    {
        System.Net.ServicePointManager.DefaultConnectionLimit = 200;
        ThreadPool.SetMaxThreads(500, 300);
        while (true)
        {
            ThreadPool.QueueUserWorkItem(LoadTest);
        }
    }

    static void LoadTest(object state)
    {
        string url = "http://myserv.com/api/dev/getstuff?whatstuff=thisstuff";
        // Sends http get from above url ... and displays the repose in the console....
    }

答案 2 :(得分:1)

您正在实例化线程左右中心。这可能是你的问题。你想要替换

new Thread(LoadTest).Start();

Task.Run(LoadTest);

这将在ThreadPool中的Thread上运行LoadTest,而不是每次都使用资源来创建新的Thread。然而。这将暴露出另一个问题。

ThreadPool上的线程是一种有限的资源,您希望尽快将Threads返回给ThreadPool。我假设您使用的是同步下载方法而不是APM方法。这意味着当请求被发送到服务器时,产生请求的线程正在休眠,而不是去做其他工作。

使用(假设.net 4.5)

var client = new WebClient();
var response = await client.DownloadStringTaskAsync(url);
Console.WriteLine(response);

或使用回调(如果不是.net 4.5)

var client = new WebClient();
client.OnDownloadStringCompleted(x => Console.WriteLine(x));
client.BeginDownloadString(url);