Можем ли мы создать 300 000 потоков в приложении C # и запустить его на ПК? - PullRequest
7 голосов
/ 07 июня 2011

Я пытаюсь имитировать сценарий, когда 300 000 потребителей получают доступ к серверу.Поэтому я пытаюсь создать псевдо-клиентов, многократно запрашивая сервер из параллельных потоков.

Но первое препятствие, которое необходимо устранить, это возможность запуска 300 000 потоков на ПК?Вот код, который я использую, чтобы узнать, сколько я могу получить максимальных потоков, а затем заменить тестовую функцию фактической функцией:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace CheckThread
{
    class Program
    {
        static int count;

        public static void TestThread(int i)
        {
            while (true)
            {
                Console.Write("\rThread Executing : {0}", i);
                Thread.Sleep(500);
            }
        }

        static void Main(string[] args)
        {
            count = 0;
            int limit = 0;
            if (args.Length != 1)
            {
                Console.WriteLine("Usage CheckThread <number of threads>");
                return;
            }
            else
            {
                limit = Convert.ToInt32(args[0]);
            }
            Console.WriteLine();
            while (count < limit)
            {
                ThreadStart newThread = new ThreadStart(delegate { TestThread(count); });
                Thread mythread = new Thread(newThread);
                mythread.Start();
                Console.WriteLine("Thread # {0}", count++);
            }

            while (true)
            {
                Thread.Sleep(30*1000);
            }
        } // end of main
    } // end of CheckThread class
} // end of namespace

Теперь то, что я пытаюсь сделать, может быть нереальным, ноТем не менее, если есть выход, и вы знаете, тогда, пожалуйста, помогите мне.

Ответы [ 5 ]

6 голосов
/ 07 июня 2011

Каждый поток создаст свой собственный стек и локальное хранилище, вы смотрите примерно 512 КБ стекового пространства на поток в 32-битной ОС, я думаю, что пространство стека удваивается в 64-битной ОС.Краткий обзор калькуляции электронных таблиц дает нам 146,484375 гигабайт стекового пространства для ваших клиентов 300k.

Так что нет, не создавайте потоки 300k, а используйте пул потоков для имитации запросов 300k, хотя я думаю, чтобыло бы лучше, если бы несколько тестовых клиентов рассылали спам по вашему серверу через сетевой интерфейс.

Существует множество инструментов веб-нагрузочного тестирования.Хорошая отправная точка: http://www.webperformance.com/library/reports/TestingAspDotNet/

4 голосов
/ 07 июня 2011

Вы можете изменить максимальное количество потоков, вызвав метод ThreadPool.SetMaxThreads .300 000 потоков, вероятно, заставят ваш компьютер взорваться *

* Это, вероятно, преувеличение

3 голосов
/ 07 июня 2011

Независимый от языка ответ:

Лучший способ, вероятно, сделать это - использовать шаблон Reactor с максимум 1 или 2 одновременными потоками на ядро.

1 голос
/ 07 июня 2011

Поскольку .net фиксирует весь стек (1 МБ) для каждого потока clr;как говорит Бен, ваш компьютер может взорваться.Или, возможно, OM.

0 голосов
/ 07 июня 2011

Ну, каков был результат вашего теста, когда вы пытались создать потоки по 300 КБ?Я не собираюсь пробовать это на моем!

Вы все равно не могли подключить 300К клиентов сразу, потому что на одном сервере недостаточно сокетов (следовательно, фарм).

Я провел некоторое тестирование сервера и, настроив реестр, чтобы сделать доступным больше сокетов, у меня было 24K сокетов, подключенных к серверу, все в одном корпусе.Это было в некоторой степени то, чего я ожидал, так как клиентскому соединению <> требуется один объект сокета на каждом конце, и доступно только 64K сокетов.Я не пытался создать потоки 24K для своего тестирования, я использовал класс клиентских потоков, который открывал / закрывал соединения с несколькими объектами сокетов клиента в списке.

Rgds, Martin

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...