Перейти к содержимому

Проверка сайта перед акцией - нагрузка, узкие места, план дня

Готовим сайт к наплыву посетителей: измеряем обычный день, даём нагрузку на копии и заранее решаем, что отключать, если пойдёт не так.

Решение

Снимаем показатели обычного дня:

Окно терминала
awk '{print $NF}' /var/log/nginx/access.log | sort -n | tail -5 # худшие ответы
grep -c ' 200 ' /var/log/nginx/access.log # запросов за период
mysqladmin status
# без базовых чисел любые улучшения обсуждаются на ощупь

Без чисел обычного дня разговор о нагрузке беспредметен. Замер до акции - это точка отсчёта, по которой потом видно, стало лучше или просто изменилась погода за окном.

Даём нагрузку на копии сайта:

Окно терминала
ab -n 2000 -c 50 https://stage.example.com/catalog/
# сценарий важнее числа: витрина, карточка, добавление в корзину, оформление
# проверка одной главной страницы не говорит ничего о нагрузке на базу

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

Ищем, во что упирается площадка:

Окно терминала
watch -n2 'systemctl status bx-php-fpm --no-pager | grep -c "php-fpm: pool"'
mysqladmin extended-status | grep -E 'Threads_connected|Slow_queries'
iostat -x 2 3 | tail -20
# три подозреваемых: процессы PHP, база и диск

Упереться можно в три вещи: свободные процессы PHP, соединения к базе и диск. Расширение памяти при упоре в диск денег стоит, а результата не даёт, поэтому узкое место находят до закупки, а не после.

Готовим план на день акции:

// заранее подготовленные переключатели: что отключаем при перегрузке
COption::SetOptionString('main', 'composite_mode', 'Y'); // композит на списки
COption::SetOptionString('vendor.shop', 'heavy_blocks', 'N'); // тяжёлые блоки главной

План на день - это список переключателей, а не общая решимость. Заранее решённые «что отключаем первым» и «кому звоним» экономят те самые двадцать минут, за которые уходит половина посетителей.

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

Дежурного инженера на день акции назначают заранее и обязательно по имени. «Все посмотрят» означает, что не посмотрит никто, а первые двадцать минут перегрузки решают, потеряете вы часть заказов или весь день.

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

Типичные проблемы

Нагрузочная проверка уронила боевой сайт.

Нагрузку дали на работающий боевой сайт вместо его отдельной тестовой копии. Проверку нагрузкой всегда проводят на отдельной тестовой площадке этого проекта.

Проверка прошла хорошо, а сайт всё равно лёг.

Проверялась одна главная страница вместо полного сценария покупки реального товара. Корзина и оформление заказа не кэшируются и ведут себя совсем иначе.

Расширили память, а быстрее не стало.

Узким местом оказался диск или база данных, а не память. Место упора в ресурсы определяют замерами ещё до закупки нового железа.

В час пик никто не знал, что отключать.

План действий на день самой акции не подготовлен и не записан заранее. Решения в этот момент принимаются в спешке и обычно оказываются неверными.

После акции сайт снова лёг.

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

Частые вопросы

Какой запас по нагрузке считать нормальным?

Трёхкратный к обычному пику как минимум. Акция даёт всплеск не только по числу людей, но и по их активности.

Помогает ли композитный сайт в пик?

Да, на списках и статичных страницах заметно. Корзину и оформление он не ускоряет.

Нужно ли отключать что-то заранее?

Тяжёлые блоки на главной и лишние счётчики - да. Остальное держат наготове в списке переключателей.

Что делать, если площадка не тянет?

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

Смежное

Первоисточник