Рейтинг:0

syslog-ng: как уменьшить высокую задержку при пересылке журналов потребителю syslog tcp?

флаг al

ОБНОВЛЕНИЕ 2: я ответил на этот вопрос в своем новом вопросе по ссылке ниже. Основной причиной является поведение телеграфа, когда по умолчанию он отключает TCP-соединение через 5 секунд после последнего полученного сообщения. Это может быть задумано, однако у меня есть проблема с их документацией, из-за которой мне трудно определить это как потенциальное исправление.

Может быть, теперь этот вопрос можно удалить?


ОБНОВЛЕНИЕ 1: вместо того, чтобы широко редактировать этот вопрос, делая текущие ответы бессмысленными, я задал новый вопрос, основанный на новой информации, которую я получил в результате публикации этого вопроса.

syslog-ng / telegraf: EOF произошел при простое - несовместимо?


Я использую syslog-ng Open-Source Edition (OSE) v3.31.2 в стеке создания докеров.

У меня есть сообщения системного журнала, поступающие по сети с разных хостов через UDP (что я ограничен, потому что мои клиенты используют Boost::Log, и это не поддерживает системный журнал через TCP, только UDP), и у меня есть syslog-ng для пересылки их к другой службе ниже по течению. Это телеграф, использующий inputs.syslog модуль, но я пока не уверен, что это имеет значение.

Мой конфиг выглядит так:

@версия: 3.29
@include "scl.conf"

параметры {
    флеш-линии (1);
};
    
источник s_network {
    udp (ip (0.0.0.0) порт (514));
};

целевой d_file {
    файл("/var/журнал/сообщения");
};
    
пункт назначения d_telegraf {
    syslog («телеграф» порт (6514) транспорт (tcp));
};
    
журнал {
    источник (s_network);
    пункт назначения (d_telegraf);
    пункт назначения (d_file);
};

Я явно установил глобальный линии смыва значение 1. Я думаю, что это значение по умолчанию, но я хочу быть уверенным. Я хочу, чтобы сообщения журнала пересылались сразу после их получения.

Чаще всего это работает — отдельные «строчки» логов поступают в syslog-ng по UDP 514, и тут же записываются в файл /var/журнал/сообщения, и почти во всех случаях тоже сразу пересылаются в телеграф на TCP-порт 6514.

Проблема, которую я вижу, заключается в том, что довольно часто syslog-ng сдерживает многие строки входящих журналов примерно на 30-60 секунд, а затем доставляет их в телеграф большим куском. Кажется, что в этом нет особой закономерности, но это происходит часто. Странно то, что /var/журнал/сообщения файл имеет отсутствующие записи журнала, записанные немедленно, просто задерживается доставка по сети. Я думал, что линии заподлицо(1) позволит избежать этой буферизации, но, похоже, это не так.

Я использовал Wireshark, чтобы определить, где находится задержка, и она находится в выводе пакетов из syslog-ng между syslog-ng и TCP-портом 6514 телеграфа.

Я действительно задавался вопросом, может ли это быть связано с алгоритмом TCP Nagle - если да, то есть ли способ включить параметр сокета TCP_NO_DELAY для драйвера назначения системного журнала syslog-ng?

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

РЕДАКТИРОВАТЬ: я попытался переключиться на транспорт UDP между syslog-ng и телеметрией, и это кажется гораздо более отзывчивым, и длительные случайные задержки исчезли. Однако это затруднит безопасное соединение в будущем.

Рейтинг:2
флаг vn

То, что вы испытываете, ненормально. Приведенная выше конфигурация должна пересылать журналы на d_telegraf и d_file в то же время, как можно скорее.

Я полагаю, что у вас проблемы с подключением, это должно быть причиной 60-секундной задержки, которая является значением по умолчанию для таймера повторного подключения.

Вы можете уменьшить это значение с помощью время повторного открытия () глобальный вариант, например:

параметры {
  время повторного открытия (1);
};

Вы также можете запустить syslog-ng на переднем плане (в режиме отладки), чтобы исследовать проблемы с подключением:

$ syslog-ng -Fdev
флаг al
Спасибо за подсказку о `-Fdev` - из этого я определил, что syslog-ng сообщает 'EOF на канале управления, закрытие соединения' почти ровно через 30 секунд после последнего сообщения журнала (после завершения работы клиента), и затем через 30 секунд: «Соединение с системным журналом установлено». Вывод syslog-ng мониторинга Wireshark показывает FIN, ACK, за которым ничего не следует в течение ровно 60 секунд, за которым следует SYN, который, как я подозреваю, является повторным подключением. Я попробую `time-reopen(1)` в следующий раз.
флаг al
Я установил `time-reopen(1)`, и соединение, как и ожидалось, восстанавливается очень быстро. По сути, проблема «уходит» с этой короткой повторной попыткой. Однако я хотел бы выяснить, что вызывает EOF на канале управления - вызвано ли это некорректным завершением работы клиента без закрытия соединения системного журнала? Клиент отправляет системный журнал по UDP. Реализует ли системный журнал состояние подключения протокола по UDP?
флаг al
Клиенты — это внутренние приложения, написанные с помощью Boost::Log — поскольку это может превратиться в вопрос программирования, возможно, мне нужно спросить в StackOverflow, есть ли способ для них аккуратно «отключиться» при завершении программы?
флаг al
Я думаю, что клиент UDP - отвлекающий маневр. Я могу воспроизвести такое же поведение с одним сообщением системного журнала UDP, отправленным `logger -d`. Из журнала я вижу, что syslog-ng получает запись, отправляет ее как в сеть, так и в файл, затем через 5 секунд сообщает «EOF произошел во время простоя», затем закрывает соединение, «EOF на канале управления», затем Через 30-60 секунд он снова подключается. Но я также вижу, что это происходит редко, когда он полностью бездействует, так что, возможно, это основная проблема с сетью. Я использую сеть для создания докеров, кстати, все это на одном хосте.
флаг al
Это становится немного громоздким, поэтому я мог бы написать это как отдельный вопрос. Еще раз спасибо за подсказку, с чего начать поиск.
MrAnno avatar
флаг vn
Сообщение о «каналах управления» может вводить в заблуждение, речь идет не о ваших сетевых подключениях, а о собственном канале управления syslog-ng. Сообщение EOF означает, что вы, вероятно, выполнили syslog-ng-ctl для запроса статистики, перезагрузки или перезапуска syslog-ng.
флаг al
Ах, я думаю, что в официальном контейнере Docker должен быть автоматизированный процесс `syslog-ng-ctl`, который периодически запускается, так как я никогда не запускал эту программу вручную. Это объяснило бы это сообщение.
Рейтинг:1
флаг cn

Попробуйте flush-lines(0), просто удалив эту строку целиком.

Как syslog-ng обрабатывает flush_lines(0)?

https://github.com/syslog-ng/syslog-ng/issues/1411

флаг al
В самом деле, я пробовал `flush-lines(0)`, и он тоже был опущен. Похоже, это не имеет никакого влияния на эту проблему, и я нашел доказательства (которые я с тех пор потерял, к сожалению, документы syslog-ng настолько легки в деталях), что значение 0 на самом деле недействительно.

Ответить или комментировать

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