Назад | Перейти на главную страницу

Apache ab - тестирование с 1000 параллелизмом

Я просто пытаюсь собрать некоторую информацию о мощности сервера и запустил этот тест 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 на одном узле разумного размера и с конфигурацией.

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