Я бьюсь головой об стену с этим вопросом. Мы запускаем много контейнеров параллельно, они выполняют простые операции с файловой системой или простые команды linux, и некоторые из них при определенных обстоятельствах терпят неудачу из-за проблем с выделением памяти, контейнер Docker получает OOMKiled.
Я считаю, что это не связано с конкретной командой. tail
- не единственная неудачная команда, мы также столкнулись с cp
или gzip
.
Мы сузили проблему и создали сценарий, который почти наверняка завершится ошибкой, если параметры будут настроены в соответствии с базовой системой.
https://github.com/keboola/processor-oom-test
Скрипт с настройками по умолчанию генерирует случайный CSV с 100M строками (~ 2,5 ГБ), копирует его 20 раз, а затем запускает 20 контейнеров, работающих tail -n +2 ...
. В экземпляре m5.2xlarge
AWS EC2 с твердотельным накопителем 1 ТБ некоторые контейнеры являются OOMKilled (а некоторые заканчиваются различными ошибками). Процессы завершаются с различными ошибками:
/code/tail.sh: line 2: 10 Killed tail -n +2 '/data/source.csv' > '/data/destination.csv'
tail: error reading '/data/source.csv': Cannot allocate memory
tail: write error
(последний не OOMKilled)
Я не знаю, что tail
должно вообще потреблять память. Если количество одновременно работающих контейнеров достаточно мало, он может легко выжить с 64 МБ памяти. При большем количестве контейнеров даже 256 МБ недостаточно. Я наблюдал за htop
и docker stats
и не видел никаких всплесков потребления памяти.
Вещи, которые мы уже попробовали
- разные Docker imges (альпийский, сентос, убунту)
- различные файловые системы (ext3, xfs)
- разные ОС (Centos, Ubuntu)
- разные поставщики экземпляров (Digital Ocean, AWS)
- различные типы экземпляров и блочных устройств
- файловая система swap / swappiness
- Подкачка и замена памяти Docker
Часть этого помогла только частично. Регулировка предела памяти или количества контейнеров приводила к тому, что он каждый раз снова падал. У нас был контейнер с 1 ГБ памяти, работающий просто tail
в случае сбоя большого файла с OOMKilled.
Далее то, что я пробовал несколько месяцев назад - https://500.keboola.com/cp-in-docker-cannot-allocate-memory-1a5f57113dc4. И --memory-swap
оказался лишь частичной помощью.
Есть предложения? Я не эксперт по Linux, поэтому я могу упустить что-то важное. Любая помощь или совет с благодарностью.