Тест производительности VPS сервера

23 August 2010 #vps #nginx

После покупки и настройки сервера стало интересно, какую нагрузку он может выдерживать. Сколько пользователей он сможет выдержать. И как сильно эти показатели будут отличаться от показаний обычного шаред-хостера?

По сути, у меня был SSH-доступ к двум серверам, один в Америке (шаред-хостинг) и другой в Англии (VPS). на обоих серверах был установлен apache, поэтому было решено использовать утилиту ab для создания стресс-нагрузки.

Использовались следующие параметры:

ab -n 500 -c 20 http://domain.ru/index.php

Тест в 500 запросов, с организацией 20 одновременных соединений.

При этом на VPS у меня была возможность провести эксперимент более широко, использовалось несколько вариантов настройки кэширования, о которых буду описывать перед подачей результатов тестов. Начнем?

Изначально проводил тестирование VPS-сервера, на котором был установлен WordPress. К тому времени уже была установлена и находилась в рабочем состоянии система кэширования XCache, WP-Super-Cache был отключен.

Concurrency Level:      20
Time taken for tests:   66.173179 seconds
Complete requests:      500
Failed requests:        0
Write errors:           0
Non-2xx responses:      500
Total transferred:      139500 bytes
HTML transferred:       0 bytes
Requests per second:    7.56 [#/sec] (mean)
Time per request:       2646.927 [ms] (mean)
Time per request:       132.346 [ms] (mean, across all concurrent requests)
Transfer rate:          2.06 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       88   88   1.0     88      95
Processing:   676 2506 382.5   2470    4119
Waiting:      675 2506 382.5   2470    4118
Total:        766 2595 382.5   2558    4207

Довольно не плохо, 7.56 запроса в секунду. Единственно, сразу стала сказываться проблема нехватки памяти. Была израсходована вся оперативная память, под завязку, не оставляя места для буферов и кэша. И был заполнен полностью своп. То есть потребовалось более гигабайта оперативной памяти.

Загрузка процессора так же была довольно стрессовой. Все 4 ядра процессора были нагружены от 40 до 80%.

После этого включил расширение WP-Super-Cache, прописал редиректы в nginx для данного расширения. Перезапустил php5-fpm и сам nginx для высвобождения памяти. И повторил тест с теми же параметрами.

Concurrency Level:      20
Time taken for tests:   35.336727 seconds
Complete requests:      500
Failed requests:        0
Write errors:           0
Non-2xx responses:      500
Total transferred:      141500 bytes
HTML transferred:       0 bytes
Requests per second:    14.15 [#/sec] (mean)
Time per request:       1413.469 [ms] (mean)
Time per request:       70.673 [ms] (mean, across all concurrent requests)
Transfer rate:          3.91 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       88   88   1.2     88      94
Processing:  1045 1299 238.7   1252    2976
Waiting:     1044 1298 238.7   1252    2976
Total:       1133 1387 238.8   1340    3066

Итого, тест опять пройден, но скорость отдачи уже достигает 14.15 запросов в секунду. При этом загрузка памяти и процессора была аналогична предыдущему тесту.

Чуть позже наткнулся на статью php-fpm + cache = Nginx on Steroids, в которой описывалось про технологию fastcgi_cache. Решил проверить в деле.

В файл /etc/nginx/nginx.conf в раздел http добавил строку:

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=testone:20m inactive=1d max_size=200m;

И затем в настройках тестируемого домена добавил:

         location ~ \.php$ {
                try_files $uri @wordpress;
                fastcgi_pass   unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_cache testone;
                fastcgi_cache_key $request_uri;
                fastcgi_cache_valid any 10m;
                include fastcgi_params;
        }

На всякий случай прошел из браузера на главную страницу тестируемого блога, чтобы дать возможность прокэшировать ее. И затем повторил тест с теми же параметрами, что и раньше.

Concurrency Level:      20
Time taken for tests:   0.100 seconds
Complete requests:      500
Failed requests:        0
Write errors:           0
Non-2xx responses:      507
Total transferred:      141453 bytes
HTML transferred:       0 bytes
Requests per second:    4986.83 [#/sec] (mean)
Time per request:       4.011 [ms] (mean)
Time per request:       0.201 [ms] (mean, across all concurrent requests)
Transfer rate:          1377.74 [Kbytes/sec] received

Потрясающие 4986,83 запроса в секунду! Но что больше всего меня поразило, так это то, что потребление памяти и нагрузка на процессор оставались без изменений. То есть это далеко не предел. Скорость отдачи страниц с блога на WordPress стала сопоставима со скорость отдачи обычного статичного сайта!

Но, естественно, не обошлось и без проблем. Как оказалось, при включении fastcgi_cache практически не возможно стало работать с комментариями. После того, как пользователь оставляет комментарий, он добавляется в базу, исправно высылается уведомление на электронную почту, но сам комментарий не отображается на странице. Что очень не удобно. и в дальнейшем, по мере обновления кеша, информация о комментариях появляется не сразу везде, на всех страницах, а частично. то есть есть вероятность того, что информация о полученном комментарии будет показана на главной странице, но не будет показываться на самой странице, где этот комментарий был оставлен.

И к тому же, использование данной системы кэширования практически полностью убивает возможность использование динамически изменяемых блоков на страницах сайта. К примеру, информация в блоках о популярных постах, оставленных комментариях, и т.д.

Для корректной работы админки блога приходиться прописывать отдельные правила nginx, которые отключают данную систему кэширования на определенных страницах.

То есть, фактически, высокая производительность и низкая нагрузка начинают проявлять себя в плохом свете при использовании самого блога. Приходиться отказываться от многих вещей, либо очень тонко подходить к настройке данного кэширования.

Ну и напоследок, решил протестировать производительно хостера justhost.com, на котором в последнее время размещался мой сайт. На всякий случай не стал отключать WP-Super-Cache, использовал те же параметры команды.

Concurrency Level:      20
Time taken for tests:   27.180 seconds
Complete requests:      500
Failed requests:        0
Write errors:           0
Non-2xx responses:      502
Total transferred:      7472564 bytes
HTML transferred:       7282306 bytes
Requests per second:    18.40 [#/sec] (mean)
Time per request:       1087.190 [ms] (mean)
Time per request:       54.359 [ms] (mean, across all concurrent requests)
Transfer rate:          268.49 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       88   89   0.4     89      92
Processing:   744  983 165.5    939    2278
Waiting:      566  805 165.6    761    2100
Total:        833 1072 165.6   1028    2367

Вполне сопоставимые результаты! Показатель в 18.4 запроса в секунду, при включенном использовании кэша для apache является довольно не плохим результатом. Правда и сервер используется с 12 гигабайтами оперативной памяти. Понятно, что все это делиться на всевозможных клиентов. Но для apache это не мало!

И к тому же, в данном случае apache лишь незначительно обошел по производительности nginx+php-fpm, установленном на менее мощном сервере.

Осталось разобраться, как будет вести себя VPS с данными настройками при долгих нагрузках, и как ограничить память выделяемые на процессы php5-fpm. Но это уже темы других статей.