Я просто пытаюсь собрать некоторую информацию о мощности сервера и запустил этот тест apache ab.
Я тестировал одновременность 1, 10, 100, 1000 за 1 минуту. Результат ниже для 1000 одновременных пользователей.
Я использую этот тестовый скрипт - https://github.com/odan/benchmark-php/blob/master/benchmark.php Единственное, что я изменил, - это заменить запрос MySQL Benchmark (1 миллион, Encode (...)) другим более простым тестом (1 миллион, 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 [мс] (среднее для всех одновременных запросов) фактическим временем выполнения одного запроса при выполнении теста? В первый раз значение 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,8 - и обратите внимание, что 1,8 составляет примерно 1 / время обслуживания одного запроса (0,53 секунды).
Приложение получает 1 или 10, или 100 или 1000 запросов, выбирает один из них, ставит остальные в очередь (есть разные способы это сделать под капотом), обрабатывает выбранный за 0,53 секунды, возвращает результаты, затем выбирает еще один из запросов, которые ставятся в очередь, обрабатываются, завершаются, возвращаются результаты и т. д. в течение 60 секунд.
Итак, это «пропускная способность» этой конфигурации - чуть менее 2 запросов в секунду, независимо от скорости одновременных входящих запросов.
Поскольку сейчас 2018, а не 1993, вы, вероятно, захотите это исправить. :) Вы должны иметь возможность выполнять сотни, а иногда и тысячи запросов в секунду с помощью PHP на одном узле разумного размера и с конфигурацией.
Почему именно запросы сериализуются? Это либо что-то в тестовом сценарии - захват блокировки или выполнение каких-либо других сериализованных действий - либо что-то в конфигурации сервера - количество рабочих веб-сервера и т. Д. возможно может помочь.