Сколько оперативной памяти нужно VPS, зависит не от «размера сайта», а от того, какие программы на сервере постоянно работают: веб-сервер, интерпретатор PHP, Node.js или Python, база данных, Docker. Ниже — сколько памяти занимает каждая из них по нашим замерам, готовые конфигурации под типовые задачи и команды, которыми можно измерить расход на уже работающем сервере.
Замеры сделаны в Docker-контейнерах на процессоре arm64; на серверах x86 цифры могут немного отличаться. Версии: nginx 1.31.6, PostgreSQL 18.6, MySQL 8.4.11, MariaDB 12.3.3, PHP 8.3 с WordPress 7.1.3, Node.js 24.21, Python 3.14.8, Docker 29. Команды для проверки сервера проверены на Ubuntu 24.04 и 26.04.
Короткий ответ: таблица конфигураций
| Задача | Ядра | Память | Диск | Готовый тариф |
|---|---|---|---|---|
| Статический сайт, лендинг на nginx | 1 | 1 ГБ | 10 ГБ | VPS-1 |
| Telegram-бот или небольшой API без базы | 1 | 1 ГБ | 10 ГБ | VPS-1 |
| Бот или API с PostgreSQL | 1–2 | 2 ГБ | 20–30 ГБ | VPS-2 |
| WordPress: блог, сайт компании | 2 | 2 ГБ | 30 ГБ | VPS-2 |
| WooCommerce, WordPress с тяжёлыми плагинами | 2 | 4 ГБ | 40 ГБ | VPS-3 |
| Docker Compose: приложение, PostgreSQL, Redis, nginx | 2 | 4 ГБ | 40 ГБ | VPS-3 |
| Сборка проектов (CI runner) | 2–4 | 4–8 ГБ | 40–80 ГБ | VPS-3, VPS-4 |
| Несколько проектов, база на десятки гигабайт | 4 | 8 ГБ | 80 ГБ | VPS-4 |
Таблица — для небольших проектов с посещаемостью до нескольких тысяч человек в день. Откуда взялись цифры, разберём дальше.
В Frogus Cloud можно взять не готовый тариф, а точное количество ядер, памяти и диска — например, 1 ядро, 2 ГБ памяти и 20 ГБ диска. Добавить ресурсы потом можно, а уменьшить — нет, поэтому начинайте с меньшей конфигурации и увеличивайте по замерам.
Из чего складывается расход памяти
Система: 200–400 МБ
Базовые службы Ubuntu 24.04 после первой настройки — systemd, журнал, SSH, cron, rsyslog, fail2ban и автоматические обновления — в нашем замере заняли 59 МБ. Больше всех — fail2ban (20 МБ) и служба автоматических обновлений (12 МБ).
На виртуальной машине к этому добавляются ядро с его структурами и службы, которых в контейнере нет. В облачном образе Ubuntu Server 24.04 и 26.04, по списку пакетов образа, это snapd и multipathd. Поэтому на систему закладывайте 200–400 МБ: на сервере с 1 ГБ памяти программам остаётся 600–800 МБ.
Веб-сервер nginx: единицы мегабайт
nginx почти не расходует память: главный процесс и рабочие процессы заняли по 1,3–1,9 МБ, весь контейнер — 6–9 МБ, в том числе после 20 000 запросов в 50 потоков. Число рабочих процессов nginx по умолчанию равно числу ядер. Статический сайт поместится даже на самой маленькой конфигурации.
Node.js и Python: от 25 до 160 МБ на процесс
| Приложение | Память после запуска | После 20 000 запросов |
|---|---|---|
| Node.js 24 + Express 5.3 | 25 МБ | 79 МБ |
| Python 3.14 + FastAPI 0.143 + uvicorn | 37 МБ | 39 МБ |
Node.js растит кучу JavaScript под нагрузкой и не спешит её отдавать: процесс вырос втрое и остался таким после теста. Если на сервере мало памяти, ограничьте кучу ключом node --max-old-space-size=256 app.js (значение в мегабайтах).
Каждый дополнительный процесс умножает расход: uvicorn --workers 4, gunicorn -w 4 или pm2 в режиме cluster запускают несколько копий приложения, и каждая занимает столько же памяти.
Telegram-боты: зависит от библиотеки
Мы запустили бота, который отвечает на сообщения, на трёх популярных библиотеках:
| Библиотека | Память процесса |
|---|---|
| grammY 1.46 (Node.js) | 27 МБ |
| python-telegram-bot 22.8 | 41 МБ |
| aiogram 3.31 (Python) | 163 МБ |
У aiogram 163 МБ занимает уже сам импорт библиотеки, ещё до первого сообщения. Один бот поместится на сервер с 1 ГБ памяти на любой из библиотек, но пять ботов на aiogram — это уже 800 МБ.
PHP и WordPress: считайте по числу воркеров
WordPress работает через PHP-FPM — пул процессов-воркеров, каждый из которых обрабатывает один запрос за раз. Мы подняли WordPress 7.1.3 с nginx, PHP-FPM и MariaDB, наполнили 30 записями и нагрузили 10 одновременными запросами:
| Сайт | Память одного воркера | Весь PHP-FPM, 5 воркеров |
|---|---|---|
| Чистый WordPress | 12–14 МБ своих + 23 МБ общих | 67 МБ |
| WordPress + WooCommerce 11.2 | 21 МБ своих + 48 МБ общих | 148 МБ |
Общая часть — это кеш скомпилированного PHP-кода (OPcache), он один на все воркеры. Поэтому оценка такая: число воркеров (pm.max_children) × память воркера + общий кеш. Тяжёлые темы и конструкторы страниц увеличивают память воркера в несколько раз; ограничение одного запроса задаёт memory_limit в настройках PHP, по умолчанию 128 МБ.
Пять воркеров — значение по умолчанию в официальном образе — справляются с небольшим сайтом. Если поставить 20 воркеров на сервере с 1 ГБ памяти, под нагрузкой они займут всю память, и ядро начнёт завершать процессы.
Базы данных: главный потребитель
| База | Память |
|---|---|
| PostgreSQL 18, сразу после запуска | 25 МБ |
| PostgreSQL 18, база 307 МБ, 20 подключений под нагрузкой | 191 МБ |
| MariaDB 12.3, без нагрузки | 60–100 МБ |
| MySQL 8.4, сразу после запуска, настройки по умолчанию | 456 МБ |
PostgreSQL берёт память под общий кеш данных (shared_buffers, по умолчанию 128 МБ) постепенно, по мере чтения таблиц, и примерно по 2–3 МБ на каждое подключение. Для сложных запросов с сортировками каждое подключение может взять ещё work_mem (4 МБ по умолчанию) на каждую операцию — при сотне подключений это заметно.
MySQL 8.4 даже без данных занял 456 МБ. Когда на нашей тестовой машине кончилась память, ядро выбрало для завершения именно его. Если на сервере 1–2 ГБ памяти, а MySQL не обязателен, выбирайте MariaDB или PostgreSQL.
Главное правило для баз: кеш данных должен быть меньше памяти сервера за вычетом всего остального. Если увеличили shared_buffers или innodb_buffer_pool_size — пересчитайте общий расход.
Docker
Служба Docker (dockerd) в нашем замере заняла 35–50 МБ, к ней добавляется containerd. Сами контейнеры расходуют столько же, сколько те же программы без Docker. Сложите расход всех сервисов из compose.yaml по таблицам выше и прибавьте систему. Приложение на Node.js (79 МБ), PostgreSQL (191 МБ), Redis 7.4 с 63 000 ключей (34 МБ), nginx и сам Docker в наших замерах — около 400 МБ под нагрузкой, вместе с системой — 0,6–0,8 ГБ. Поэтому для стека на Docker Compose берите от 2 ГБ, а если собирать образы на самом сервере — 4 ГБ.
Сборка проектов и CI
Сборка расходует больше, чем работающее приложение. Установка зависимостей нового проекта на Next.js 16.4 (npm install) заняла до 0,5 ГБ, сборка (next build) — до 0,9 ГБ памяти и 41 секунду на 6 ядрах. Пока на машине хватало памяти, сборка проходила; когда другие процессы заняли память, ядро завершало сборку с кодом 9 (SIGKILL), хотя у контейнера было ограничение 2 ГБ: ограничение — это потолок, а не гарантия.
Для сервера, который собирает проекты (GitHub Actions runner, GitLab Runner), берите от 4 ГБ памяти и 2 ядер. Если собирать на рабочем сервере с 1–2 ГБ памяти, включите файл подкачки или собирайте образ в CI и привозите на сервер готовым.
Когда важнее процессор, а когда память
Нехватка памяти и нехватка процессора выглядят по-разному.
- Не хватает памяти — ядро завершает процессы (OOM killer), база или сайт падают, в журнале —
Out of memory. Как это распознать — в статье «Как понять, что серверу не хватает памяти». - Не хватает процессора — всё работает, но медленно: растёт время ответа,
load averageвtopвыше числа ядер.
Ядра важнее памяти, когда сервер много считает: PHP без кеша страниц (в нашем тесте каждый воркер тратил на главную страницу WooCommerce около 0,4 секунды), сборка проектов, сжатие, обработка изображений и видео. Боту, статическому сайту и небольшой базе хватает одного ядра.
Учтите, что Node.js выполняет код приложения в одном потоке, а Python — с глобальной блокировкой интерпретатора (GIL). Одно такое приложение не займёт второе ядро; второе ядро пригодится базе данных, nginx или второй копии приложения — а копия снова умножает память.
Сколько нужно диска
Из чего складывается занятое место:
- Система. Пакеты облачного образа Ubuntu Server по его списку пакетов занимают около 1,4 ГБ в версии 24.04 и 1,9 ГБ в 26.04 (мы сложили размеры пакетов из репозитория). С кешем apt, вторым ядром после обновления и журналами закладывайте на систему 3–5 ГБ.
- Журналы. systemd-journald по умолчанию занимает до 10 % файловой системы, но не больше 4 ГБ (
SystemMaxUseв journald.conf). Журналы контейнеров Docker по умолчанию не ограничены — см. ниже. - Образы Docker. У нас на диске:
nginx— 183 МБ,node:24-alpine— 166 МБ,python:3-slim— 145 МБ,postgres:18— 480 МБ,wordpress:fpm— 777 МБ,mysql:8.4— 812 МБ. Каждое обновление приложения оставляет старый образ, пока его не удалить. - Данные базы. Таблица на 2 млн строк с индексом (тестовая база
pgbench) заняла 307 МБ. К этому PostgreSQL добавляет журнал транзакций (WAL) — по умолчанию до 1 ГБ (max_wal_size), — а резервные копииpg_dump, если хранить их на том же сервере, ещё столько же, сколько сама база.
Держите свободными не меньше 20 % диска. Когда место кончается, база перестаёт принимать записи, а обновление системы может прерваться на середине.
Ограничить журналы контейнеров для всех новых контейнеров можно в /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}
sudo dockerd --validate --config-file /etc/docker/daemon.json # «configuration OK»
sudo systemctl restart docker
Настройка действует только на контейнеры, созданные после перезапуска Docker: существующие нужно пересоздать (docker compose up -d --force-recreate).
Найти, что занимает место:
df -h / # сколько занято и свободно
sudo du -xh --max-depth=1 / | sort -rh | head # крупные каталоги
journalctl --disk-usage # размер журнала systemd
docker system df # образы, контейнеры, тома Docker
Удобнее всего — ncdu: он показывает дерево каталогов по размеру, по нему можно ходить стрелками.
sudo apt install -y ncdu
sudo ncdu -x /
Освободить место:
sudo journalctl --vacuum-size=200M # оставить 200 МБ журнала
sudo apt-get clean # кеш скачанных пакетов
docker image prune -a # образы, которые не использует ни один контейнер
Как измерить расход памяти на своём сервере
Если сервер уже работает, не гадайте — измерьте. Главная команда:
free -h
Смотрите на столбец available — сколько памяти программы могут получить, не вытесняя друг друга. Столбец free почти всегда маленький: Linux занимает свободную память под кеш файлов и отдаёт её по первому требованию. Подробно вывод free разобран в статье про нехватку памяти.
Какие процессы занимают больше всего:
ps -eo pid,rss,comm --sort=-rss | head -15 # RSS в килобайтах
top -o %MEM # в реальном времени, выход — q
Если удобнее интерактивный просмотр — htop (sudo apt install -y htop), сортировка по памяти — клавиша M.
RSS — это память процесса, которая сейчас находится в оперативной памяти, вместе с общей. Поэтому сумма RSS бывает больше реального расхода. В нашем тесте ps показывал у каждого подключения PostgreSQL по 66 МБ, хотя своих у подключения было 2,3 МБ, а 61 МБ приходился на общий кеш. Точнее считать по службам:
systemd-cgtop -m # память по службам systemd
docker stats --no-stream # память по контейнерам
Измеряйте в часы пик, а не сразу после запуска: база набирает кеш, Node.js растит кучу, PHP-FPM запускает новых воркеров под нагрузкой. Хорошая практика — посмотреть free -h и docker stats несколько раз в течение недели и заложить 30–50 % запаса сверх максимума.
Если не хватает
| Что видно | Что делать |
|---|---|
Процессы внезапно перезапускаются, в journalctl -k есть Out of memory |
Не хватает памяти: найдите виновника по статье про OOM killer, ограничьте его или добавьте память |
available в free -h почти ноль, сервер «тормозит» |
Включите файл подкачки как страховку и добавьте память |
Память свободна, но ответы медленные, load average выше числа ядер |
Не хватает процессора: включите кеш страниц или добавьте ядра |
df -h показывает больше 80 % |
Очистите журналы и образы Docker командами выше или увеличьте диск |
| MySQL занимает половину памяти маленького сервера | Уменьшите innodb_buffer_pool_size или используйте MariaDB, PostgreSQL |
Что дальше
- Как понять, что серверу не хватает памяти: OOM killer, free, vmstat, dmesg
- Первая настройка сервера на Ubuntu 24.04 и 26.04 — в том числе файл подкачки
- Как входить на сервер по SSH-ключу
- Как настроить число воркеров PHP-FPM под память — WordPress на VPS; Python-приложения — FastAPI и Django на VPS.