Что это значит

У каждого процесса в Linux есть предел открытых файлов. Сетевое соединение тоже считается файлом. Процесс дошёл до предела и не может открыть новый файл или принять соединение. Значение по умолчанию 1024 мало для брокера, поиска и нагруженного сервиса.

Причины две: лимит слишком мал для нормальной работы или процесс не закрывает соединения, и тогда любой лимит со временем кончится.

Как проверить

cat /proc/<pid>/limits | grep "open files"
ls /proc/<pid>/fd | wc -l
rabbitmq-diagnostics status | grep -i -A2 "file descriptors"

Снимите число открытых файлов дважды с интервалом. Ровное число у предела означает малый лимит. Постоянный рост означает утечку.

Что сделать

  1. Служба systemd: добавить LimitNOFILE=65536 в секцию [Service] через systemctl edit <служба> и перезапустить. Файл /etc/security/limits.conf на службы systemd не действует.
  2. Docker: ключ --ulimit nofile=65536:65536 или блок ulimits в файле compose.
  3. RabbitMQ и Elasticsearch требуют не меньше 65536, это написано в их документации.
  4. При утечке лимит только отодвинет сбой. Посмотрите, какие соединения копятся: ls -l /proc/<pid>/fd | awk '{print $NF}' | sort | uniq -c | sort -rn | head.