Re: Тест nginx -- сколько сообщений в log syslog без потерь?

Gena Makhomed gmm на csdoc.com
Чт Фев 15 03:05:11 UTC 2024


On 14.02.2024 13:30, Anatoliy Melnik via nginx-ru wrote:

>>> Если вы предлагаете писать напрямую с nginx-а в файл --
>>> сделайте у себя ротацию файлов с интервалом 30 сек
>>> при 200-250 тыс подключений/сек...
>>>
>>> Если у вас уже есть такое рабочее решение -
>>> поделитесь опытом, буду рад вас выслушать.

>> В этом сообщении Вы говорите о том, что Вы пробовали писать логи
>> "напрямую с nginx-а в файл" с ротацией с интервалом в 30 секунд,
>> при при 200-250 тыс подключений/сек, и у Вас не получилось
>> создать "рабочее решение".

> Вы привели ПОЛНУЮ ЦИТАТУ! ОТЛИЧНО!
> Я сказал ровно то, что и хотел сказать.
> Где вы прочитали про "не получилось" ???
> Пожалуйста процитируйте... без своих домыслов и фантазий.

А Вы помните, на какой именно мой вопрос Вы отвечали? Напомню:
https://mailman.nginx.org/pipermail/nginx-ru/2024-February/L3UKQXO2PKIHBFWHHTQRKDQY53XGE5BN.html

