ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам

Продолжаем рассматривать полезные на наш взгляд выступления с конференций.

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

В докладе рассматриваются 5 основных проблем, которые можно встретить на любом проекте.

1 Проблемы с базой данных.

  • Транзакции. Транзакции помогают сократить количество операций записи на диск (часто медленной). Например, возьмем совершенно стандартную ситуацию - импорт прайс листа от поставщика в интернет-магазине. Разбив все запросы на пачки по 1000 (условно) штук и обернув каждую пачку в транзакцию - можно добиться ускорения процедуры импорта за счет сокращения числа дисковых операций. Для диагностирования подобных проблем стоит смотреть в general.log и slow.log
  • Индексы. Мало данных в базе - проблемы не наблюдаются так как все данные умещаются в оперативную память (buffer_pool и другие буфера). Как только объем данных увеличивается - СУБД все чаще ходит на диск. Соответственно падает производительность. По мере роста проекта, по мере добавления и изменения выполняемых запросов - необходимо соответствующим образом менять и индексы. Смотреть в slow.log и okmetr.io
  • Стараться избегать запросов вида SELECT * - можем забить канал совершено ненужными данными. В каждом запросе лучше явно указывать какие данные мы хотим получить.

2 Проблемы с кодом.

  • HTTP-API. Никогда не делайте вызов внешних API в рамках транзакции СУБД. Ставьте таймауты на любой внешний запрос. Старайтесь переводить обращение к АПИ в фоновые процессы (очереди). Кешируйте ответы.
  • Cron. Используйте блокировки для исключения повторного запуска одного и того же скрипта. Подкрутите таймауты для таких скриптов.

3 Архитектура.

  • Не используйте "голый" Apache, поставьте перед ним Nginx или используйте Nginx + PHP-FPM
  • PHP-сессии лучше всего хранить в памяти, например, в redis или memcache
  • Используйте HTTP-Cache, например Varhish

4 Сеть

  • Используйте pg_bouncer (если у вас Postgres)
  • Не парьтесь насчет time_wait сокетов

5 Человеческий фактор

  • Не выкатывайтесь в пятницу