我正在尝试弄清楚如何使用 ApacheBench 并对我的网站进行基准测试。我安装了默认站点项目(它是 ASP.NET MVC,但如果您不是 .NET 用户,请不要停止阅读)。

我没有改变任何东西。添加新项目。将配置设置为 RELEASE。无需调试即可运行。(所以它处于实时模式)。是的,这是使用内置的 Web 服务器,而不是生产级 IIS 或 Apache 或其他任何服务器。

结果如下:-

C:\Temp>ab -n 1000 -c 1 http://localhost:50035/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        ASP.NET
Server Hostname:        localhost
Server Port:            50035

Document Path:          /
Document Length:        1204 bytes

Concurrency Level:      1
Time taken for tests:   2.371 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      1504000 bytes
HTML transferred:       1204000 bytes
Requests per second:    421.73 [#/sec] (mean)
Time per request:       2.371 [ms] (mean)
Time per request:       2.371 [ms] (mean, across all concurrent requests)
Transfer rate:          619.41 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   1.1      0      16
Processing:     0    2   5.5      0      16
Waiting:        0    2   5.1      0      16
Total:          0    2   5.6      0      16

Percentage of the requests served within a certain time (ms)
  50%      0
  66%      0
  75%      0
  80%      0
  90%     16
  95%     16
  98%     16
  99%     16
 100%     16 (longest request)

C:\Temp>

现在,我不确定我到底应该看什么。

首先,我计算了每秒的请求数量。因此,如果我们要求每秒处理 300 个请求,那么这是说它每秒平均处理 421 个请求吗?

其次,增加并发的原因是什么?例如,如果我在 1 个并发上有 1000 次点击,这与在 2 个并发上有 500 次点击有何不同?是为了测试是否有代码阻塞其他请求?

最后,结果中是否有我应该注意的重要事项?

谢谢 :)

有帮助吗?

解决方案

添加更多并发的原因是什么?如在1中,如果我在1个并发上有1000次命中,那与2个并发的500差异有何不同?是否要测试是否有任何代码阻止其他请求?

是的,有点关于这个:您的应用程序可能正在做并发可能带来麻烦的事情。

几个例子:

  • 一个页面正在尝试访问一个文件——在进程中锁定它;这意味着如果另一个页面必须访问同一文件,则必须等到第一个页面完成处理该文件。
  • 数据库访问完全相同:如果一页正在写入数据库,则存在某种锁定机制 (无论是基于表的,还是基于行的,或者其他什么,取决于您的 DBMS)

测试并发数为 1 是可以的...只要您的网站永远不会同时拥有超过一个用户;这是相当不现实的,我希望你能做到。


您必须考虑在生产环境中同时有多少用户在现场,并调整并发性;请记住,您的网站上同时有 5 个用户并不意味着您必须使用 ab 以 5 的并发度进行测试:

  • 真正的用户将在每个请求之间等待几秒钟(阅读页面、单击链接的时间,...)
  • ab 根本不等待:每次加载页面(即完成一个请求)时,它都会启动另一个请求!


另外,还有两件事:

  • ab 仅测试一页 - 真实用户将在整个网站上导航,这可能会导致仅测试一页时不会出现的并发问题
  • ab 仅加载一页:它不请求外部资源(比如CSS、图像、JS……);这意味着当您的网站投入生产时,即使成本并不高,您也会有很多其他请求。

作为旁注:您可能想看看其他工具,它们可以进行更完整的测试,例如 围城, 杰米特, , 或者 开放STA :当你想要衡量你所做的事情是否优化了你的页面时,ab 真的很好;但如果您想模拟网站的“真实”使用情况,那么这些就更适合。

其他提示

是的,如果您想知道您的网站每秒可以投放多少请求,请查看<!>“每秒请求数<!>”;线。 在你的情况下,它非常简单,因为你运行ab并发为1.每个请求,平均只需要2.371ms。其中421个,一个接一个,需要1秒钟。

你真的应该稍微使用并发性,以准确衡量你的网站的容量。 由于IIS会并行处理多个请求,因此您可以预期吞吐量会增加到一定程度的并发性。 例如。如果您的服务器有多个CPU /核心。此外,如果页面依赖于外部IO(中间层服务或DB调用),则cpu可以在一个请求上工作,而另一个则在等待IO完成。 在某个时刻,请求/秒将趋于平稳,随着并发性的增加,您将看到延迟增加。进一步增加并发性,您将看到您的吞吐量(req / sec)减少,因为服务器必须投入更多资源来处理所有这些并发请求。

所有这一切,你的大部分请求都在大约2ms内返回。这是非常快的,所以我猜测在DB或中间层调用方面没有太多进展,并且当测试运行时你的系统可能在cpu上最大化(或者出现问题,并且真的很快失败。你确定ab得到你想要的响应页面吗?即你认为你正在测试1204字节大的页面?)。 这带来了另一个观点:ab本身也会消耗cpu,尤其是一旦你实现了并发性。所以你想在另一台机器上运行ab。

此外,如果您的站点对中间层服务或数据库进行外部调用,您需要调整machine.config以优化IIS分配的线程数: http://support.microsoft.com/default.aspx?scid=kb;en-us;821268

只是一点点琐事:统计时间以~16ms为增量进行,因为这似乎是所用计时器的粒度。即80%的回复没有花费0毫秒,他们花了一些时间<!> lt; 16ms。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top