суббота, 23 января 2016 г.

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

Выяснив с помощью blackfire, что большую часть времени занимает подключение файлов, попробуем всё тоже самое на php7, тем более - он сильно оптимизирован. Аж в 2 раза!

Протестим скорости в один поток для начала
ab -n 10000 %url%
Symfony3
Concurrency Level:      1
Time taken for tests:   53.361 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      4140000 bytes
HTML transferred:       1970000 bytes
Requests per second:    187.40 [#/sec] (mean)
Time per request:       5.336 [ms] (mean)
Time per request:       5.336 [ms] (mean, across all concurrent requests)
Transfer rate:          75.77 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    3  47.5      0    1001
Processing:     2    3   0.2      3       9
Waiting:        2    3   0.2      3       9
Total:          3    5  47.6      3    1004

Percentage of the requests served within a certain time (ms)
  50%      3
  66%      3
  75%      3
  80%      3
  90%      3
  95%      3
  98%      3
  99%      3
 100%   1004 (longest request)


Результаты yii2:
Concurrency Level:      1
Time taken for tests:   21.935 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      3440000 bytes
HTML transferred:       1990000 bytes
Requests per second:    455.88 [#/sec] (mean)
Time per request:       2.194 [ms] (mean)
Time per request:       2.194 [ms] (mean, across all concurrent requests)
Transfer rate:          153.15 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1  17.3      0    1000
Processing:     1    2   0.1      2       3
Waiting:        1    2   0.1      2       3
Total:          2    2  17.3      2    1002

Percentage of the requests served within a certain time (ms)
  50%      2
  66%      2
  75%      2
  80%      2
  90%      2
  95%      2
  98%      2
  99%      2
 100%   1002 (longest request)


Теперь нагрузим в 50 потоков
Симфони:
Concurrency Level:      50
Time taken for tests:   9.383 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      4140000 bytes
HTML transferred:       1970000 bytes
Requests per second:    1065.72 [#/sec] (mean)
Time per request:       46.917 [ms] (mean)
Time per request:       0.938 [ms] (mean, across all concurrent requests)
Transfer rate:          430.87 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       3
Processing:     5   47   3.4     46      70
Waiting:        5   47   3.4     46      70
Total:          6   47   3.4     46      70

Percentage of the requests served within a certain time (ms)
  50%     46
  66%     47
  75%     47
  80%     48
  90%     50
  95%     55
  98%     57
  99%     57
 100%     70 (longest request)

Тоже для yii
Concurrency Level:      50
Time taken for tests:   3.116 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      3440000 bytes
HTML transferred:       1990000 bytes
Requests per second:    3209.72 [#/sec] (mean)
Time per request:       15.578 [ms] (mean)
Time per request:       0.312 [ms] (mean, across all concurrent requests)
Transfer rate:          1078.27 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       2
Processing:     4   15   1.9     15      35
Waiting:        4   15   1.9     15      35
Total:          4   16   1.9     15      35

Percentage of the requests served within a certain time (ms)
  50%     15
  66%     15
  75%     16
  80%     16
  90%     16
  95%     17
  98%     23
  99%     27
 100%     35 (longest request)


Получаем что при хорошей такой нагрузке php7 даёт такие результаты
Симфони 5.6,   23.8 с на всё время теста и 120мс на 1 запрос
Симфони 7       9.3 с, 47мс
Yii 5.6                7.7с, 38мс
Yii 7                   3.2с, 15мс

Уии на php5 быстрее симфони3 на php7. (на php7 немного другой набор расширений)
По потребляемой памят
С5.6 - 2486184
С7    - 1955816
У5.6 - 950000
У7    - 1073216

Но всё это - чистая синтетика - простое echo. Надо сравнить с примером, когда будет запрос в базу или другой сервис (кэш). Продолжение следует

среда, 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 - есть разница.