Использование параллельной обработки в C# для проверки способности сайта выдерживать DDOS - PullRequest
1 голос
/ 24 апреля 2020

У меня есть веб-сайт, и я также изучаю параллельную обработку в C#, и я подумал, что было бы неплохо узнать, смогу ли я написать свой собственный тестовый сценарий DDOS, чтобы увидеть, как сайт будет обрабатывать DDOS-атаку. Тем не менее, когда я запускаю его, кажется, что используется только 13 потоков, и они всегда возвращают 200 кодов состояния, никогда ничего, что бы указывало на то, что ответ не был быстрым и точным, и при переходе на сайт и обновлении одновременно со сценарием запускает сайт быстро.

Я знаю, что существуют инструменты для тестов на проникновение и так далее, но мне было просто интересно, почему я не могу использовать Parallel l oop, чтобы сделать достаточно одновременных HTTP-запросов к сайт, который будет бороться, чтобы загрузить быстро и вернуть ответ. Кажется, я получаю больше проблем из Twitter Ru sh, просто отправив в Твиттере ссылку на новую страницу сайта и сотню BOTS, которые все ru sh одновременно с сайтом копируют, сканируют, проверяют и т.д. c чем что-либо, что я могу бросить в него, используя Параллель l oop.

Есть ли что-то, что я делаю неправильно, что ограничивает количество одновременных потоков, или это то, что я не могу контролировать. Я мог бы просто бросить множество длинных поисковых запросов, которые, как я знаю, будут сканировать всю БД, возвращая 0 результатов в каждом запросе, поскольку я видел это в действии и в зависимости от размера сканируемых данных и сложности поискового запроса, который он может вызывать скачки ЦП и медленную загрузку.

Таким образом, без лекции по использованию других инструментов есть способ генерировать более 100 параллельных запросов для загрузки страницы, а не до 13 потоков, которые она прекрасно обрабатывает.

Здесь код, URL-адрес и число HTTP-запросов, которые нужно сделать, передаются в качестве параметров командной строки.

static void Attack(string url, int limit)
{
    Console.WriteLine("IN Attack = {0}, requests = {1}", url, limit);
    try
    {
        Parallel.For(0, limit, i =>
        {

            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
            webRequest.ServicePoint.ConnectionLimit = limit;
            HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;

            int statuscode = Convert.ToInt32(webResponse.StatusCode);

            Console.WriteLine("iteration {0} on thread {1} Status {2}", i,
                                Thread.CurrentThread.ManagedThreadId, statuscode);
        });
    }
    catch (AggregateException exc)
    {
        exc.InnerExceptions.ToList().ForEach(e =>
        {
            Console.WriteLine(e.Message);
        });
    }
    catch (Exception ex)
    {
        Console.WriteLine("In Exception: " + ex.Message.ToString());
    }
    finally
    {
        Console.WriteLine("All finished");
    }
}

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

В методе Parallel.For используются потоки из ThreadPool. Начальное количество потоков в пуле обычно невелико (сопоставимо с количеством логических процессоров в машине). Когда пул истощается, новые потоки вводятся со скоростью один раз в 500 мсек c. Самый простой способ решить вашу проблему - просто увеличить количество потоков, создающих сразу по запросу, используя метод SetMinThreads:

ThreadPool.SetMinThreads(1000, 10);

Это не масштабируется хотя, поскольку каждый поток выделяет 1 МБ памяти для своего стека, вы не можете иметь миллионы из них. Масштабируемое решение - go asyn c, что обеспечивает минимальное использование потоков.

0 голосов
/ 24 апреля 2020

вы можете попробовать это как:

        var socketsHandler = new SocketsHttpHandler
        {
            PooledConnectionLifetime = TimeSpan.FromSeconds(1),
            PooledConnectionIdleTimeout = TimeSpan.FromSeconds(1),
            MaxConnectionsPerServer = 10
        };

        var client = new HttpClient(socketsHandler);

        for (var i = 0; i < limit; i++)
        {
            _ = await client.GetAsync(url);
        }
...