Я же практически прямым текстом Вам написал, что Ваша попытка
выжать максимум производительности из связки nginx-syslog -
это есть проблема Y и задал Вам вопрос, какую именно проблему X
Вы таким способом пытаетесь решить. И что я слышу в ответ -
что Вы не смогли получить работающую систему при 200-250 тысяч
подключений в секунду и при ротации логов раз в 30 секунд - именно
это и значают Ваши слова "Если у вас уже есть такое рабочее решение
- поделитесь опытом, буду рад вас выслушать" - если Вы спрашиваете,
как именно построить рабочую систему ротации логов при такой нагрузке,
то логично предположить, что Вы попытались это сделать, у Вас это
не получилось и Вы тогда пошли другим путем - писать логи
через syslog unix socket`ы, потому что там ротации не надо делать.

А невозможность получить "такое рабочее решение" при таких параметрах
нагрузки может быть вызвана только тем, что ротацию логов Вы делали
через SIGHUP а не через SIGUSR1.

То есть, я так и понял Ваш ответ на мой вопрос, что проблемой X,
которую Вам не удалось решить, является проблема ротации логов
nginx раз в 30 секунд при нагрузке в 200-250 тыс подключений/сек.

И поэтому - Вы, вместо того, чтобы искать решение проблемы Х,
начали решать проблему Y - искать способы, как оптимизировать
работу связки nginx-syslog - заведомо более затратный по ресурсам
способом, по сравнению с обработкой и ротацией логов по SIGUSR1.

И если я Вам задаю вопрос о том, в чем именно состоит Ваша проблема X,
которую Вы пытаетесь решить, а в ответ слышу про количество подключений
в секунду и интервал ротации раз в 30 секунд и "Если у вас уже есть
такое рабочее решение - поделитесь опытом, буду рад вас выслушать",
то что еще мне оствалалось подумать в этой ситуации, и каким еще
образом я мог бы понять Ваши слова? Вот попробуйте поставить себя
на мое место и посмотреть на эту ситуацию с моей точки зрения,
когда Вы задаете кому-то такой вопрос и слышие такой ответ.

И все последующее - это уже следствие того, что Вы начали
говорить, что syslog-unix socket-python - это есть решение
проблемы X. А сама проблема X у вас появилась из-за использования
SIGHUP дял ротации логов, вместо SIGUSR1. Понятно, что при таких
парметрах, 200-250 подключений в секунду и интервале ротации раз
в 30 секунд ничего работать не будет. Но при использовании SIGUSR1
- нет проблем, вне зависимости от того, какое там количество подключений
в секунду, 200 тысяч 250 тысяч или какое-либо еще, потому что рабочие
процессы при ротации через SIGUSR1 не перезапускаются, а всего лишь
переоткрывается лог-файл, что происходит практически мгновенно
и это очень дешевая операция, много ресурсов она не занимает.

Или все было совсем не так и это все является моими домыслами
и фантазиями и Ваши слова "Если у вас уже есть такое рабочее
решение - поделитесь опытом, буду рад вас выслушать" означают
что-то совершенно другое?

Я и поделился с Вами опытом - используйте SIGUSR1
вместо SIGHUP и тогда Ваша проблема X будет решена
и тогда не надо будет заниматься поиском решения
для проблемы Y - как сделать, чтобы связка nginx-syslog
через unix socket не глючила и не теряла сообщения.

Причина проблемы ведь не в nginx, причина проблемы
в syslog, потому что он читает данные в один поток,
и не успевает их обрабатывать. А когда вы создаете
10 потоков на Python - то вы увеличиваете мощность
"читателя" в 10 и более раз, потому что в такой
ситуации в каждый из unix socket`ов уходит в 10 раз
меньше сообщений и тогда читающая сторона успевает
эти сообщения читать и поэтому у nginx нет причин
чтобы дропать сообщения из-за того, что syslog
не успевает их читать из unix socket`а.

>> Причина, почему у Вас не получилось настроить ротацию лог-файлов
>> при записи логов "напрямую с nginx-а в файл" может быть в такой
>> ситуации только одна - для ротации лог-файлов Вы использовали
>> сигнал HUP а не сигнал USR1 - именно поэтому у Вас не получилось.

> Вероятно вам не раз приходилось сталкиваться с подобным, и вы автоматически считаете, что так поступают все.
> Распространенная модель поведения.
> Еще раз -- единственная новость тут для меня была в том, что у меня не получилось.

Я именно так и понял Ваш ответ:

 >>> Если вы предлагаете писать напрямую с nginx-а в файл --
 >>> сделайте у себя ротацию файлов с интервалом 30 сек
 >>> при 200-250 тыс подключений/сек...
 >>>
 >>> Если у вас уже есть такое рабочее решение -
 >>> поделитесь опытом, буду рад вас выслушать.

Потому что если бы у Вас получилось - то Вы бы не говорили,
что Вам не удалось настроить ротацию логов раз в 30 секунд
при 200-250 тысяч подключений в секунду и Вы бы тогда не говорили,
что были бы рады выслушать как сделать рабочее решение при таких
параметрах нагрузки. Если бы Вы для ротации использовали бы SIGUSR1
а не SIGHUP - тогда бы у Вас все получилось и вообще не надо было бы
говорить про количество подключений и интервал ротации, потому что
через SIGUSR1 ротацию логов можно делать хоть раз в секунду,
при любом количестве подключений, хоть 100 миллионов в секунду.

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

> Все как раз получилось, дальше с этим работать было неудобно.

Читать из unix socket`а удобно, паралельно в 10 потоков,
а читать из одного текстового лог-файла - неудобно?
А в чем именно неудобство чтения логов из файла?

> Есть 3 реверс-прокси, и от 15 до 30 беков, на которые и проксируются запросы.
> Обращения жестко делятся на несколько типов, тип определяется значением переменной в запросе, запросы БЕЗ этой переменной игнорируются.
> Беки ведут статистику сколько и какого типа запросов они получили, эти данные сливаются в БД и хранятся с дискретностью 20минут.
> 
> Регулярно требуется "нестандартная" статистика, например
> "средний размер ($body_bytes_sent) по запросам типа "sc012" за сутки"
> "соотношение обращений по http и https ($schema) по запросам типа "q1wr" за час"
> "наименьшее/среднее/наибольшее время ($request_time) по запросам типа "sc012" за..."
> "объем запросов типа "q1wr" (сумма $body_bytes_sent таких запросов) в общем объеме трафика (сумма $body_bytes_sent всех запросов)"
> и т.д.
> нет смысла каждый раз перекраивать ПО на беках, ведь все это есть в логах реверс-прокси.

Если Вам не достаточно тех метрик, которые Angie
умеет отдавать напрямую в Prometheus, рассматривали
ли Вы как вариант решения своей задачи улититы

https://github.com/google/mtail

https://github.com/timberio/vector

