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