16

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

我没有改变任何东西。添加新项目。将配置设置为 RELEASE。在没有调试的情况下运行。(所以它处于实时模式)。是的,这是内置的网络服务器,而不是生产级 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 次有什么不同?是否测试是否有任何代码阻止其他请求?

最后,我在结果中遗漏了什么重要的东西需要注意吗?

谢谢 :)

4

2 回答 2

17

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

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

几个例子:

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

使用一个并发测试是可以的...只要您的网站永远不会同时拥有一个以上的用户;这很不现实,我希望你。


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

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


另外,还有两件事:

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

作为旁注:您可能想看看其他工具,它们可以进行更完整的测试,例如siegeJmeterOpenSTA:当您想要衡量您所做的事情是否优化页面时,ab 非常好; 但是,如果您想模拟您网站的“真实”使用情况,那么这些会更适合。

于 2009-09-13T13:27:18.010 回答
8

是的,如果您想知道您的网站每秒能够处理多少请求,请查看“每秒请求数”行。在您的情况下,这非常简单,因为您以 1 的并发运行 ab。每个请求平均只花费 2.371 毫秒。其中 421 个,一个接一个,耗时 1 秒。

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

话虽如此,您的大多数请求都会在大约 2 毫秒内返回。这非常快,所以我猜在 DB 或中间层调用方面并没有发生太多事情,而且当测试运行时,您的系统可能会在 CPU 上达到极限(或者出现问题,并且很快就失败了。是你确定 ab 得到你想要的响应页面吗?即你认为你正在测试的页面是 1204 字节大吗?)。这又带来了另一点:ab 本身也消耗 cpu,尤其是当你提高并发性时。所以你想在另一台机器上运行 ab 。

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

还有一点琐事:所用时间的统计以~16ms 的增量完成,因为这似乎是所用计时器的粒度。即你的 80% 的响应没有花费 0 毫秒,他们花费了一些时间 <16 毫秒。

于 2009-09-13T23:04:59.247 回答