2010-04-09 89 views
2

我正在尝试开发一个小应用程序,测试每秒我的服务可以支持多少个请求,但我认为我做错了什么。该服务正处于早期开发阶段,但我希望能够进行此测试,以便不时检查我是否做了可能会降低性能的事情。问题是我无法让Web服务器或数据库服务器转到100%的CPU。我使用三台不同的计算机,一台是Web服务器(WinSrv Standard 2008 x64 IIS7),另一台是数据库(Win 2K,SQL Server 2005),最后一台是我的电脑(Win7 x64 Ultimate),我将在哪里运行测试。计算机通过100以太网交换机连接。请求POST是9个字节,响应将是842个字节。Web服务的小性能测试

测试启动多个线程,每个线程具有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)); 
    } 
} 

如果我运行测试,这两台计算机都没有执行过多的CPU使用率。假设我每秒获得X个请求,如果我在同一时刻运行控制台应用程序两次,每秒获得X/2个请求,但仍然是Web服务器占CPU的30%,数据库服务器上的25%...

我试图删除循环中的Thread.Sleep,但它并没有太大的区别。

我想把机器放到最大限度,以检查它们可以提供的每秒请求数。我猜想我可以这样做...但显然我在这里失去了一些东西......这是什么问题?

亲切的问候。

+0

我想这实际上是一个配置问题与您的服务器,您可能只能设置为使用一个核心。您可能会在serverfault上获得更多帮助。 – tloach 2010-04-09 19:12:52

回答

1

除了Web服务器上的CPU之外,还有很多限制因素。有很多IIS设置可以限制连接的数量。

我会这样说的:

http://www.eggheadcafe.com/articles/20050613.asp

我知道这是IIS 6的,但有些事情仍然适用。

如果您有权访问MSDN并拥有VS 2010的终极版本,那么我会查看他们的负载测试工具。购买负载测试程序可能很昂贵,但如果您需要测试某些特定的东西,则可以使用试用版来完成您所需的任务。您可以使用它来监视和响应时间,服务器利用率等,值得研究。

+0

不错。我在网络开发方面很新颖,只要我知道我没有扩展更多的CPU,因为有参数可以避免它...我很高兴。我不想因为这些参数而混淆(现在),因为我觉得这些默认值有一个原因,并且可能正在保护Web服务器。目前,服务器正在执行非常简单的任务,但是将来这些任务将更加复杂和耗时,我对目前的整个过程感到满意。谢谢! – vtortola 2010-04-09 22:37:51

2

IMO,你最好使用SoapUI进行测试。您可以轻松调整线程数,迭代次数等测试用例。它会绘制结果图。当你击中服务器压倒的高原时,你会在图表上看到它。如果一台PC不够用,可以在其他PC上运行更多的PC。你可以用免费版完成所有这些。

+0

有趣的,我会看看它!谢谢。 – vtortola 2010-04-09 22:38:37

1

我同意克里斯,并会更进一步推荐JMeter,因为它也可以测试数据库和webapp,都在同一个脚本中。