Gena Makhomed Wrote:
-------------------------------------------------------
> On 15.02.2024 12:49, Anatoliy Melnik via nginx-ru wrote:
>
> >>>>> Если вы предлагаете писать напрямую с nginx-а в файл --
> >>>>> сделайте у себя ротацию файлов с интервалом 30 сек
> >>>>> при 200-250 тыс подключений/сек...
> >>>>>
> >>>>> Если у вас уже есть такое рабочее решение -
> >>>>> поделитесь опытом, буду рад вас выслушать..
>
> > "Я намеренно ввел вас в заблуждение путем публикации сообщения,
> допускающее двойное толкование в ту или иную сторону по желанию
> сторон."
>
> Почему / зачем?
Был шанс увидеть в ответ нестандартное решение.
>
> > Дальнейшее перемалывание темы ротации лично для меня интереса не
> представляет..
>
> Тогда прекращаем.
>
> >>> Вы почему-то упорно пытаетесь отказать мне в праве самостоятельно
> >>> решать что мне надо :)
>
> Так я и не пытался решать за Вас, как именно будет лучше поступить
> в Вашей конкретной ситуации - скорее я рассматривал все множество
> задач сбора статистики и обработки информации из логов - и на всем
> этом множестве задач старался увидеть наиболее оптимальный способ
> решения задачи, если абстрагироваться от затрат времени
> и сил на реализацию решения в виде програмного кода.
>
Т.е. насколько я понимаю некоего идеального коня в сферическом вакууме.
Не получиться "универсальный анализ логов".
мне нужны средние, кому-то подавай количество больше чем, кому-то нужен разброс будет от min до max.
Например 100 коннектов по 1К и 100 по 1М для кого-то то же самое, что и 200 по 0.5005М, а для кого-то это суперважно.
соответственно и обработка разной получится. в 1 проход или в 2.
> >> Решайте сами, я просто хотел понять Вашу исходную задачу X,
> >> поэтому и задавал уточняющие вопросы.
>
> > Спасибо. Как уже упоминалось ранее -- по озвученной на самом старте
> теме я уже все решил.
>
> С моей точки зрения более важным является обеспечение более высокой
> надежности работы системы, чтобы логи не терялись в процессе записи,
> чем экономия свободного места на диске и экономия ресурсов NVMe SSD.
>
> Поэтому с моей точки зрения - я не могу признать решение
> через syslog и unix socket более оптимальным, чем вариант
> записи логов напрямую в файлы и ротации логов через SIGUSR1.
>
> а ротацию логов можно делать и чаще, чем раз в 30 секунд,
> например, раз 15, или раз в 10 или даже раз в 5 секунд,
> если хочется уменьшить отставание статистики по времени.
>
> По сути - лог-файл на диске - это можете воспринимать примерно,
> как то же самое, что и unix socket, только с буфером не в памяти,
> а в виде файла на диске и без существенных ограничений по размеру
> такого буфера, что будет лучше сглаживать всплески нагрузки
> и может позволить большую асинхронность между процессом
> записи информации в лог и процессом чтения информации
> из лога. А во всем остальном - никакой существенной
> разницы нет, учитывая только что запись логов в файлы
> меньше грузит процесор и использует немного больше
> свободного места на диске.
>
> Но мне например, лучше чтобы процессор был немного свободнее,
> чем проистаивающее и никак не используемое место на диске.
>
> Но самое главное - что запись логов в файлы не приводит к потере
> данных, а запись логов в unix socket может приводить к потерям
> даных, если читатель будет не успевать забирать данные из unix
> socket.
>
> Более надежное и более простое решение, и более экономно
> расходующее процесор сервера - и будет более оптимальным.
>
1. Т.к. мне практически всегда нужны некоторые усредненные данные,
то абсолютная полнота статистики не является основным условием.
Хорошо, если она присутствует, но и если потеряно даже половина данных --
на средних значениях это слабо скажется :)
2. пока я наблюдал скорее проблему "писатель не успевает записывать",
а не "читатель не успевает забирать".
Эта же проблема и при файлах присутствует -- NVME не у всех всегда везде.
Система дисковая как ни крути - общий ресурс, и если ее интенсивно нагрузить
чем-то еще логи тоже могут получить проблему читатель-писатель.
Сжатие на лету -- это не только ресурс CPU при сжатии перед записью, это еще и
ресурс при распаковке для анализа, у меня это происходит со всеми данными.
Т.е. если nginx потратил ресурс на запаковку, то я в ответ должен потратить ресурс на распаковку...
И где тут экономия CPU??
Мое мнение:
Единственный плюс прямой записи в файл -- это длительное хранение данных, чего лично мне вот вообще не требуется.
При необходимости обработки и анализа полученных данных пока опыт эксплуатации показывает преимущества юникс-сокета.
Об этом чуть ниже.
> > При желании добраться из пунта А в пункт Б именно на машине и
> проблеме "машина не едет" 2 концептуальных решения:
> > 1.Заменить машину.
> > 2.Устранить причины "не едет" в имеющейся.
> > Соответственно 2 пути -- ищем другую машину, или меняем вышедшую из
> строя запчасть.
> > Если провести параллели, то с моей точки зрения мне вполне
> достаточно запчасти.
> > Вы предлагаете замену машины.
>
> Не так, я скорее рассматриваю одновременно все множество путей
> из точки А в точку Б для различных вариантов А и Б и различных
> внешних условий и стараюсь понять, какой именно автомобиль,
> с какими именно параметрами будет наиболее оптимальным
> решением для такой задачи - перемещения их точки А в точку Б.
>
Вертолет и телепортацию не забудьте :)
Учитывая ваши слова "если абстрагироваться от затрат времени
и сил на реализацию решения..."
> Вот как я уже говорил, задача построения VPN - если взять все
> множество
> таких задач, то в части случаев для построения VPN более оптимальным
> вариантом будет использование WireGuard, а в части случаев - OpenVPN.
> Именно потому, что WireGuard обладает некоторыми свойствами
> и качествами, которые отсутствуют в OpenVPN, и наоборот,
> потому что OpenVPN обладает некоторыми свойствами и качествами,
> которые отсутствуют в WireGuard. И поэтому в части случаев
> оказывается более оптимальным и целесообразным построение
> VPN с использованием WireGuard, а в некоторых случаях
> - более оптимальнныи и целесообразным оказывается
> построение VPN с использованием OpenVPN.
>
И в части случаев оба они окажутся в равной степени не пригодны...
Да и там, где пригодны, далеко не всегда оптимальны по каким-то критериям.
VPN технологий существуют десятки. Но вы почему-то в этом посте ограничились 2-мя.
А как же "все множество путей" ?
Эти 2 достаточно удобны для решения большого круга задач -- это да, но это не отменяет достоинств других VPN-ов.
> >> Получить потери можно в случае использования syslog
> >> и unix socket`ов - если читающая сторона не будет
> >> успевать читать данные из сокета - у nginx не останется
> >> иных варантов, кроме как дропать часть записей.
> >>
> >> При записи логов в файлы - этот вариант исключен,
> >> если на разделе есть достаточное количество свободного места.
> >>
> > О появились доп. условия -- место на разделе...
>
> Так ведь свободное место на разделе есть, с этим же нет проблем.
Есть проблема..
В исходной постановке (когда сия задача встала передо мной) задачи было пожелание обойтись имеющимся ресурсом.
Я задачу решил именно в этих начальных условиях.
>
> Если часто делать ротацию логов - его надо будет совсем не много.
>
> Тем более, что можно включить компрессию логов на лету, если надо.
>
Повторюсь: я уже просто запись в файл счел лишним этапом,
а уж сопутствующие этому затраты на компрессию-декомпрессию только в минус.
> >> Хотя бы даже одним только этим свойством запись логов в файлы
> >> намного лучше записи логов в unix socket`ы.
>
> > А как же место на разделе? Замена одной проблемы другой. Только и
> всего.
>
> У Вас разве есть проблемы со свободным местом на разделе?
> тогда включите компрессию логов на лету - свободного места
> потребуется меньше, ресурсов процессора будет использовано
> больше. Только и всего. Это не проблема, это лишь tradeoff.
>
И еще раз повторюсь -- что мешает мне на концептуальном уровне
просто изменить подход так, чтоб эта проблема даже на горизонте не маячила?
> > Т.е. Проблему X -- расхождение при использовании сокета, вы меняете
> на проблему У -- достаточное количество места
> > и производительность системы ввода-вывода, просто с вашей точки
> зрения это как-бы и не проблема вовсе
>
> Количество свободного места на разделе - это не проблема, потому что
> Thin provisioning и все разделы виртуальных машин имеют логический
> размер в 50 TiB, - я бы сделал и больше, но Red Hat не рекомендует.
Это тут вообще к чему?
>
> > с моей точки зрения менять одну проблему на другую смысла нет
>
> использование места на диске - это не проблема, это необходимая плата
> за то, что запись в логи будет происходить без потерь информации,
> и что чтения и обработка информации из логов не обязаны быть
> такими синхронными и производительными, как в случае с unix
> socket`ами.
>
Обязаны! и синхронными и производительными.
Если статистика будет накапливаться быстрее, чем обрабатываться, то данные никогда не будут актуальны.
Т.е. я сегодня увижу статистику за вчера, а за сегодня-- только через 2 дня, а к концу года буду видеть уже с отставанием в месяц??
И кому это будет интересно??
> > Вот вам идея оптимального по большинству критериев решения --
> > Когда будете решать сходную задачу напишите свой модуль для nginx
> > Чтоб сразу считать все нужное "внутри" без посредников.
> > Я такое решение тоже рассматривал, отказался.
> > Лично мои трудозатраты по реализации такого подхода превосходят все
> разумные пределы.
> > Что и стало ключевым фактором "против".
>
> Такой модуль уже есть, Angie умеет экспортировать данные
> напрямую в Prometheus. Если бы у njs была возможность разделять
> данные между worker`ами, то можно был бы пряом через njs это делать.
> И скорее всего - это можно уже сейчас запрограммировать на lua,
> используя в качестве веб-сервера OpenResty, там есть доступ
> к разделяемой памяти. Или - просто парсить логи и все,
> это будет и быстрее и проще, чем unix socket`ы, IMHO.
Нет там нужных мне метрик. И быть не может :)
Метрика по параметру в GET/POST запросе, усредненная за 60 секунд...
Итоги разных экспериментов:
Исходные данные - CPU Xeon E5-26xx v4 CPU 2.2GHz
Для наглядности привожу данные по 1 вычислительному ядру.
Итак, на 1 вычислительное ядро
--- Существующий на данный момент бекэнд, куда nginx у меня проксирует запросы -- максимум около 2000 в секунду на одно ядро (вообще не моя епархия, но там точно НЕ php).
--- NGINX для теста, на который отзеркалированы запросы, вся его функция -- выдать ответ "200" и сообщение в лог записать, все, никакого проксирования или отдачи контента,
никаких вычислений и т.д. Голый "200" + строка в лог-файле средствами nginx-а, ротация 10 секунд с удалением результата. --- максимум примерно 10 000 в секунду на 1 ядро
--- парсинг данных из лога, накопленного за 60 секунд из расчета нагрузки 400тыс/сек, т.е. 24млн строк. -- на одном ядре от 8 минут. в зависимости от нагрузки на дисковую подсистему 8-9 минут. т..е. при среднем 500секунд 48 000 в секунду на одно ядро.
--- Обработка через юникс-сокет "на лету" python3.9 скриптом -- 43 000 в секунду на одно ядро 100% соответствие результатов, около 89-92% занятость ядра CPU.
Итого технически "самый быстрый" -- парсинг лога, но тянет за собой запись-чтение-удаление при относительном преимуществе 9-12% и
зависимости результата от файлового ввода-вывода.
а по факту на общей нагрузке системы потенциальный выигрыш составляет 1,5-2% от производительности системы, т.к. это задача вторая, а первая -- проксирование, и она "кушает" гораздо больше парсинга.
Возможно оптимизацией парсинга можно добиться и повышя скорости, выигрыш составит еще 1,5%...
А из расчета загрузить сокет-питон на 100% и это преимущество теряется.
Таким образом единственный сколь-нибудь существенный бонус - потенциальная полнота данных для обработки перестает быть существенным, когда считаем
усредненные данные на миллионных выборках.
Зеркалирование -- проигрывает по всем параметрам.
код принимаюшей стороны должен быть эффективнее nginx-а (отвечающего всем "200") в 5 раз для реального выигрыша над юникс-сокет+питон.
Не знаю насколько эффективен будет Go. Но честно говоря даже не вижу смысла проверять.
Он должен на поррядок превосходить какой-нибудь php, а по обнаруженным данным там разница в 3-5 раз, а надо минимум в 10 для того, чтоб это имело хоть какой-то смысл в данной конкретной задаче.
Могу и ошибаться.
>
> --
> Best regards,
> Gena
>
> _______________________________________________
> nginx-ru mailing list
> nginx-ru@nginx.org
> https://mailman.nginx.org/mailman/listinfo/nginx-ru
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru