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

2024-02-05 Пенетрантность Gena Makhomed

On 05.02.2024 23:21, Evgeniy Berdnikov wrote:


Если у вас уже есть такое рабочее решение - поделитесь опытом, буду рад вас 
выслушать.



Создание нормального рабочего решения должно начинаться
с внимательного чтения документации и исходников nginx.



  Насчёт чтения исходников -- выглядит примерно таким же экстремизмом,
  как требование знания ассемблера для прикладного программиста... :)


Слово "должно" здесь означает SHOULD а не MUST,
то есть - это рекомендация, а не требование.

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

По крайней мере, это часто экономит время, если ответа нет
в документации - то мне обычно проще и быстрее посмотреть
в исходниках - документации №2, или провести эксперимент.

При чем тут ассемблер - не совсем понятно, nginx ведь на C написан,
как и большая часть операционной системы и всего системного софта.


Какую именно существующую проблему Вы пытаетесь решить
с помощью ротации лог-файлов с интервалом в 30 секунд?


  Товарищ отвечал на этот вопрос:
  
https://mailman.nginx.org/pipermail/nginx-ru/2024-January/MD45SEEP573DPPEQYAFT26MPMUK5646B.html


почему не подходит вариант делать ротацию логов с помощью USR1 ?


Потому что если программа, которая читает данные из unix socket`а
отвалится - тогда произойдет переполенение буфера и nginx тогда
заблокируется на операции записи в unix socket, и как следствие
этого - перестанет выполнять свою основную функцию - перестанет
отвечать на запросы клиентов по http / https протоколу.



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


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

Но текущее поведение nginx можно легко узнать с помощью эксперимента.
Мне обычных логов вполне хватает, поэтому записью логов nginx
в unix socket никогда не занимался.


По мне так пример разумного подхода -- сквидовский logfile-daemon.


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

--
Best regards,
 Gena

___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


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

2024-02-05 Пенетрантность Maxim Dounin
Hello!

On Mon, Feb 05, 2024 at 09:56:54PM +0200, Gena Makhomed wrote:

[...]

> Потому что если программа, которая читает данные из unix socket`а
> отвалится - тогда произойдет переполенение буфера и nginx тогда
> заблокируется на операции записи в unix socket, и как следствие
> этого - перестанет выполнять свою основную функцию - перестанет
> отвечать на запросы клиентов по http / https протоколу.

Нет, если в сокет syslog'а не получается писать - nginx [логгирует 
ошибку в error log и] дропает сообщение.  Я об этом, собственно, 
писал в начале треда - судя по всему, исходная проблема была 
именно в том, что syslog-сервер не успевал выгребать сообщения, и 
они осыпались на пол.

(А если вернуться к основам, то в syslog через стандартную 
библиотеку nginx не пишет именно потому, что там запись в сокет в 
случае чего блокируется, и так, конечно, жить нельзя.)

[...]

> Так же не понятно, в чем для Вас проблема переименовать
> log-файл и отправить сигнал USR1 мастер-процессу nginx,
> для того, чтобы он переоткрыл log-файл и продолжил запись.
> 
> Особенно, если учесть, что директива https://nginx.org/r/access_log
> имеет дополнительные параметры [buffer=size] [flush=time] [if=condition]

+1

Нет никаких проблем вращать файловые логи в nginx'е, переоткрытие 
логов по USR1 - дешёвая и быстрая операция.

При этом запись в файловые логи, во-первых, куда эффективнее 
записи в syslog, в силу отсутствия лишних context switch'ей, а 
во-вторых, позволяет дополнительно и существенно снизить затраты 
за счёт буферизации и даже gzip-сжатия на лету.

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

[...]

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


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

2024-02-05 Пенетрантность Evgeniy Berdnikov
On Mon, Feb 05, 2024 at 09:56:54PM +0200, Gena Makhomed wrote:
> On 05.02.2024 15:21, Anatoliy Melnik via nginx-ru wrote:
> > Если у вас уже есть такое рабочее решение - поделитесь опытом, буду рад вас 
> > выслушать.
> 
> Создание нормального рабочего решения должно начинаться
> с внимательного чтения документации и исходников nginx.

 Насчёт чтения исходников -- выглядит примерно таким же экстремизмом,
 как требование знания ассемблера для прикладного программиста... :)

> Какую именно существующую проблему Вы пытаетесь решить
> с помощью ротации лог-файлов с интервалом в 30 секунд?

 Товарищ отвечал на этот вопрос:
 
https://mailman.nginx.org/pipermail/nginx-ru/2024-January/MD45SEEP573DPPEQYAFT26MPMUK5646B.html

