Apache ab - 以 1000 个并发进行测试

Apache ab - 以 1000 个并发进行测试

我只是想收集一些有关服务器容量的信息并运行这些 apache ab 测试。

我测试了 1 分钟内 1、10、100、1000 个并发数。以下结果是针对 1000 个并发用户

我正在使用这个基准测试脚本 -https://github.com/odan/benchmark-php/blob/master/benchmark.php 我唯一改变的是将 MySQL Benchmark(1 million, Encode(...)) 查询替换为另一个更简单的 Benchmark(1 million, 1+1)

该脚本大约需要 0.52 秒才能完成,因此在理想情况下,我预计一分钟内大约有 115 个完成的请求。

的结果 ab -t 60 -n 5000 -kc 1000 mydomain-name/benchmark.php

Benchmarking mydomain-name (be patient)
Finished 111 requests

Server Software:        Apache/2.4.18
Document Path:          /benchmark.php
Document Length:        4210 bytes

Concurrency Level:      1000
Time taken for tests:   60.383 seconds
Complete requests:      111
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      486180 bytes
HTML transferred:       467310 bytes
Requests per second:    1.84 [#/sec] (mean)
Time per request:       543987.550 [ms] (mean)
Time per request:       543.988 [ms] (mean, across all concurrent requests)
Transfer rate:          7.86 [Kbytes/sec] received

Connection Times (ms)
                  min  mean[+/-sd] median   max
Connect:       57  136  42.2    140     199
Processing:  2362 30681 16963.4  31249   60180
Waiting:     2362 30680 16963.4  31248   60180
Total:       2425 30817 17005.2  31389   60378

Percentage of the requests served within a certain time (ms)
  50%  31306
  66%  39785
  75%  45021
  80%  47629
  90%  54320
  95%  57756
  98%  58191
  99%  59632
 100%  60378 (longest request)

因此,它显示,在 1000 并发级别下,它完成了 111 个请求。我的问题是:

1) 它显示了两个Time per requests值。当我在浏览器中检查时,我知道该脚本大约需要 520 毫秒才能运行。那么第二个值 543.988 [ms](平均值,跨所有并发请求)是测试运行时每个请求的实际时间吗?第一个每个请求的时间值 543987.550 似乎只是:543.988 x 1000(并发用户)?那么这是否意味着运行测试大约需要 54 秒(而“测试所用时间”显示 60.383 秒?)

我所要做的就是了解它从什么时候开始影响服务器性能。从上面的 1000 并发级别来看,它仍然能够每秒处理 1.84 个请求,平均每个请求耗时 543 毫秒 - 这是在没有负载时可以预期的吗?

如果您感兴趣的话,这里有 10 和 100 并发级别的数据。

ab -t 60 -k -n 500 -c 10 mydomain-name/benchmark.php

Benchmarking mydomain-name (be patient)
Completed 100 requests
Finished 111 requests

Document Path:          /benchmark.php
Document Length:        4210 bytes

Concurrency Level:      10
Time taken for tests:   60.038 seconds
Complete requests:      111
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      486180 bytes
HTML transferred:       467310 bytes
Requests per second:    1.85 [#/sec] (mean)
Time per request:       5408.824 [ms] (mean)
Time per request:       540.882 [ms] (mean, across all concurrent requests)
Transfer rate:          7.91 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       10   11   1.5     11      20
Processing:  1743 5170 647.3   5251    6893
Waiting:     1743 5169 647.3   5251    6892
Total:       1754 5181 647.5   5262    6906

Percentage of the requests served within a certain time (ms)
  50%   5260
  66%   5308
  75%   5370
  80%   5391
  90%   5441
  95%   5510
  98%   5540 
  99%   5967
 100%   6906 (longest request)

我对 100 个并发用户重复了相同的测试。

ab -t 60 -n 2000 -c 100 -k mydomain-name/benchmark.php

Benchmarking mydomain-name (be patient)
    Finished 114 requests

Server Software:        Apache/2.4.18
Server Port:            80

Document Path:          /benchmark.php
Document Length:        4210 bytes

Concurrency Level:      100
Time taken for tests:   60.683 seconds
Complete requests:      114
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      499320 bytes
HTML transferred:       479940 bytes
Requests per second:    1.88 [#/sec] (mean)
Time per request:       53230.746 [ms] (mean)
Time per request:       532.307 [ms] (mean, across all concurrent requests)
Transfer rate:          8.04 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       10   21   4.0     21      28
Processing:  1932 30540 16362.9  30710   54039
Waiting:     1931 30539 16362.9  30710   54038
Total:       1953 30561 16362.6  30732   54066

Percentage of the requests served within a certain time (ms)
  50%  30732
  66%  41063
  75%  46327
  80%  48960
  90%  52212
  95%  52273
  98%  52288
  99%  52840
 100%  54066 (longest request)

答案1

您实际看到的是一个“序列化”请求处理的应用程序 - 这意味着,每次只处理一个请求,而不管向它发出的请求数量有多少。

请注意跨并发级别的 RPS 的一致性 - 始终在 1.8 左右 - 并注意 1.8 约为单个请求的 1/服务时间(.53 秒)。

应用程序正在接收 1 个或 10 个或 100 个或 1000 个请求,选择其中一个,将其余请求排队(后台有多种方法可以完成此操作),在 0.53 秒内处理它挑选的请求,返回结果,然后选择另一个排队的请求,处理它,完成,返回结果等,持续 60 秒。

所以,这就是该配置的“容量”——每秒略少于 2 个请求——与传入的并发请求率无关。

由于这是 2018 年而不是 1993 年,您可能想要修复这个问题。:) 您应该能够在单个合理大小和配置的节点上使用 PHP 执行数百到有时数千个请求/秒。

为什么请求会被序列化?这要么是基准测试脚本中的某些内容(获取锁或执行其他序列化操作),要么是服务器配置中的某些内容(Web 服务器工作程序的数量等)。如果您无法弄清楚,也许可以创建另一个包含详细信息的问题,有人可能会提供帮助。

相关内容