Найти в Дзене

7 скрытых ошибок, из-за которых сайт тормозит (и почему «добавить серверов» не поможет)

В этой статье инженеры NineLab разбирают 7 самых частых, но неочевидных проблем в коде и архитектуре, которые убивают производительность быстрее, чем вы успеете сказать «пятисотая ошибка». Это самая частая причина тормозов. Представьте, что вы ищете слово «перфоратор» в физической энциклопедии, но в ней нет алфавитного указателя. Вам придётся пролистать каждую страницу от первой до тысячной (Full Table Scan). То же самое делает ваша база данных, если программист забыл поставить «индекс» на колонку поиска. На 100 товарах это незаметно. На 100 000 товаров база данных «встанет» от одного запроса. Классическая ошибка разработчиков при работе с ORM (инструментами, которые связывают код с базой данных). Допустим, мы выводим список из 50 статей, и для каждой нужно показать имя автора. Как должно быть: 2 запроса (один достаёт статьи, второй достаёт всех авторов разом). Как бывает (N+1): 1 запрос достаёт 50 статей, а потом система делает ещё 50 отдельных запросов, чтобы достать имя каждого авто
Оглавление
Ваш интернет-магазин или сервис начал зависать при наплыве пользователей? Первая мысль владельца бизнеса: «Надо купить сервер помощнее!». Но в 90% случаев это всё равно что заливать высокооктановый бензин в машину с пробитым бензобаком. Проблема не в железе.
Ваш интернет-магазин или сервис начал зависать при наплыве пользователей? Первая мысль владельца бизнеса: «Надо купить сервер помощнее!». Но в 90% случаев это всё равно что заливать высокооктановый бензин в машину с пробитым бензобаком. Проблема не в железе.

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

1. База данных без индексов

Это самая частая причина тормозов. Представьте, что вы ищете слово «перфоратор» в физической энциклопедии, но в ней нет алфавитного указателя. Вам придётся пролистать каждую страницу от первой до тысячной (Full Table Scan).

То же самое делает ваша база данных, если программист забыл поставить «индекс» на колонку поиска. На 100 товарах это незаметно. На 100 000 товаров база данных «встанет» от одного запроса.

2. Проблема "N+1 запросов"

Классическая ошибка разработчиков при работе с ORM (инструментами, которые связывают код с базой данных). Допустим, мы выводим список из 50 статей, и для каждой нужно показать имя автора.

Как должно быть: 2 запроса (один достаёт статьи, второй достаёт всех авторов разом). Как бывает (N+1): 1 запрос достаёт 50 статей, а потом система делает ещё 50 отдельных запросов, чтобы достать имя каждого автора по очереди. Вместо 2 запросов — 51. Система задыхается на пустом месте.

3. Картинки по 5 Мегабайт на главной странице

Звучит банально, но мы по-прежнему видим это каждый месяц. Дизайнер нарисовал красивый баннер, контент-менеджер залил его в формате .png без сжатия прямо из Photoshop'а.

Сервер может отдавать страницы за миллисекунды, но если браузеру пользователя приходится качать 20 мегабайт картинок по 3G-сети — для клиента ваш сайт «медленный». Решение: Настройте автоматическую конвертацию изображений в современные форматы (WebP или AVIF) при загрузке.

4. Отсутствие банального кэширования

Зачем каждый раз заново строить дом, если можно один раз сделать фото этого дома и показывать его всем? Зачем каждый раз при загрузке главной страницы базы данных заново считать «Топ-10 самых продаваемых товаров за месяц», если этот список меняется максимум раз в день?

Redis или Memcached — это системы кеширования, которые хранят уже готовые ответы в оперативной памяти и отдают их моментально. Если у вас их нет — вы жжёте ресурсы впустую.

5. Вызовы сторонних API в "горячем" потоке

Пациент: «Пользователь нажимает "Оформить заказ" и ждёт по 15 секунд». Диагноз: Ваш код делает запрос к API службы доставки (например, СДЭК), чтобы рассчитать стоимость, и этот сторонний сервис сегодня тормозит.

Пока СДЭК думает, ваш сервер блокирует соединение с пользователем и не может обработать других клиентов. Решение: Тяжелые или непредсказуемые задачи нужно отправлять в фоновые очереди (Background Jobs).

6. Утечки памяти (Memory Leaks)

Ваш сервер работает отлично после перезагрузки, но через 3 дня начинает жутко тормозить, а на 4-й день падает?

Это утечка памяти. Приложение «съедает» оперативную память и «забывает» её освободить. Когда память заканчивается, сервер начинает использовать медленный жёсткий диск как оперативку (это называется Swap). Скорость падает в тысячи раз почти мгновенно.

7. Логи ради логов

Мы видели проекты, где система логирования (запись информации о том, что происходит на сервере) убивала дисковую систему. Записывался каждый «чих» каждого пользователя в огромный текстовый файл. На запись этих терабайтов мусора уходили все ресурсы жесткого диска (Disk I/O), из-за чего база данных не могла записать реальные заказы.

Что со всем этим делать?

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

Начните с мониторинга и аудита:

  1. Посмотрите метрики базы данных (какие SQL-запросы выполняются дольше 1 секунды?)
  2. Посмотрите график TTFB (Time to First Byte)
  3. Проведите нагрузочное тестирование перед сезоном распродаж

Мы в NineLab занимаемся глубоким техническим аудитом и оптимизацией высоконагруженных систем. Если ваш проект упёрся в «потолок» производительности — напишите нам, мы найдем узкое горлышко.

Теги: программирование, оптимизация, разработка сайтов, it, высокие нагрузки, сервер, базы данных, бизнес