Вопрос или проблема
У меня есть сервер 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 подключений, действительно вызывает беспокойство и требует глубокого анализа. Давайте рассмотрим возможные причины и решения этой проблемы, опираясь на предоставленные вами данные.
Анализ конфигурации
-
Конфигурация модуля imtcp:
module(load="imtcp" MaxSessions="1000" StreamDriver.Mode="1" StreamDriver.AuthMode="anon" StreamDriver.Name="gtls" )
Ваша конфигурация выглядит правильно, так как вы устанавливаете
MaxSessions
на значение 1000, что позволяет системе обрабатывать большее количество одновременно открытых сессий. -
Настройки systemd:
LimitNOFILE=16384
Установка этого лимита также адекватна, учитывая, что система должна поддерживать более 256 соединений.
-
Проверка лимитов:
Вы привели лимиты из/proc/$pid/limits
, которые на первый взгляд показывают, что у вас все в порядке с количеством открытых файлов (16384), но важно учитывать еще множество других лимитов, которые могут влиять на соединения.
Анализ состояния соединений
-
Количество файлов и соединений:
При наличии 257 активных соединений на порту 514 и 253 открытых файлов, это не указывает на исчерпание лимита открытых файлов как такового, но поднимает вопрос о других ограничениях, таких как лимиты на количество уникальных соединений от одного и того же IP-адреса или другие идиосинкразии сетевого стека. -
Логирование и tcpdump:
Использование tcpdump для отслеживания SYN-пакетов является хорошим подходом. Если SYN-пакеты приходят, но не получаете SYN-ACK, это может указывать на проблему с настройками сети, брандмауэра или на уровне TCP/IP.
Возможные решения
-
Проверьте лимиты сети:
Убедитесь, что в системе нет дополнительных лимитов для соединений или сокетов. Например, проверьте конфигурации/etc/sysctl.conf
на предмет параметров, таких как:net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.tcp_max_syn_backlog = 4096 net.core.somaxconn = 1024
Эти параметры позволяют увеличить количество входящих соединений и backlog.
-
Мониторинг подключений:
Используйте инструменты, такие какnetstat
илиss
, чтобы отслеживать максимальное количество одновременных соединений к вашему rsyslog-серверу. Убедитесь, что нет «зависших» соединений, которые могут привести к исчерпанию доступных портов. -
Параметры конфигурации rsyslog:
Попробуйте временно уменьшить значение MaxSessions в конфигурации rsyslog для изучения поведения системы при меньшей нагрузке. Возможно, это поможет в поиске источника проблемы. -
Выявление сетевых ограничений:
Проверьте настройки вашего брандмауэра и маршрутизации, чтобы убедиться, что нет ограничений на уровне TCP, которые могут блокировать новые соединения.
Заключение
Проблема с количеством соединений к вашему rsyslog-серверу может быть вызвана множеством факторов, включая сетевые ограничения и параметры конфигураций. Проведение тщательной проверки лимитов, сетевых настроек и активных соединений поможет вам выявить и решить эту проблему. Если вышеуказанные рекомендации не приведут к успеху, возможно, имеет смысл обратиться за помощью к сообществу rsyslog или специалистам по сетевым технологиям для более глубокого анализа.