Я пытаюсь разработать небольшое приложение, которое проверяет, сколько запросов в секунду может поддерживать мой сервис, но я думаю, что делаю что-то не так. Сервис находится на ранней стадии разработки, но я хотел бы иметь этот тест под рукой, чтобы время от времени проверять, не делаю ли я что-то, что снижает производительность. Проблема в том, что я не могу заставить веб-сервер или сервер базы данных перейти на 100% ЦП.
Я использую три разных компьютера, на одном - веб-сервер (WinSrv Standard 2008 x64 IIS7), в другой - база данных (Win 2K, SQL Server 2005), а последним - мой компьютер (Win7 x64 Ultimate), где Я проведу тест. Компьютеры подключены через 100 Ethernet-коммутатор. POST запроса составляет 9 байтов, а ответ - 842 байта.
Тест запускает несколько потоков, и каждый поток имеет цикл while
, в каждом цикле он создает объект WebRequest
, выполняет вызов, увеличивает общий счетчик и ждет от 1 до 5 миллисекунд, а затем делает это. еще раз:
static int counter = 0;
static void Main(string[] args)
{
ServicePointManager.DefaultConnectionLimit = 250;
Console.WriteLine("Ready. Press any key...");
Console.ReadKey();
Console.WriteLine("Running...");
string localhost = "localhost";
string linuxmono = "192.168.1.74";
string server = "192.168.1.5:8080";
DateTime start = DateTime.Now;
Random r = new Random(DateTime.Now.Millisecond);
for (int i = 0; i < 50; i++)
{
new Thread(new ParameterizedThreadStart(Test)).Start(server);
Thread.Sleep(r.Next(1, 3));
}
Thread.Sleep(2000);
while (true)
{
Console.WriteLine("Request per second :"
+ counter / DateTime.Now.Subtract(start).TotalSeconds);
Thread.Sleep(3000);
}
}
public static void Test(object ip)
{
Guid guid = Guid.NewGuid();
Random r = new Random(DateTime.Now.Millisecond);
while (true)
{
String test = "<lalala/>";
WebRequest req = WebRequest.Create("http://"
+ (string) ip + "/WebApp/" + guid.ToString()
+ "/Data/Tables=whatever");
req.Method = "POST";
req.ContentType = "application/xml";
req.Credentials = new NetworkCredential("aaa", "aaa","domain");
byte[] array = Encoding.UTF8.GetBytes(test);
req.ContentLength = array.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(array, 0, array.Length);
reqStream.Close();
}
using (Stream responseStream = req.GetResponse().GetResponseStream())
{
String response = new StreamReader(responseStream).ReadToEnd();
if (response.Length != 842) Console.Write(" EEEE ");
}
Interlocked.Increment(ref counter);
Thread.Sleep(r.Next(1,5));
}
}
Если я запускаю тест, ни один из компьютеров не загружает ЦП. Допустим, я получаю X запросов в секунду, если я запускаю консольное приложение два раза в одно и то же время, я получаю X / 2 запросов в секунду в каждом из них ... но веб-сервер все еще находится на 30% ЦП, сервер базы данных на 25% ...
Я пытался удалить Thread.Sleep
в цикле, но это не имеет большого значения.
Я бы хотел поставить машины на максимум, чтобы проверить, сколько запросов в секунду они могут предоставить. Я догадался, что смогу сделать это таким образом ... но, видимо, я что-то здесь упускаю ... В чем проблема?
С уважением.