我正在尝试开发一个小应用程序来测试我的服务每秒可以支持多少请求,但我认为我做错了什么。该服务处于早期开发阶段,但我希望将此测试方便,以便不时检查我是否做了降低性能的事情。问题是我无法让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服务器占CPU的30%,数据库服务器在25%......
我试图删除循环中的Thread.Sleep
,但它没有太大的区别。
我想把机器放到最大,以检查它们每秒可以提供的请求数量。我猜我能以这种方式做到这一点......但显然我在这里错过了什么......问题是什么?
亲切的问候。
答案 0 :(得分:2)
IMO,你最好使用SoapUI进行测试。您可以轻松调整测试用例的线程数,迭代次数等。并且它将绘制结果图。当你遇到压倒服务器的高原时,你会在图表上看到它。如果一台PC还不够,只需在其他PC上运行更多。您可以使用免费版本完成所有这些操作。
答案 1 :(得分:1)
除了Web服务器上的CPU之外,还有很多限制因素。有很多IIS设置限制了可以提供的连接数。
我会读到这个:
http://www.eggheadcafe.com/articles/20050613.asp
我知道它适用于IIS 6,但有些东西仍然适用。
如果您有权访问MSDN并拥有VS 2010 ultimate,我会查看他们的负载测试工具。购买负载测试程序可能很昂贵,但如果您需要测试特定的东西,您可以使用试用版来完成您的需要。您可以使用它来监控和响应时间,服务器利用率等。值得深入研究。
答案 2 :(得分:1)
我同意Chris的意见,并且会更进一步推荐JMeter,因为它也可以在同一个脚本中测试数据库和webapp。