Skip to content

fork: cannot allocate memory

Ошибка fork: cannot allocate memory — это системная ошибка, возникающая на Linux-системах, и она говорит о том, что не удалось создать новый процесс (fork) из-за недостатка доступной памяти.


🧨 Что означает эта ошибка?

Когда вы запускаете команду в терминале или скрипт, Linux использует системный вызов fork() для создания нового процесса. Для этого необходимо выделить определённое количество памяти под дочерний процесс. Если система не может выделить достаточно памяти — появляется сообщение:

fork: cannot allocate memory

🔍 Возможные причины

1. Нехватка физической памяти (RAM)

  • Система исчерпала всю доступную оперативную память.
  • Нет свободных ресурсов для создания нового процесса.

2. Нехватка swap-памяти

  • Swap — это виртуальная память на диске, которую система использует как "дополнительную" память при нехватке RAM.
  • Если он отсутствует или полностью занят — fork() завершится ошибкой.

3. Ограничения на количество процессов (ulimit)

  • Ограничено максимальное число процессов на пользователя или системе.
  • Проверить текущие лимиты можно через ulimit -u.

4. OOM Killer (Out Of Memory Killer)

  • Ядро Linux может убивать процессы при критическом дефиците памяти.
  • Это может мешать запуску новых процессов.

✅ Как исправить / диагностировать

1. Посмотреть использование памяти

free -h

Пример вывода:

              total        used        free      shared     buff/cache   available
Mem:           4.0G         3.8G        100M         50M        100M         50M
Swap:          1.0G          1.0G          0B

Если Mem или Swap полностью заняты — нужно освободить память или увеличить swap.


2. Добавить swap (если его нет или мало)

a) Создать файл подкачки (swap file):

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

b) Добавить в /etc/fstab, чтобы сохранилось после перезагрузки:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

3. Увеличить ограничения на количество процессов

ulimit -u

Показывает текущий лимит на количество процессов. Чтобы увеличить:

Временно:

ulimit -u 4096

Постоянно:

Редактируем файл /etc/security/limits.conf:

* soft nproc 4096
* hard nproc 8192

Также проверьте /etc/pam.d/common-session и добавьте строку, если её нет:

session required pam_limits.so

4. Перезапустить тяжёлые процессы или перезагрузить систему

  • Убейте ненужные процессы:
top
htop
ps aux | sort -k4nr | head -n 20
  • Завершите лишние процессы с помощью:
kill PID

5. Оптимизировать приложения

  • Если проблема возникает при запуске SQL Server, Docker, Apache, MySQL и т.п., возможно, эти приложения потребляют слишком много памяти.
  • Настройте их конфигурации, чтобы использовать меньше ресурсов.

📌 Пример: если проблема с SQL Server на Linux

Если вы получаете эту ошибку при работе с SQL Server на Linux, попробуйте:

  • Уменьшить значение memory.limit_in_bytes в контейнере (если используется Docker).
  • Убедиться, что у контейнера есть доступ к swap.
  • Выделить больше памяти хост-машине или контейнеру.

🛠 Рекомендации

Действие Команда
Посмотреть использование памяти free -h
Посмотреть swap swapon --show
Посмотреть лимиты ulimit -a
Проверить активные процессы top / htop
Узнать, какие процессы больше всего используют память ps aux --sort=-%mem | head -n 20