среда, 20 января 2016 г.

Бенчмарк symfony3 vs yii2. Часть 1

Создадим дефолтное приложение которое выводит случайное число от 10 до 99 (чтобы создать динамику и исключить влияние кэша)

https://github.com/phan7om/s3bench
https://github.com/phan7om/yii2bench

Тестировать будем с помощью ab

Дефолтная конфигурация - php.ini (prod), nginx (c дефолтными настройками), php-fpm (дефолт). Композер установленный через install без оптимизаций.

ab -n1000 http://192.168.1.101/
Concurrency Level:      1
Time taken for tests:   7.607 seconds
Complete requests:      1000
Failed requests:        907
   (Connect: 0, Receive: 0, Length: 907, Exceptions: 0)
Total transferred:      387916 bytes
HTML transferred:       170916 bytes
Requests per second:    131.46 [#/sec] (mean)
Time per request:       7.607 [ms] (mean)
Time per request:       7.607 [ms] (mean, across all concurrent requests)
Transfer rate:          49.80 [Kbytes/sec] received

Всё хорошо. Сразу в 50 потоков попробуем и подольше
ab -c50 -n10000 http://192.168.1.101/

Concurrency Level:      50
Time taken for tests:   25.756 seconds
Complete requests:      10000
Failed requests:        965
   (Connect: 0, Receive: 0, Length: 965, Exceptions: 0)
Total transferred:      3879215 bytes
HTML transferred:       1709215 bytes
Requests per second:    388.26 [#/sec] (mean)
Time per request:       128.779 [ms] (mean)
Time per request:       2.576 [ms] (mean, across all concurrent requests)
Transfer rate:          147.09 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       7
Processing:    10  128   6.4    128     160
Waiting:       10  128   6.4    128     160
Total:         10  128   6.4    128     163

Percentage of the requests served within a certain time (ms)
  50%    128
  66%    130
  75%    131
  80%    132
  90%    134
  95%    137
  98%    140
  99%    142
 100%    163 (longest request)

nginx содержит настройку worker_processes auto; поэтому число воркеров было дефолтным - 4 (по процессу на ядро)

Оптимизируем композер, чтобы проверить влияние.
SYMFONY_ENV=prod composer install --no-dev --optimize-autloader

Concurrency Level:      50
Time taken for tests:   25.224 seconds
Complete requests:      10000
Failed requests:        989
   (Connect: 0, Receive: 0, Length: 989, Exceptions: 0)
Total transferred:      3879149 bytes
HTML transferred:       1709149 bytes
Requests per second:    396.45 [#/sec] (mean)
Time per request:       126.118 [ms] (mean)
Time per request:       2.522 [ms] (mean, across all concurrent requests)
Transfer rate:          150.19 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       7
Processing:     9  126   6.4    126     158
Waiting:        9  126   6.4    125     158
Total:         10  126   6.4    126     158

Percentage of the requests served within a certain time (ms)
  50%    126
  66%    127
  75%    128
  80%    129
  90%    131
  95%    134
  98%    138
  99%    140
 100%    158 (longest request)

Оптимизация композера не сильно помогла. Может правда стали меньше памяти потреблять.

AppCache
Concurrency Level:      50
Time taken for tests:   27.139 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      3880000 bytes
HTML transferred:       1710000 bytes
Requests per second:    368.48 [#/sec] (mean)
Time per request:       135.694 [ms] (mean)
Time per request:       2.714 [ms] (mean, across all concurrent requests)
Transfer rate:          139.62 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.2      0      10
Processing:    10  135   7.3    135     169
Waiting:       10  135   7.3    135     169
Total:         10  135   7.3    135     170

Percentage of the requests served within a certain time (ms)
  50%    135
  66%    136
  75%    138
  80%    138
  90%    142
  95%    145
  98%    150
  99%    158
 100%    170 (longest request)

Стало только хуже. Вывод - без этой обёртки работает быстрее! По крайней мере на простых запросах.

Заюзаем роутинг симфони и будем учитывать эти параметры при расчете
Также выведем потребляемую память. Получим такие цифры
Document Path:          /random/10/99
Document Length:        197 bytes

Concurrency Level:      50
Time taken for tests:   25.613 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      4140000 bytes
HTML transferred:       1970000 bytes
Requests per second:    390.42 [#/sec] (mean)
Time per request:       128.066 [ms] (mean)
Time per request:       2.561 [ms] (mean, across all concurrent requests)
Transfer rate:          157.85 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       7
Processing:     9  127   7.8    127     158
Waiting:        9  127   7.8    127     158
Total:         10  128   7.8    127     158

Percentage of the requests served within a certain time (ms)
  50%    127
  66%    129
  75%    130
  80%    131
  90%    135
  95%    139
  98%    150
  99%    156
 100%    158 (longest request)

Используемая память - Memory usage: 2628064

Выкидываем твиг и доктрину. Memory usage: 2486184
Идёт ускорение
Concurrency Level:      50
Time taken for tests:   21.727 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      4140000 bytes
HTML transferred:       1970000 bytes
Requests per second:    460.25 [#/sec] (mean)
Time per request:       108.636 [ms] (mean)
Time per request:       2.173 [ms] (mean, across all concurrent requests)
Transfer rate:          186.08 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       3
Processing:     7  108   6.7    108     136
Waiting:        7  108   6.7    108     136
Total:          8  108   6.7    108     136

Percentage of the requests served within a certain time (ms)
  50%    108
  66%    110
  75%    111
  80%    111
  90%    114
  95%    118
  98%    131
  99%    132
 100%    136 (longest request)


Итак. Встречайте yii2
Concurrency Level:      50
Time taken for tests:   7.708 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      3440000 bytes
HTML transferred:       1990000 bytes
Requests per second:    1297.32 [#/sec] (mean)
Time per request:       38.541 [ms] (mean)
Time per request:       0.771 [ms] (mean, across all concurrent requests)
Transfer rate:          435.82 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       3
Processing:     5   38   2.2     38      48
Waiting:        5   38   2.2     38      48
Total:          5   38   2.2     38      48

Percentage of the requests served within a certain time (ms)
  50%     38
  66%     39
  75%     39
  80%     39
  90%     41
  95%     43
  98%     44
  99%     45
 100%     48 (longest request)

Усилим оптимизацию. Внесём правки в php.ini
realpath_cache_size = 4096k


А также следующие команды
SYMFONY_ENV=prod composer install --no-dev --optimize-autoloader
SYMFONY_ENV=prod composer dump-autoload --optimize
php bin/console cache:clear -e=prod --no-debug

И в итоге получим
Concurrency Level:      50
Time taken for tests:   23.838 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      4140000 bytes
HTML transferred:       1970000 bytes
Requests per second:    419.49 [#/sec] (mean)
Time per request:       119.191 [ms] (mean)
Time per request:       2.384 [ms] (mean, across all concurrent requests)
Transfer rate:          169.60 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       3
Processing:     9  119   7.1    118     150
Waiting:        9  119   7.1    118     150
Total:         10  119   7.0    118     150

Percentage of the requests served within a certain time (ms)
  50%    118
  66%    120
  75%    121
  80%    122
  90%    124
  95%    128
  98%    139
  99%    146
 100%    150 (longest request)

Уже быстрее. Но всё же не настолько. Если смотреть на профилировщик, то окажется что основное, чем занят symfony2 - это подгрузка файлов (классов) - их намного больше чем в yii2.

Как бы 1000 запросов в 50 потоков обрабатываются 23 секунды или 8 - есть разница.

Комментариев нет:

Отправить комментарий