?

Referer: https://github.com/freeseacher/metrics_ru_faq


> как минимум создам дополнительную нагрузку на сетевой стек ОС-и, ибо tcp как ни крути более затратен по сравнению с unixSocket.
> Или с высокой вероятностью упрусь в теже ограничения unixSocket если отказаться от tcp со всеми дальше вытекающими.
> При размещении на другом сервере решить проблему исчерпания портов для соединения прокси-проски. (а их "в моменте" 350-400 тыс), да, без body их будет меньше, но все-таки довольно много.

если использовать keepalive в блоке upstream, то не упретесь,
потому что одно и то же соединение к backend`у будет повторно
использоваться для отправки на backend большого количества запросов,
и не будет такой ситуации, что на каждый запрос открывается новое
подлюкчение к backend`у, так что исчерпания портов не произойдет.
дефолтовое значение proxy_http_version 1.0 - это плоая идея, потому
что в http 1.0 коцен файла - это закрытие соедения, а оно может быть
и по причине ошибки, и nginx будет тогда отдавать битые ответы.
Если включить proxy_http_version 1.1 - такой проблемы не будет.
И заодно - можно будет использовать http keepalive
при подключении к backend`у, чтобы по одному tcp
соединению передавать большое количество запросов.

> Моя проблема "Х":
> Ограниченность в связке nginx->unixSocket->syslog
> Мое решение проблемы "Х": распараллелить процесс, чтоб проблема "Х" не возникала в принципе на необходимых мне уровнях.

Ваша проблема X  в том, что Вам нужна нестандартная статистика
по запросам. А оптимизировать скорость работы nginx->unixSocket->syslog
- это есть проблема Y которая к исходной Вашей проблеме X
не имеет вообще никакого отношения.

> Объективно оптимального решения практически любой проблемы не существует в природе.

Практически всегда можно найти оптимальное ли близкое к оптимальному
решение, надо просто осознавать какие критерии важны в первую очередь,
а какие являются второстепенными - и исходя из условий задачи
- всегда можно найти оптимальное или близкое к оптимальному решение
для этих условий. Поэтому, например, иногда будет более оптимальным
VPN WireGuard, а иногда - более оптимальным будет VPN OpenVPN.
Все зависит от критериев оптимальности и всех условий задачи.

> Если у вас в крсе обучения был такой предмет как "методы оптимизации" -- вы должны это понимать.
> Вспомните задачки из курса:
> На одну и ту же таблицу данных:
> Постройте оптимальный маршрут по расстоянию.
> Постройте оптимальный маршрут по времени.
> Постройте оптимальный маршрут по загрузке.
> Постройте оптимальный с учетом состояния дорог.
> И ответы везде разные, а табличка-то одна :)
> И это которые простые задачки....

И что, Вы разве тогда находили _субъективно_ оптимальные решения?
И у каждого из 30 студентов в группе было свое собственное решение,
каждой из этих задач, которое он и считал самым оптимальным?
Или же для каждой этой задачи оптимальные решения получались
одинаковыми или очень сильно похожими друг на друга?

> Эффективность с точки зрения чего?
> Мы с вами эффективность считаем по совершенно разным критериям.
> Это не хорошо и не плохо. Это просто по-разному :)
> Ваше мнение может отличаться от моего.

при одинаковых критериях эффективности - тоже будут разные решения?

 > Объективно оптимального решения практически любой проблемы не 
существует в природе.

То есть, у каждого будет свое собственное _субъективное_ понимание
того, какое решение является наиболее эффективным при четко заданных
критериях эффективности?

> Вы почему-то упорно пытаетесь отказать мне в праве самостоятельно решать что мне надо :)

Решайте сами, я просто хотел понять Вашу исходную задачу X,
поэтому и задавал уточняющие вопросы.

> Про оптимальность я выше упоминал.
> Оптимизировать можно по разным критериям.
> Вы исходите из одних критериев оптимальности, я из других.
> И это абсолютно нормально.

Ненормально, если при одних и тех же критериях оптимальности
и эффективности получаются совершенно различные решения
- так не может быть.

> Не стоит убеждать меня в "неправильности" моих критериев.

Проблема XY - это не про неправильность критериев.

Проблема XY - это про то, что Вы ищете решение проблемы Y,
хотя на самом деле Вам нужно решение проблемы X.

> Есть большое подозрение, что уже на текущем этапе по данному вопросу осталось лишь 2 собеседника.

я не настаиваю на продолжении диалога, если Вам этот разговор
не интересен, не полезен или доставляет какой-то дискомфорт.

On 14.02.2024 23:58, Anatoliy Melnik via nginx-ru wrote:

 > 2. Хорошо -- пусть каждый прокси сам свое считает: исключаются
 > потери по сети, каждый прокси в этом плане становится
 >  автономно-независимой единицей.
 > При высоких нагрузках -- расхождения в статистике.

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

Получить потери можно в случае использования syslog
и unix socket`ов - если читающая сторона не будет
успевать читать данные из сокета - у nginx не останется
иных варантов, кроме как дропать часть записей.