> Потому что если программа, которая читает данные из unix socket`а
> отвалится - тогда произойдет переполенение буфера и nginx тогда
> заблокируется на операции записи в unix socket, и как следствие
> этого - перестанет выполнять свою основную функцию - перестанет
> отвечать на запросы клиентов по http / https протоколу.

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

 По мне так пример разумного подхода -- сквидовский logfile-daemon.
-- 
 Eugene Berdnikov
___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


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

2024-02-05 Пенетрантность Илья Шипицин
пн, 5 февр. 2024 г. в 20:57, Gena Makhomed :

> On 05.02.2024 15:21, Anatoliy Melnik via nginx-ru wrote:
> >> какую именно проблему Вы пытаетесь решить с помощью записи логов
> >> в unix socket, чтения данных из unix socket`а питоновским скриптом
> >> и потом записи данных этим питоновским скриптом в текстовой файл?
>
> > Если вы предлагаете писать напрямую с nginx-а в файл -- сделайте у себя
> ротацию файлов с интервалом 30 сек при 200-250 тыс подключений/сек...
> > Если у вас уже есть такое рабочее решение - поделитесь опытом, буду рад
> вас выслушать.
>
> Создание нормального рабочего решения должно начинаться
> с внимательного чтения документации и исходников nginx.
>
> Какую именно существующую проблему Вы пытаетесь решить
> с помощью ротации лог-файлов с интервалом в 30 секунд?
>
> > А на текущем отрезке времени:
> > Спасибо, я уже все решил :)
>
> Нет. Вы просто создали себе еще большую проблему на ровном месте.
>
> Потому что если программа, которая читает данные из unix socket`а
> отвалится - тогда произойдет переполенение буфера и nginx тогда
> заблокируется на операции записи в unix socket, и как следствие
> этого - перестанет выполнять свою основную функцию - перестанет
> отвечать на запросы клиентов по http / https протоколу.
>
> То есть, то что Вы сделали - это достаточно хрупкое
> и ненадежное "решение", особенно в условиях высоких нагрузок.
>
> Не всегда нужно все подряд писать в лог, например,
> можно ограничиться записью в лог только ответов с 4хх и 5хх статусами,
> в таком случае - не будет той проблемы, которую Вы пытаетесь
> решить таким способом с помощью unix-socket`а и python.
>
> Так же не понятно, в чем для Вас проблема переименовать
> log-файл и отправить сигнал USR1 мастер-процессу nginx,
> для того, чтобы он переоткрыл log-файл и продолжил запись.
>
> Особенно, если учесть, что директива https://nginx.org/r/access_log
> имеет дополнительные параметры [buffer=size] [flush=time] [if=condition]
>
> Вместо этого - какие-то жуткие костыли - то syslog, то unix socket и
> питоновские скрипты, читающие данные из этого unix-socket`а пишущие
> текстовые файлы, то еще что-то.
>
> Вы так и не ответили на мой вопрос, какую именно проблему
> Вы пытаетесь решить таким вот нетривиальным способом?
>

проблему трудоустройства )) ?


положа руку на сердце, с ротацией логов есть несколько, честно скажем,
решений, с которыми выглядит как компромисс

1) переменные (позволяющие создавать новый лог, скажем по map-у раз в 30
сек). вроде норм, но буферизации в этом случае не будет. но на nvme
возможно норм
2) copytruncate режим
3) описанный режим с USR1


>
> https://habr.com/ru/companies/dododev/articles/467047/
> Феномен XY: как избежать «неправильных» проблем
>
> --
> 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


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

2024-02-05 Пенетрантность Gena Makhomed

On 05.02.2024 15:21, Anatoliy Melnik via nginx-ru wrote:

какую именно проблему Вы пытаетесь решить с помощью записи логов
в unix socket, чтения данных из unix socket`а питоновским скриптом
и потом записи данных этим питоновским скриптом в текстовой файл?



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


Создание нормального рабочего решения должно начинаться
с внимательного чтения документации и исходников nginx.

Какую именно существующую проблему Вы пытаетесь решить
с помощью ротации лог-файлов с интервалом в 30 секунд?


А на текущем отрезке времени:
Спасибо, я уже все решил :)


Нет. Вы просто создали себе еще большую проблему на ровном месте.

Потому что если программа, которая читает данные из unix socket`а
отвалится - тогда произойдет переполенение буфера и nginx тогда
заблокируется на операции записи в unix socket, и как следствие
этого - перестанет выполнять свою основную функцию - перестанет
отвечать на запросы клиентов по http / https протоколу.

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

Не всегда нужно все подряд писать в лог, например,
можно ограничиться записью в лог только ответов с 4хх и 5хх статусами,
в таком случае - не будет той проблемы, которую Вы пытаетесь
решить таким способом с помощью unix-socket`а и python.

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

