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 |