AWS: тестируем производительность NGINX, PHP-FMP и MariaDB локально и на разных хостах

By | 05/16/2018
 

В посте Ansible: миграция RTFM 2.11 – хост Services – установка PHP, PHP-FPM я закончил на том, что надо протестировать работу связки NGINX+PHP-FPM+MariaDB для WordPress при использовании AWS EFS для файлов сайта.

Ниже результаты проверки при следующих вариантах использования NGINX + PHP-FPM:

  1. NGINX, PHP-FPM и MariaDB установлены локально, общаются через UNIX-сокет
  2. NGINX, PHP-FPM и MariaDB установлены локально, общаются через TCP-порт
  3. NGINX установлен на одном, а PHP-FPM и MariaDB втором хосте, общаются через TCP-порт, файлы в AWS Elastic File System
  4. NGINX установлен на одном, PHP-FPM на втором, а MariaDB на третьем хосте, общаются через TCP-порт, файлы в AWS Elastic File System

Используем AWS EC2 тип t2.nano, NGINX 1.10 и PHP 7.0 с дефолтными настройками, в качестве PHP приложения – WordPress версии 4.9.5.

Тестирование проводилось утилитой Apache Bench.

Установка и настройка

Устанавливаем сейчас всё локально, на одной машине:

root@ip-172-31-35-170:~# apt update && apt install nginx php php-fpm php-mysql mariadb-server

Для NGINX используем дефолтный конфиг с сайта NGINX, файл /etc/nginx/sites-enabled/default:

upstream php {
        server unix:/run/php/php7.0-fpm.sock;
#        server 127.0.0.1:9000;
}

server {

        listen 80 default_server;
        listen [::]:80 default_server;

        server_name _;

        root /var/www/html/;
        index index.php;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                include fastcgi.conf;
                fastcgi_intercept_errors on;
                fastcgi_pass php;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
}

В апстриме php сейчас используем UNIX-сокет – server unix:/run/php/php7.0-fpm.sock, далее переключим на TCP-порт.

Аналогично дефолтный пул www для FPM, файл /etc/php/7.0/fpm/pool.d/www.conf:

listen = /run/php/php7.0-fpm.sock

listen.owner = www-data
listen.group = www-data

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Создаём базу и пользователя MySQL:

MariaDB [(none)]> create database wptest;
MariaDB [(none)]> grant all on wptest.* to ‘wptest’@’%’ identified by ‘wptest’;

Устанавливаем WordPress и редактируем пост Hello, World, добавляем картинку, что бы потом точнее увидеть работу AWS EFS (картинка – спам такой приходил, сохранил скрин на память):

На домашней машинке устанавливаем Apache Bench из набор apache-tool:

yaourt -S apache-tools

Приступим.

Тестирование

NGINX, PHP-FPM и MariaDB установлены локально, общаются через UNIX-сокет

Запускаем ab с параметрами:

  • -c 100: клиентов одновременно
  • -n 100: сделать 100 запросов (1 клиент делает 1 запрос)
  • -k: keep-alive, эмулируем браузер

Позже пробовал выполнять и 1000 запросов, т.е. 10 запросов с клиента – но картина особо не изменилась.

ab -k -c 100 -n 100 http://54.154.228.143/2018/05/12/hello-world/
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 54.154.228.143 (be patient).....done
Server Software:        nginx/1.10.3
Server Hostname:        54.154.228.143
Server Port:            80
Document Path:          /2018/05/12/hello-world/
Document Length:        57663 bytes
Concurrency Level:      100
Time taken for tests:   1.828 seconds
Complete requests:      100
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      5797200 bytes
HTML transferred:       5766300 bytes
Requests per second:    54.69 [#/sec] (mean)
Time per request:       1828.465 [ms] (mean)
Time per request:       18.285 [ms] (mean, across all concurrent requests)
Transfer rate:          3096.22 [Kbytes/sec] received
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:       51   70   8.8     66      82
Processing:   186  969 364.1    968    1622
Waiting:       65  802 373.2    769    1462
Total:        237 1038 371.2   1023    1703
Percentage of the requests served within a certain time (ms)
50%   1023
66%   1215
75%   1384
80%   1433
90%   1602
95%   1625
98%   1667
99%   1703
100%   1703 (longest request)

NGINX, PHP-FPM и MariaDB установлены локально, общаются через TCP-порт

Обновляем /etc/nginx/sites-enabled/default, меняем апстрим:

upstream php {
#        server unix:/run/php/php7.0-fpm.sock;
        server 127.0.0.1:9000;
}
...

И /etc/php/7.0/fpm/pool.d/www.conf:

...
;listen = /run/php/php7.0-fpm.sock
listen = 127.0.0.1:9000
...

Перезапускаем их:

root@ip-172-31-35-170:/var/www/html# service php7.0-fpm restart
root@ip-172-31-35-170:/var/www/html# service nginx reload

Тестируем:

!511
ab -k -c 100 -n 100 http://54.154.228.143/2018/05/12/hello-world/
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 54.154.228.143 (be patient).....done
Server Software:        nginx/1.10.3
Server Hostname:        54.154.228.143
Server Port:            80
Document Path:          /2018/05/12/hello-world/
Document Length:        57663 bytes
Concurrency Level:      100
Time taken for tests:   1.950 seconds
Complete requests:      100
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      5797200 bytes
HTML transferred:       5766300 bytes
Requests per second:    51.27 [#/sec] (mean)
Time per request:       1950.454 [ms] (mean)
Time per request:       19.505 [ms] (mean, across all concurrent requests)
Transfer rate:          2902.57 [Kbytes/sec] received
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:       51   69   9.0     68      86
Processing:   266  999 435.7   1013    1743
Waiting:       63  809 431.3    823    1530
Total:        317 1068 444.5   1081    1829
Percentage of the requests served within a certain time (ms)
50%   1081
66%   1311
75%   1467
80%   1568
90%   1693
95%   1758
98%   1786
99%   1829
100%   1829 (longest request)

NGINX установлен на одном, а PHP-FPM и MariaDB втором хосте, общаются через TCP-порт, файлы в AWS Elastic File System

Запускаем второй инстанс – на нём будет PHP-FPM и MariaDB, устанавливаем PHP и MariaDB:

root@ip-172-31-40-244:~# apt install nfs-common php php-fpm php-mysql mariadb-server

Подключаем EFS, повторяем на обоих серверах:

root@ip-172-31-35-170:/var/www/html# mkdir /data
root@ip-172-31-35-170:/var/www/html# mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 172.31.33.98:/ /data

На PHP:

root@ip-172-31-40-244:~# mkdir /data
root@ip-172-31-40-244:~# mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 172.31.33.98:/ /data

Переносим данные WordPress:

root@ip-172-31-35-170:/var/www/html# cp -r /var/www/html/* /data/

На втором интансе создаём базу:

MariaDB [(none)]> create database wptest;
MariaDB [(none)]> grant all on wptest.* to ‘wptest’@’%’ identified by ‘wptest’;

Копируем базу со старого сервера на новый:

root@ip-172-31-35-170:/var/www/html# mysqldump -u root -p wptest > wptest.sql
root@ip-172-31-35-170:/var/www/html# scp -i /home/ubuntu/.ssh/key.pem wptest.sql ubuntu@34.243.225.196:/home/ubuntu

На втором хосте загружаем её:

root@ip-172-31-40-244:~# mysql -u root -p wptest < wptest.sql

Обновляем настройки MariaDB на втором хосте, в файле /etc/mysql/mariadb.conf.d/50-server.cnf комментируем bind-address:

...
#bind-address            = 127.0.0.1
...

Перезапускаем MariaDB:

root@ip-172-31-40-244:~# service mysql restart

На втором хосте настраиваем FPM аналогично первому, но слушаем внешний IP:

[www]

user = www-data
group = www-data

;listen = /run/php/php7.0-fpm.sock
listen = 0.0.0.0:9000

listen.owner = www-data
listen.group = www-data

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

На первом хосте обновляем NGINX – меняем IP апстрима с PHP-FPM и root:

upstream php {
#        server unix:/run/php/php7.0-fpm.sock;
#        server 127.0.0.1:9000;
        server 34.243.225.196:9000;
}

server {

        listen 80 default_server;
        listen [::]:80 default_server;

        server_name _;

        root /data;
        index index.php;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                include fastcgi.conf;
                fastcgi_intercept_errors on;
                fastcgi_pass php;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
}

Перезагружаем NGINX:

root@ip-172-31-35-170:/var/www/html# nginx -t && service nginx reload

PHP на втором хосте:

root@ip-172-31-40-244:~# service php7.0-fpm restart

Меняем адрес сервера баз данных в /data/wp-config.php:

...
/** MySQL hostname */
define('DB_HOST', '34.243.225.196');
...

Повторяем тест:

ab -k -c 100 -n 100 http://54.154.228.143/2018/05/12/hello-world/
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 54.154.228.143 (be patient).....done
Server Software:        nginx/1.10.3
Server Hostname:        54.154.228.143
Server Port:            80
Document Path:          /2018/05/12/hello-world/
Document Length:        57663 bytes
Concurrency Level:      100
Time taken for tests:   1.771 seconds
Complete requests:      100
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      5797200 bytes
HTML transferred:       5766300 bytes
Requests per second:    56.46 [#/sec] (mean)
Time per request:       1771.127 [ms] (mean)
Time per request:       17.711 [ms] (mean, across all concurrent requests)
Transfer rate:          3196.46 [Kbytes/sec] received
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:       53   71   8.6     71      88
Processing:   281  916 385.0    941    1561
Waiting:       65  712 376.4    733    1343
Total:        334  988 393.0   1012    1649
Percentage of the requests served within a certain time (ms)
50%   1012
66%   1191
75%   1324
80%   1428
90%   1567
95%   1634
98%   1648
99%   1649
100%   1649 (longest request)

На самом деле тут были не такие уж однозначные результаты – один раз был результат с 3447 (longest request) ms и Requests per second:    27.91 [#/sec].

Но большая часть выполнялась за +/- 1774(longest request) и Requests per second:    52.18 [#/sec].

NGINX установлен на одном, PHP-FPM на втором, а MariaDB на третьем хосте, общаются через TCP-порт, файлы в AWS Elastic File System

Запускаем третью машину, устанавливаем там MariaDB:

root@ip-172-31-42-16:~# apt update && apt -y install mariadb-server

Создаём базу, пользователя:

MariaDB [(none)]> create database wptest;
MariaDB [(none)]> grant all on wptest.* to ‘wptest’@’%’ identified by ‘wptest’;

С первого хоста копируем дамп на третью машину:

root@ip-172-31-35-170:/var/www/html# scp -i /home/ubuntu/.ssh/key.pem wptest.sql ubuntu@34.245.7.137:/home/ubuntu

На ней заливаем дамп в базу:

root@ip-172-31-42-16:~# mysql -u root -p wptest < wptest.sql
Enter password:

Обновляем /data/wp-config.php, меняем IP сервера БД:

...
/** MySQL hostname */
define('DB_HOST', '34.245.7.137');
...

На третьем хосте с MariaDB обновляем /etc/mysql/mariadb.conf.d/50-server.cnf, комментрируем bind-address, перезапускаем, и повторяем тест:

ab -k -c 100 -n 100 http://54.154.228.143/2018/05/12/hello-world/
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 54.154.228.143 (be patient).....done
Server Software:        nginx/1.10.3
Server Hostname:        54.154.228.143
Server Port:            80
Document Path:          /2018/05/12/hello-world/
Document Length:        57663 bytes
Concurrency Level:      100
Time taken for tests:   1.954 seconds
Complete requests:      100
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      5797200 bytes
HTML transferred:       5766300 bytes
Requests per second:    51.18 [#/sec] (mean)
Time per request:       1953.958 [ms] (mean)
Time per request:       19.540 [ms] (mean, across all concurrent requests)
Transfer rate:          2897.36 [Kbytes/sec] received
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:       52   71  10.0     70      87
Processing:   273 1011 431.8   1024    1729
Waiting:       76  816 428.3    842    1543
Total:        329 1082 441.6   1099    1816
Percentage of the requests served within a certain time (ms)
50%   1099
66%   1321
75%   1480
80%   1548
90%   1722
95%   1810
98%   1814
99%   1816
100%   1816 (longest request)

Выводы

По сути – никакой ощутимой разницы в работе не заметил, хотя ab с такими параметрами тут может быть и не лучшим показателем – в идеале было бы попользовать JMeter с какими-то дополнительными обходами по страницам.

Тем не менее результы получились такими:

  • NGINX, PHP-FPM и MariaDB установлены локально, общаются через UNIX-сокет
    • результат:
      • Requests per second: 54.69 [#/sec] (mean)
      • 1703 (longest request)
  • NGINX и PHP-FPM установлены локально, общаются через TCP-порт
    • результат:
      • Requests per second: 51.27 [#/sec] (mean)
      • 1829 (longest request)
  • NGINX установлен на одном, а PHP-FPM и MariaDB втором хосте, общаются через TCP-порт, файлы в AWS Elastic File System
    • результат:
      • Requests per second: 56.46 [#/sec] (mean)
      • 1649 (longest request)
  • NGINX установлен на одном, PHP-FPM на втором, а MariaDB на третьем хосте, общаются через TCP-порт, файлы в AWS Elastic File System
    • результат:
      • Requests per second: 51.18 [#/sec] (mean)
      • 1816 (longest request)

Так что – можно пробовать использовать EFS.