Особенно, если учесть, что директива https://nginx.org/r/access_log
имеет дополнительные параметры [buffer=size] [flush=time] [if=condition]

Вместо этого - какие-то жуткие костыли - то syslog, то unix socket и 
питоновские скрипты, читающие данные из этого unix-socket`а пишущие

текстовые файлы, то еще что-то.

Вы так и не ответили на мой вопрос, какую именно проблему
Вы пытаетесь решить таким вот нетривиальным способом?

https://habr.com/ru/companies/dododev/articles/467047/
Феномен XY: как избежать «неправильных» проблем

--
Best regards,
 Gena

___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


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

2024-02-05 Пенетрантность Anatoliy Melnik via nginx-ru



Gena Makhomed 

>какую именно проблему Вы пытаетесь решить с помощью записи логов 
>в unix socket, чтения данных из unix socket`а питоновским скриптом 
>и потом записи данных этим питоновским скриптом в текстовой файл? 




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

А на текущем отрезке времени: 
Спасибо, я уже все решил :) 


___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


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

2024-02-05 Пенетрантность Gena Makhomed

On 05.02.2024 13:40, Anatoliy Melnik via nginx-ru wrote:


Итак конечный вариант решения:

Данные почти равномерно расходятся по 10-ти файлам, которые пишутся на tmpfs в 
RAM.
Отказался и от rsyslog и от syslog-ng
В качестве принимающей стороны выступает пока python скрипт
В нем стартую 10 процессов, каждый слушает свой сокет и вся его задача -- 
сложить в файл данные.


