Re: Тест nginx -- сколько сообщений в log syslog без потерь?
Anatoliy Melnik
anatoliy.melnik на showjet.ru
Пн Фев 5 11:40:42 UTC 2024
И снова Здравствуйте :)
Итак конечный вариант решения:
В конфиге 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 интерфейс практически предел судя по мониторингу.
Всем еще раз спасибо за внимание и советы.
----------- следующая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20240205/f95c279a/attachment-0001.htm>
Подробная информация о списке рассылки nginx-ru