Docker игнорирует limit.conf (пытается устранить ошибку слишком большого количества открытых файлов)

Я запускаю веб-сервер, который обрабатывает многие тысячи одновременных подключений к веб-сокетам. Чтобы это было возможно, в Debian linux (мой базовый образ — google/debian:wheezy, работающий на GCE), где количество открытых файлов по умолчанию равно 1000, я обычно просто устанавливаю ulimit на нужное число (64 000) .

Это отлично работает, за исключением того, что когда я докеризировал свое приложение и развернул его, я обнаружил, что докер игнорирует определения ограничений. Я пробовал следующее (все на хост-компьютере, а не в самом контейнере):

MAX=64000
sudo bash -c "echo \"* soft nofile $MAX\" >> /etc/security/limits.conf"
sudo bash -c "echo \"* hard nofile $MAX\" >> /etc/security/limits.conf"
sudo bash -c "echo \"ulimit -c $MAX\" >>  /etc/profile"
ulimit -c $MAX

Проведя некоторое исследование, я обнаружил, что люди смогли решить аналогичную проблему, выполнив следующее:

sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"

и перезагрузка/перезапуск службы докеров.

Однако все вышеперечисленное терпит неудачу: я получаю сообщение об ошибке «слишком много открытых файлов», когда мое приложение запускается внутри контейнера (выполнение следующих действий без докера решает проблему).

Я попытался запустить ulimit -a внутри контейнера, чтобы узнать, работает ли установка ulimit, но при этом возникает ошибка о том, что ulimit не является исполняемым файлом, который является частью PATH.

Кто-нибудь сталкивался с этим и / или может предложить способ заставить докер распознавать ограничения?


person orcaman    schedule 16.10.2014    source источник


Ответы (2)


Мне удалось решить эту проблему с помощью следующей конфигурации:

Я использовал ubuntu 14.04 linux для докер-машины и хост-машины.

На хост-компьютере вам необходимо:

  • обновите файл /etc/security/limits.conf, включив в него :* - nofile 64000
  • добавьте в свой /etc/sysctl.conf: fs.file-max = 64000
  • перезапустить sysctl: sudo sysctl -p
person Eran Chetzroni    schedule 23.12.2014
comment
Не забудьте также перезапустить службу демона Docker! - person cgp; 14.02.2015
comment
Вышесказанное не совсем точно. Команду sysctl следует обновить до sudo sysctl -p <filename>, в этом примере sudo sysctl -p /etc/sysctl.conf, так как она предназначена для перезагрузки определенных параметров из файла, это не глобальная перезагрузка всех sysctl и ловит файлы /etc/sysctl.d/ и т. д. - person Trevor Benson; 28.04.2020

Вы можете передать ограничение в качестве аргумента при запуске контейнера. Таким образом, вам не нужно изменять ограничения хоста и давать слишком много мощности контейнеру. Вот как:

docker run --ulimit nofile=5000:5000 <image-tag>
person mtyurt    schedule 06.04.2017