какую именно проблему Вы пытаетесь решить с помощью записи логов
в unix socket, чтения данных из unix socket`а питоновским скриптом
и потом записи данных этим питоновским скриптом в текстовой файл?

https://habr.com/ru/companies/dododev/articles/467047/
Феномен XY: как избежать «неправильных» проблем

--
Best regards,
 Gena

___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


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

2024-02-05 Пенетрантность Evgeniy Berdnikov
On Mon, Feb 05, 2024 at 02:40:42PM +0300, Anatoliy Melnik via nginx-ru wrote:
>syslog-ng при работе с unixSocket показал довольно низкую
>производительность. (Долго с ним не разбирался. Чисто дефолтная установка
>и минимальная настройка).

 Syslog-ng производит огромное количество ненужных (на мой взгляд) сисколов
 при работе с unix-сокетами, к тому же пытается то, что отдаётся в syslog(3),
 подменить на более "правильную", по мнению автора, информацию... Например,
 выправить pid, если писатель нарисовал чужой (наверное, это такая забота о
 безопасности). Всё очень трогательно, но эта забота выливается в большие
 накладные расходы. Под большую нагрузку syslog-ng явно не заточен.
-- 
 Eugene Berdnikov
___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


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

2024-02-05 Пенетрантность Anatoliy Melnik via nginx-ru
И снова Здравствуйте :) 
Итак конечный вариант решения: 

В конфиге nginx вот такая конструкция 

map "$remote_port" $log_selector_0 { 
default 0; 
~0$ 1; 
} 
map "$remote_port" $log_selector_1 { 
default 0; 
~1$ 1; 
} 
map "$remote_port" $log_selector_2 { 
default 0; 
~2$ 1; 
} 
map "$remote_port" $log_selector_3 { 
default 0; 
~3$ 1; 
} 
map "$remote_port" $log_selector_4 { 
default 0; 
~4$ 1; 
} 
map "$remote_port" $log_selector_5 { 
default 0; 
~5$ 1; 
} 
map "$remote_port" $log_selector_6 { 
default 0; 
~6$ 1; 
} 
map "$remote_port" $log_selector_7 { 
default 0; 
~7$ 1; 
} 
map "$remote_port" $log_selector_8 { 
default 0; 
~8$ 1; 
} 
map "$remote_port" $log_selector_9 { 
default 0; 
~9$ 1; 
} 

. 


access_log 
syslog:server=unix:/run/socket-00,nohostname,facility=local5,severity=info,tag=nginxStats01
 st01 if=$log_selector_0; 
access_log 
syslog:server=unix:/run/socket-01,nohostname,facility=local5,severity= info 
,tag=nginxStats01 st01 if=$log_selector_1; 
access_log 
syslog:server=unix:/run/socket-02,nohostname,facility=local5,severity= info 
,tag=nginxStats01 st01 if=$log_selector_2; 
access_log 
syslog:server=unix:/run/socket-03,nohostname,facility=local5,severity= info 
,tag=nginxStats01 st01 if=$log_selector_3; 
access_log 
syslog:server=unix:/run/socket-04,nohostname,facility=local5,severity= info 
,tag=nginxStats01 st01 if=$log_selector_4; 
access_log 
syslog:server=unix:/run/socket-05,nohostname,facility=local5,severity=info,tag=nginxStats01
 st01 if=$log_selector_5; 
access_log 
syslog:server=unix:/run/socket-06,nohostname,facility=local5,severity= info 
,tag=nginxStats01 st01 if=$log_selector_6; 
access_log 
syslog:server=unix:/run/socket-07,nohostname,facility=local5,severity= info 
,tag=nginxStats01 st01 if=$log_selector_7; 
access_log 
syslog:server=unix:/run/socket-08,nohostname,facility=local5,severity= info 
,tag=nginxStats01 st01 if=$log_selector_8; 
access_log 
syslog:server=unix:/run/socket-09,nohostname,facility=local5,severity= info 
,tag=nginxStats01 st01 if=$log_selector_9; 

Данные почти равномерно расходятся по 10-ти файлам, которые пишутся на tmpfs в 
RAM. 
Отказался и от rsyslog и от syslog-ng 
В качестве принимающей стороны выступает пока python скрипт 
В нем стартую 10 процессов, каждый слушает свой сокет и вся его задача -- 
сложить в файл данные. 

Отказ от rsyslog-а обусловлен просто огромным количеством переключений 
контекста, rsyslog-ом генерируемое. 
Уже на 200-210тыс/сек их количество переваливает за 1.4 млн/сек. ( примерно 
0.9млн - работа rsyslog-а) и на этой отметке сильно деградирует 
производительность системы в целом. 

syslog-ng при работе с unixSocket показал довольно низкую производительность. 
(Долго с ним не разбирался. Чисто дефолтная установка и минимальная настройка). 

python по сравнению с rsyslog ЦПУ потребляет немного больше, но переключений 
контекста значительно меньше, и это положительно сказывается на работе всей 
системы. 


Как итог -- проверен порог в 220-230 тыс/сек (такая нагрузка сохранялась около 
3-х часов) на 1 nginx, на моем железе все отработало нормально, все метрики 
сошлись. 

Попытка с UDP -- больше потребление CPU, больше прерываний, больше переключений 
контекста... 
И если 220-230 тыс/сек на 10 unixSocket -еще не предел для моего железа, то те 
же 220-230 тыс/сек на udp на loopback интерфейс практически предел судя по 
мониторингу. 


Всем еще раз спасибо за внимание и советы. 


___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


Зеркало https://hg.nginx.org/pkg-oss на github

2024-02-05 Пенетрантность Иван

Здравствуйте!

Нельзя ли добавить на github зеркало сабжевого репа? Используем его для 
сборки nginx и модулей (отсутствующих в официальной поставке), 
зеркалируем реп во внутренний гитлаб, хотелось бы убрать костыли типа 
mercurial 2 git.



С уважением, Иван.
___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


Re: nginxQuic: скорость загрузки при активации kTLS

2024-02-05 Пенетрантность izorkin
Добрый день, Максим.

Ясно, благодарю за пояснение :)

Вы писали 5 февраля 2024 г., 11:40:55:

> Hello!

> Это какая-то внутренняя история curl'а про борьбу с неэффективным 
> демультиплексингом, к nginx'у не имеет отношения примерно 
> никакого, да и в самом curl'е относится только к случаю получения 
> нескольких файлов одновременно по одному соединению.


-- 
С уважением,
 Izorkin  mailto:izor...@gmail.com
___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


Re: nginxQuic: скорость загрузки при активации kTLS

2024-02-05 Пенетрантность Maxim Dounin
Hello!

On Sun, Feb 04, 2024 at 10:03:56AM +0300, izor...@gmail.com wrote:

> Добрый день, Максим.
> 
> Сегодня увидел, что разработчики избавились от буферов приёма и
> создали новый способ разгрузки для протокола HTTP/2:
> https://github.com/icing/blog/blob/main/curl-h2-perf-evolution.md
> https://github.com/curl/curl/pull/12828
> 
> Реализации аналогичного варианты в Nginx как-то поможет для ускорения
> работы с протоколом HTTP/2?

Это какая-то внутренняя история curl'а про борьбу с неэффективным 
демультиплексингом, к nginx'у не имеет отношения примерно 
никакого, да и в самом curl'е относится только к случаю получения 
нескольких файлов одновременно по одному соединению.

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru