我有一个网站,我也在探索C#中的并行处理,我想这将是一个好主意,看看我是否可以写我自己的DDOS测试脚本,看看网站将如何处理DDOS攻击.然而,当我运行它时,似乎只有13个线程在使用,并且它们总是返回200个状态码,从来没有任何东西表明响应不快不准确,当进入网站并在脚本运行的同时刷新时,网站加载很快。
我知道有一些工具可以进行渗透测试等等,但我只是想知道为什么我不能使用Parallel loop来对网站进行足够多的并发HTTP请求,使其难以快速加载并返回响应。似乎我从Twitter Rush中得到的问题更多,仅仅是通过在网站上推送一个新页面的链接,以及100多个BOTS都并发地冲到网站上进行抓取、扫描、检查等,而不是任何我可以使用Parallel循环扔给它的东西。
是我做错了什么,限制了并发线程的数量,还是我无法控制。我可以直接抛出许多长篇大论的搜索查询,我知道这些查询会扫描整个DB,在每个请求中返回0个结果,因为我已经看到了这种情况,根据要扫描的数据大小和搜索查询的复杂性,它可能会导致CPU峰值和缓慢的负载。
所以,如果不讲究使用其他工具,有没有办法抛出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");
}
}
你可以像这样试试。
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);
}
你可以像这样尝试: Parallel.For
方法是使用来自 ThreadPool
. 池中的初始线程数量通常较少(与机器中的逻辑处理器数量相当)。当池中的线程饥渴时,新线程会以每500毫秒一个的速度注入。解决问题的简单方法是简单地增加立即按需创建线程的数量,使用的是 SetMinThreads
方法。
ThreadPool.SetMinThreads(1000, 10);
因为每个线程都要为它的堆栈分配1MB的内存 所以你不可能有几百万个线程。可扩展的解决方案是采用async,这样可以尽量减少对线程的使用。