rsyslog прекращает принимать новые соединения

Вопрос или проблема

У меня есть сервер rsyslog, настроенный для приема удаленных сообщений с около 400 серверов, однако, похоже, как только сервер получает около 256 соединений, он перестает принимать новые соединения, и клиенты видят сообщения об ошибках, такие как следующее

не удается подключиться к syslog.example.org:514: время подключения истекло

Модуль imtcp для rsyslog настроен следующим образом

module(load="imtcp"
          MaxSessions="1000"
          StreamDriver.Mode="1"
          StreamDriver.AuthMode="anon"
          StreamDriver.Name="gtls"

)

Юнит systemd также настроен с LimitNOFILE=16384, и когда я проверяю /proc/$pid/limits, я вижу, что количество ограничений выглядит правильно

$ /proc/2767537# cat limits
Ограничение              Мягкое ограничение     Жесткое ограничение    Единицы
Макс. время CPU         без ограничений        без ограничений       секунды
Макс. размер файла      без ограничений        без ограничений       байты
Макс. размер данных     без ограничений        без ограничений       байты
Макс. размер стека      8388608              без ограничений       байты
Макс. размер ядра       0                    без ограничений       байты
Макс. резидентный объем без ограничений        без ограничений       байты
Макс. процессы          7393                 7393                 процессы
Макс. открытые файлы    16384                16384                файлы
Макс. заблокированная память 65536            65536                байты
Макс. адресное пространство без ограничений    без ограничений       байты
Макс. блокировки файлов  без ограничений      без ограничений       блокировки
Макс. ожидающие сигналы 7393                 7393                 сигналы
Макс. размер msgqueue   819200               819200               байты
Макс. приоритет nice    0                    0
Макс. приоритет реального времени 0           0
Макс. таймаут реального времени без ограничений без ограничений   мкс

Однако, когда я начинаю видеть эту ошибку, количество файлов в /proc/$pid/fd близко к 56.

/proc/2767537$ ls -l fd | wc -l
253

Кроме того, установленные соединения всегда близки к 256

$ ss -ntp4 state established sport eq 514 | wc -l
257

Это говорит мне о том, что есть какое-то другое ограничение в 256, которое мне нужно настроить, но я не могу найти, что/где.

  • Я не вижу никаких ошибок в журналах сервера syslog
  • Используя tcpdump, я вижу, что пакет syn приходит на порт 514, но никакой sys/ack никогда не отправляется

Ответ или решение

Проблема с подключениями к rsyslog: Почему ограничения на количество соединений?

Введение

Ваша ситуация с сервером rsyslog, который перестает принимать новые соединения после достижения ~256 подключений, действительно вызывает беспокойство и требует глубокого анализа. Давайте рассмотрим возможные причины и решения этой проблемы, опираясь на предоставленные вами данные.

Анализ конфигурации

  1. Конфигурация модуля imtcp:

    module(load="imtcp"
          MaxSessions="1000"
          StreamDriver.Mode="1"
          StreamDriver.AuthMode="anon"
          StreamDriver.Name="gtls"
    )

    Ваша конфигурация выглядит правильно, так как вы устанавливаете MaxSessions на значение 1000, что позволяет системе обрабатывать большее количество одновременно открытых сессий.

  2. Настройки systemd:

    LimitNOFILE=16384

    Установка этого лимита также адекватна, учитывая, что система должна поддерживать более 256 соединений.

  3. Проверка лимитов:
    Вы привели лимиты из /proc/$pid/limits, которые на первый взгляд показывают, что у вас все в порядке с количеством открытых файлов (16384), но важно учитывать еще множество других лимитов, которые могут влиять на соединения.

Анализ состояния соединений

  1. Количество файлов и соединений:
    При наличии 257 активных соединений на порту 514 и 253 открытых файлов, это не указывает на исчерпание лимита открытых файлов как такового, но поднимает вопрос о других ограничениях, таких как лимиты на количество уникальных соединений от одного и того же IP-адреса или другие идиосинкразии сетевого стека.

  2. Логирование и tcpdump:
    Использование tcpdump для отслеживания SYN-пакетов является хорошим подходом. Если SYN-пакеты приходят, но не получаете SYN-ACK, это может указывать на проблему с настройками сети, брандмауэра или на уровне TCP/IP.

Возможные решения

  1. Проверьте лимиты сети:
    Убедитесь, что в системе нет дополнительных лимитов для соединений или сокетов. Например, проверьте конфигурации /etc/sysctl.conf на предмет параметров, таких как:

    net.ipv4.ip_local_port_range = 1024 65000
    net.ipv4.tcp_max_syn_backlog = 4096
    net.core.somaxconn = 1024

    Эти параметры позволяют увеличить количество входящих соединений и backlog.

  2. Мониторинг подключений:
    Используйте инструменты, такие как netstat или ss, чтобы отслеживать максимальное количество одновременных соединений к вашему rsyslog-серверу. Убедитесь, что нет «зависших» соединений, которые могут привести к исчерпанию доступных портов.

  3. Параметры конфигурации rsyslog:
    Попробуйте временно уменьшить значение MaxSessions в конфигурации rsyslog для изучения поведения системы при меньшей нагрузке. Возможно, это поможет в поиске источника проблемы.

  4. Выявление сетевых ограничений:
    Проверьте настройки вашего брандмауэра и маршрутизации, чтобы убедиться, что нет ограничений на уровне TCP, которые могут блокировать новые соединения.

Заключение

Проблема с количеством соединений к вашему rsyslog-серверу может быть вызвана множеством факторов, включая сетевые ограничения и параметры конфигураций. Проведение тщательной проверки лимитов, сетевых настроек и активных соединений поможет вам выявить и решить эту проблему. Если вышеуказанные рекомендации не приведут к успеху, возможно, имеет смысл обратиться за помощью к сообществу rsyslog или специалистам по сетевым технологиям для более глубокого анализа.

Оцените материал
Добавить комментарий

Капча загружается...