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

Что такое нагрузка

Нагрузку генерят пользователи. Нагрузка бывает разная: на диск, на память, на процессор, на сетевой интерфейс. Обычно она растет плавно, иногда бывают всплески, из-за большого наплыва пользователей или DDoS атаки. Предже чем что-то делать, нужно проанализировать, на какой из компонентов у нас идет нагрузка. Есть множество утилит для просмотра состояния нагрузки на каждый из компонентов сервера:

  1. top/atop/htop/mpstat - для просмотра загрузки CPU
  2. free, cat /proc/meminfo/top/atop - для просмотра использования оперативной памяти
  3. Iostat/iotop для диска

Какие частые симптомы бывают при нагрузке на диск:

  1. Диск загружен, потому что с него очень часто и много читают. Эту нагрузку может генерить либо ваше приложение, либо БД. Либо у вас много статики. Суть одна. Уменьшить чтение можно, закешировав их в оперативной памяти и отдавать их с нее. Например увеличить innodb_buffer_pool_size установив значение, равной весу всех баз. Либо настроить кеширование статики в nginx, отдавая горячую статику с оперативной памяти
  2. Диск загружен, на запись. Ее может генерить база, может генерить приложение, если пользователи допустим много файлов аплодят, либо активно пишется лог. Решение - уменьшить запись. В случае с БД если это возможно, то писать в базу большой порцией данных за меньшее время. Можно отключить логгиирование или дебаг, если он включен

В случае с ОЗУ - либо это последствия того, что мы скинули все в память, снижая нагрузку на диск. Либо у нас приложение течет. В случае нагрузки на CPU - это вычисления и ожидание io. Сетевого или дискового

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

По нагрузке и вводной части все. Подробнее о путях решения расскажу в следующем посте