При записи логов в файлы - этот вариант исключен,
если на разделе есть достаточное количество свободного места.

Хотя бы даже одним только этим свойством запись логов в файлы
намного лучше записи логов в unix socket`ы.

Потому что, грубо говоря, при использовании unix socket`ов,
у Вас есть очень небольшой буфер в памяти и он очень быстро
может переполниться, что и приведет к потере части записей.

А при использовании лог-файлов на диске и ротации логов по
SIGUSR1 - в качестве такого "буфера" у Вас выступает все свободное
место на диске - поэтому не требуется та высокая степень синхронности,
которая необходима при использовании unix socket`ов.

Какой смысл в статистике, если она будет не точкной и ошибочной,
если система сбора статистики будет очень хрупкой и будет терять
часть сообщений при всплесках пиковой нагрузки на сервис?

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

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

 > 3. Хорошо, запишем в файл прям с nginx-а. файл распарсим-посчитаем.
 > 3а.простыми методами (типа grep и awk) обработка статистики за 30 
секунд занимает больше 30 секунд.

а если через

https://github.com/google/mtail

https://github.com/timberio/vector.

?

Ведь не Вы же первый сталкиваетесь с задачей обработки логов.
И кроме grep и awk придумано и создано большое количество
инструментов для этого.

 > 3б.пишем в файл->читаем из файла->удаляем файл в объемах 
30-60Мбайт/сек... лично мое мнение - файл тут явно лишний.
(Ваше мнение может отличатся от моего, я абсолютно не настаиваю).

Вас не смущает тот факт, что буфер в памяти может очень легко и быстро
переполниться и это приведет к потере части данных? Это не важно?
Но судя по тому, что именно с этой проблемой Вы сюда и пришли -
для Вас это важно и критично, чтобы потерь данных у Вас не было.

Если это критично, чтобы не было потерь - тогда логично построить
систему которая в принципе не способна терять данные, если только
есть достаточное количество свободного места на диске. Разве не так?

 >>> Чисто техничски можно и без access-логов, будете сами
 >> реализовывать нечто
 >>> подобное -- выберете более близкое вам решение.
 >>
 >> Вы не назвали альтернативные решения.
 > Это сделали за меня:
 > Написать свой бекэнд (как вариант на Go) и отзеркалировать туда 
запросы с фронотов....

не только, еще можно использовать Angie и экспортировать
статистику напрямую в Prometheus, если этого будет достаточно.

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

А он признает?

 > Лично я этот путь приодолел не единожды. Чего и вам желаю.

Спасибо. В чем мои заблуждения?

 > Разве я кого-то пытался убедить, что его подход в корне не верен, как 
в этом пытаются убедить меня?

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

 > Я же свои задачи решаю, а не ваши.

Задачи очень схожие часто. И можно поделиться своим опытом с другими.
Но чтобы был возможен процесс поиска наиболее оптимального решения
задачи - необходимо знать условия задачи и критерии
оптимизации / эффективности.

Причем, поиска решения настоящей задачи X о сборе статистики,
а не придуманной задачи Y про оптимизацию syslog/unix socket.

-- 
Best regards,
  Gena



Подробная информация о списке рассылки nginx-ru