Shared memory (shm) — это область оперативной памяти,
которая может использоваться несколькими процессами для обмена данными.
В контейнерах Docker правильная настройка shm критически
важна для приложений, которые интенсивно используют межпроцессное
взаимодействие или требуют большого объёма памяти для временных данных,
таких как базы данных, очереди сообщений и браузеры при автоматизации
тестирования (например, Puppeteer).
В Linux shm реализуется через файловую систему
tmpfs, обычно монтируемую в директорию
/dev/shm. По умолчанию в контейнерах Docker размер этой
памяти ограничен 64 МБ, что может быть недостаточно для приложений с
высокой нагрузкой. Например, Puppeteer при запуске Chromium требует
достаточно большой области shared memory для буферов рендеринга и WebGL.
Ключевой момент: если памяти /dev/shm
недостаточно, браузер может аварийно завершаться, выдавать ошибки
GPU process exited unexpectedly или работать крайне
нестабильно.
Размер shm можно увеличить с помощью флага
–shm-size:
docker run -it --shm-size=1g my-puppeteer-app
Здесь 1g означает, что размер shared memory контейнера
будет 1 гигабайт. Такой объём подходит для запуска Chromium с множеством
вкладок или интенсивной обработкой графики.
Важно: увеличение shm не влияет на лимиты
RAM контейнера, это отдельная область, используемая только для
межпроцессной памяти.
Если требуется динамически работать с временными данными, можно
монтировать отдельный tmpfs:
docker run -it --mount type=tmpfs,destination=/dev/shm,tmpfs-size=2g my-puppeteer-app
Этот способ полностью контролирует размер и путь временной памяти, что
особенно полезно для приложений, которым нужен нестандартный
/dev/shm.
Chromium, запускаемый через Puppeteer, активно использует
/dev/shm для:
Если /dev/shm недостаточно, Puppeteer может выдавать ошибки
вида:
[0610/123456.789:ERROR:gpu_process_host.cc(1000)] GPU process exited unexpectedly.
Чтобы избежать проблем, рекомендуется:
–shm-size до 1–2 ГБ для стандартных сценариев.
tmpfs, если контейнер обрабатывает
большие страницы или несколько вкладок одновременно.
const browser = await puppeteer.launch({
args: [&
});
Недостаток памяти /dev/shm приводит к:
Проверка текущего размера /dev/shm в контейнере:
df -h /dev/shm
Если размер слишком мал, браузер Puppeteer может завершаться при загрузке сложных веб-приложений или тяжелых тестов.
puppeteer или chrome образы, где
/dev/shm уже правильно настроен.
–shm-size
или tmpfs.
/dev/shm.
df -h
/dev/shm и логов Chromium помогает своевременно обнаруживать
проблемы.
docker run -it \
--shm-size=2g \
--rm \
my-puppeteer-app node test.js
test.js может содержать автоматизированные тесты, которые
открывают несколько страниц, выполняют скриншоты и взаимодействуют с
DOM. Увеличенный /dev/shm гарантирует стабильность Chromium
и отсутствие аварийных сбоев при интенсивной работе.
Заключение: Shared memory в Docker — критический ресурс
для приложений, требующих высокой производительности и межпроцессного
взаимодействия. Для Puppeteer это напрямую связано со стабильностью и
корректной работой браузера Chromium внутри контейнера. Правильная
настройка /dev/shm — ключевой элемент оптимизации
Docker-окружения для тестирования веб-приложений.