【问题标题】:Small performance test on a web serviceWeb 服务上的小型性能测试
【发布时间】:2011-02-06 07:08:37
【问题描述】:

我正在尝试开发一个小型应用程序来测试我的服务每秒可以支持多少个请求,但我认为我做错了什么。该服务处于早期开发阶段,但我希望方便地进行此测试,以便不时检查我没有做会降低性能的事情。问题是我无法让 Web 服务器或数据库服务器使用 100% 的 CPU。

我正在使用三台不同的计算机,一台是 Web 服务器(WinSrv Standard 2008 x64 IIS7),另一台是数据库(Win 2K,SQL Server 2005),最后一台是我的计算机(Win7 x64 Ultimate),其中我会进行测试。计算机通过 100 以太网交换机连接。请求 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));
    }
}

如果我运行测试,两台计算机都不会过度使用 CPU。假设我每秒收到一个 X 请求,如果我同时运行控制台应用程序两次,我每秒收到 X/2 个请求……但 Web 服务器仍然占用 30% 的 CPU,数据库服务器在 25%...

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

我想将机器调到最大,以检查它们每秒可以提供多少请求。我猜我可以这样做......但显然我在这里遗漏了一些东西......有什么问题?

亲切的问候。

【问题讨论】:

  • 我猜这实际上是您的服务器的配置问题,您可能只设置为使用一个核心。您可能会在 serverfault 上获得更多帮助。

标签: asp.net .net performance-testing


【解决方案1】:

我同意 Chris 的观点,并且会更进一步推荐 JMeter,因为它还可以在同一个脚本中测试数据库和 web 应用程序。

【讨论】:

    【解决方案2】:

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

    我会读这个:

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

    我知道它适用于 IIS 6,但有些东西仍然适用。

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

    【讨论】:

    • 不错。我是 Web 开发的新手,只要我知道我不会拉伸更多的 CPU,因为有一些参数可以避免它......我很高兴。我不想(暂时)弄乱这些参数,因为我觉得这些默认值是有原因的,并且可能正在保护 Web 服务器。现在服务器正在执行非常简单的任务,但将来这些任务将更加复杂和耗时,我对当前的吞吐量感到满意。谢谢!
    【解决方案3】:

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

    【讨论】:

    • 有意思,我去看看!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 2010-09-14
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多