我只是想收集一些有关服务器容量的信息并运行这些 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 服务器工作程序的数量等)。如果您无法弄清楚,也许可以创建另一个包含详细信息的问题,有人可能会提供帮助。