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