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 на одном и достаточно настроенном узле.

Почему именно сериализуются запросы? Это или что-то в сценарии тестирования - захват блокировки или выполнение какого-либо другого сериализованного действия - или что-то в конфигурации сервера - количество рабочих веб-сервера и т. Д. Если вы не можете понять это, возможно, создайте другой вопрос с деталями и кем-то еще. возможно, может помочь.

Другие вопросы по тегам