Сталкивались с падением сборки Next.js на небольшом сервере? Проблема часто не в недостатке мощности, а в отсутствии файла подкачки (swap). Это простое решение позволяет избежать лишних трат на апгрейд сервера, стабилизируя процесс сборки при пиковых нагрузках на память.
Почему сборка Next.js требует столько памяти?
Сборка проекта Next.js — это процесс, который требует значительно больше ресурсов, чем может показаться на первый взгляд. Во время сборки запускаются воркеры Node.js, загружается TypeScript, происходит бандлинг клиентского и серверного кода, а также обрабатываются изображения. Все это создает короткий, но мощный всплеск потребления оперативной памяти (RAM), который может легко исчерпать лимит доступной памяти на сервере с 1 ГБ RAM.
Когда физическая память заканчивается, а файла подкачки нет, система вынуждена либо «замерзнуть», либо начать принудительно завершать процессы. Именно поэтому сборка падает, а график загрузки процессора скачет — сервер отчаянно борется за ресурсы.
Что такое файл подкачки (Swap) и как он помогает?
Файл подкачки, или swap, — это специальный файл на диске, который операционная система использует как расширение оперативной памяти. Когда RAM заполняется, ядро Linux перемещает редко используемые данные из памяти на диск (в swap), освобождая место для текущих неотложных задач, таких как процесс сборки. Это дает системе необходимое «пространство для маневра». Swap идеально подходит для ситуаций, когда приложению, работающему в обычном режиме с небольшим потреблением памяти, периодически требуется резкий всплеск ресурсов. Сборка Next.js на небольших серверах — именно такой случай.
Когда Swap полезен, а когда — нет
Swap — отличное решение, если:
- Вам нужно пережить короткие пики потребления памяти (сборка проекта, установка пакетов, импорт данных).
- Стабильность важнее скорости (процесс может идти медленнее, но он завершится, а не упадет).
- Ваше приложение в обычном режиме потребляет немного памяти.
Не стоит полагаться на swap, если:
- Ваше приложение постоянно использует больше памяти, чем есть на сервере.
- Кэш базы данных постоянно выгружается в swap.
- Сервер тормозит при обычной работе из-за постоянного обмена данными между RAM и диском.
В этих случаях правильным решением будет оптимизация кода или увеличение объема физической памяти (RAM).
Практический пример: решаем проблему сборки
В видео автор демонстрирует попытку развернуть проект на базе Payload CMS (фреймворк на Next.js) на сервере Digital Ocean с 1 ГБ RAM. Установка зависимостей с помощью `pnpm` завершается ошибкой `Killed` — процесс был убит из-за нехватки памяти.
Решение — создание и активация swap-файла:
- Проверка наличия swap: `sudo swapon —show`. Если вывод пуст, swap не используется.
- Создание файла подкачки (например, 2 ГБ): `sudo fallocate -l 2G /swapfile`.
- Установка прав доступа: `sudo chmod 600 /swapfile`. Это необходимо для безопасности, чтобы только root мог читать и писать в файл.
- Форматирование файла в пространство подкачки: `sudo mkswap /swapfile`.
- Активация swap: `sudo swapon /swapfile`.
Настройка сборки и объема Swap
После активации swap-файла установка зависимостей проходит успешно. Однако сама сборка (`npm run build`) все равно может завершиться неудачей. Причина кроется в конфигурации скрипта сборки в `package.json`. Часто там можно увидеть параметр `—max-old-space-size`, который ограничивает объем памяти для процесса Node.js. В примере автора он был установлен на `8192` (8 ГБ), что слишком много для маленького сервера.
Финальные шаги для успешной сборки:
- В файле `package.json` уменьшить значение `—max-old-space-size` до разумного, например, до `2048` (2 ГБ).
- Убедиться, что размер swap-файла соответствует этому значению или немного превышает его. Если вы создали swap на 1 ГБ, а `max-old-space-size` установили в 2 ГБ, стоит увеличить размер swap-файла до 2 ГБ.
После этих изменений сборка проекта, которая ранее «вешала» сервер на 40+ минут, успешно завершилась за 8 минут. Графики мониторинга показали стабильную работу CPU и дисковой подсистемы.
Вывод
Использование файла подкачки — это эффективный и экономичный способ решить проблемы с нехваткой памяти во время ресурсоемких, но коротких задач, таких как сборка Next.js проектов на небольших VPS. Вместо того чтобы платить за более мощный сервер, который будет простаивать большую часть времени, можно грамотно настроить swap и обеспечить стабильность работы.