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

Anatoliy Melnik anatoliy.melnik на showjet.ru
Ср Фев 21 12:54:20 UTC 2024


Gena Makhomed Wrote: 
------------------------------------------------------- 
> On 19.02.2024 16:01, Anatoliy Melnik via nginx-ru wrote: 
> 
> >>>> Если вы предлагаете писать напрямую с nginx-а в файл -- 
> >>>> сделайте у себя ротацию файлов с интервалом 30 сек 
> >>>> при 200-250 тыс подключений/сек... 
> >>>> 
> >>>> Если у вас уже есть такое рабочее решение - 
> >>>> поделитесь опытом, буду рад вас выслушать. 
> >>> 
> >>> Я намеренно ввел вас в заблуждение путем публикации сообщения, 
> >>> допускающее двойное толкование в ту или иную сторону по желанию 
> >>> сторон. 
> >> 
> >> Почему / зачем? 
> > 
> > Был шанс увидеть в ответ нестандартное решение. 
> 
(мантры про логи...) 
> 
> Какое именно "нестандартное решение" для вышеобозначенной проблемы 
(мантры....) 

Если вам его не видно -- это не значит, что его нет. 
Тот же костыль из юникс-сокета у меня в "альфа" версии на этапе проверки возможностей 
показал результат в 400тыс/сек с запасом. 
Кстати от вас я так и не увидел ни одной ссылки на конкретные значения из вашего личного опыта. 
Лично мой опыт показывает, что при значениях более 500тыс/сек и примерно 1млн "живых" tcp сессий "падает" уже сама ось. 
Если у вас есть конкретный пример, что на таком-то железе, такой-то оси вы "перевариваете" 1млн/сек -- отлично. 
Если нет... Ну на нет и суда нет. 


> 
> >> С моей точки зрения более важным является обеспечение более 
> высокой 
> >> надежности работы системы, чтобы логи не терялись в процессе 
> записи, 
> >> чем экономия свободного места на диске и экономия ресурсов NVMe 
> SSD. 
> >> 
> >> Поэтому с моей точки зрения - я не могу признать решение 
> >> через syslog и unix socket более оптимальным, чем вариант 
> >> записи логов напрямую в файлы и ротации логов через SIGUSR1. 
> >> 
> >> а ротацию логов можно делать и чаще, чем раз в 30 секунд, 
> >> например, раз 15, или раз в 10 или даже раз в 5 секунд, 
> >> если хочется уменьшить отставание статистики по времени. 
> >> 
> >> По сути - лог-файл на диске - это можете воспринимать примерно, 
> >> как то же самое, что и unix socket, только с буфером не в памяти, 
> >> а в виде файла на диске и без существенных ограничений по размеру 
> >> такого буфера, что будет лучше сглаживать всплески нагрузки 
> >> и может позволить большую асинхронность между процессом 
> >> записи информации в лог и процессом чтения информации 
> >> из лога. А во всем остальном - никакой существенной 
> >> разницы нет, учитывая только что запись логов в файлы 
> >> меньше грузит процесор и использует немного больше 
> >> свободного места на диске. 
> >> 
> >> Но мне например, лучше чтобы процессор был немного свободнее, 
> >> чем проистаивающее и никак не используемое место на диске. 
> >> 
> >> Но самое главное - что запись логов в файлы не приводит к потере 
> >> данных, а запись логов в unix socket может приводить к потерям 
> >> даных, если читатель будет не успевать забирать данные из unix 
> >> socket. 
> >> 
> >> Более надежное и более простое решение, и более экономно 
> >> расходующее процесор сервера - и будет более оптимальным. 
> 
> > пока я наблюдал скорее проблему "писатель не успевает записывать", 
> > а не "читатель не успевает забирать". 
> 
> видимая Вами проблема "писатель не успевает записывать" 
> вызвана именно тем, что "читатель не успевает забирать". 
> 
> Потому что когда у Вас был всего один читатель - он не успевал 
> читать данные из syslog и поэтому у nginx не было никаких других 
> вариантов, кроме как дропать часть сообщений. После того как вместо 
> одного читателя Вы сделали 10 читателей - они начали успевать читать 
> данные из syslog и проблема с потерей сообщений стала быть Вам не 
> видна. 
> 
Вы, как и всегда, имеете полное право на свое мнение. 


> > Эта же проблема и при файлах присутствует -- NVME не у всех всегда 
> везде. 
> > Система дисковая как ни крути - общий ресурс, и если ее интенсивно 
> нагрузить 
> > чем-то еще логи тоже могут получить проблему читатель-писатель. 
> 
> На frontend-сервере, сеть может быть загружена на 100% передачей 
> данных, 
> и процессор может быть загружен на 100% шифрованием/расшифровской 
> TLS. 
> Дисковая подсистема может использоваться только для записи логов. 
> 
> нагружать дисковую подсистему чем-либо еще, крмое записи логов 
> - нерационально, имеет смысл даже полностью выключить использование 
> диска при проксировании, чтобы не было блокирования nginx на 
> операциях 
> дискового ввода-вывода и чтобы не было увеличения latency, когда 
> этого 
> можно очень просто ибежать: 
> 
> proxy_http_version 1.1; 
> proxy_request_buffering off; 
> proxy_max_temp_file_size 0; 
> 
> По поводу того, что сейчас NVMe есть не у всех и не всегда 
> - это Вы мне сейчас из какого года свое сообщение пишете ? 

Вы, как и всегда, имеете полное право на свое мнение. 
Свой набор критериев оптимальности и эффективности. 


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

Что и было описано еще в самом начале. 

> Потому что если логи не нужны - их просто выключают для 1хх, 2хх 
> и 3хх статусов и логгируют только 4хх и 5хх ошибки, так что размер 
> лог-файлов получается очень небольшим и никаких проблем создать не 
> может. 
> 
> map $status $loggable { 
> ~^[45] 1; 
> default 0; 
> } 
> access_log /path/to/access.log combined if=$loggable; 
> 
> >> Вот как я уже говорил, задача построения VPN - если взять все 
> множество 
> >> таких задач, то в части случаев для построения VPN более 
> оптимальным 
> >> вариантом будет использование WireGuard, а в части случаев - 
> OpenVPN. 
> >> Именно потому, что WireGuard обладает некоторыми свойствами 
> >> и качествами, которые отсутствуют в OpenVPN, и наоборот, 
> >> потому что OpenVPN обладает некоторыми свойствами и качествами, 
> >> которые отсутствуют в WireGuard. И поэтому в части случаев 
> >> оказывается более оптимальным и целесообразным построение 
> >> VPN с использованием WireGuard, а в некоторых случаях 
> >> - более оптимальнныи и целесообразным оказывается 
> >> построение VPN с использованием OpenVPN. 
> >> 
> > И в части случаев оба они окажутся в равной степени не пригодны... 
> > Да и там, где пригодны, далеко не всегда оптимальны по каким-то 
> критериям. 
> > VPN технологий существуют десятки. Но вы почему-то в этом посте 
> ограничились 2-мя. 
> > А как же "все множество путей" ? 
> > Эти 2 достаточно удобны для решения большого круга задач -- это да, 
> но это не отменяет достоинств других VPN-ов. 
> 
> Я рассматриваю только те реализации VPN, которые доступны 
> в виде open source, и которые доступны для использования, 
> без необходимости покупать лицензию на право использования 
> программы. 
> 
> Все другие варианты Open Source VPN имеет смысл рассматривать 
> только в том случае, если они имеют какие-то преимущества, 
> по сравнению с WireGuard и OpenVPN. Если у них никаких 
> преимуществ нет - тогда их можно и не рассматривать. 
> 
> Еще есть Shadowsocks, если необходимо обходить 
> блокировки WireGuard и OpenVPN через DPI, 
> но это очень специфическая задача. 

В openssh-е есть "встроенный" socks5. Можно вообще без дополнительного ПО обойтись. 
Довольно долгое время вообще ppp over ssh пользовался и более чем устраивало. 
Но опять же. 
Вы, как и всегда, имеете полное право на свое мнение. 
Свой набор критериев оптимальности и эффективности. 

> 
> WireGuard и OpenVPN - это две наиболее надежные 
> по качеству кода и наиболее проверенные аудитами 
> реализации VPN. По этому парметру - все остальные 
> реализации и варианты VPN - значительно хуже. 
> 
> Например, в самом протоколе IPsec или в его популярных реализациях 
> могут быть закладки от NSA, поэтому IPsec лучше не использовать. 
> https://en.wikipedia.org/wiki/IPsec#Alleged_NSA_interference 
> 
> >> Так ведь свободное место на разделе есть, с этим же нет проблем. 
> 
> > Есть проблема. 
> > В исходной постановке (когда сия задача встала передо мной) задачи 
> было пожелание обойтись имеющимся ресурсом. 
> > Я задачу решил именно в этих начальных условиях. 
> 
> Как правило, свободное место на диске - это самый дешевый ресурс. 
> И экономить место на диске, увеличивая нагрузку на процессор, 
> или теряя часть сообщений - это не самое лучшее решение. 

Вы, как и всегда, имеете полное право на свое мнение. 
Свой набор критериев оптимальности и эффективности. 

> 
> >>> с моей точки зрения менять одну проблему на другую смысла нет 
> >> 
> >> использование места на диске - это не проблема, это необходимая 
> плата 
> >> за то, что запись в логи будет происходить без потерь информации, 
> >> и что чтения и обработка информации из логов не обязаны быть 
> >> такими синхронными и производительными, как в случае с unix 
> >> socket`ами. 
> >> 
> > Обязаны! и синхронными и производительными. 
> > Если статистика будет накапливаться быстрее, чем обрабатываться, то 
> данные никогда не будут актуальны. 
> > Т.е. я сегодня увижу статистику за вчера, а за сегодня-- только 
> через 2 дня, а к концу года буду видеть уже с отставанием в месяц?? 
> > И кому это будет интересно?? 
> 
> Вы меня не поняли. 
> 
> Если использовать unix socket - при переполнении буфера 
> в памяти происходит потеря части сообщений. Если в условиях 
> постановки задачи важно не терять сообщения - тогда читатель 
> сообщений должен быть таким же производительным и как писатель. 
> 
> Иногда, во время DDoS-атак приходит огромное количество запросов, 
> так что процессор может быть занят на 100% и просто не остается 
> на сервере процессорных мощностей для того, чтобы читатель 
> с другой стороны unix socket`а успевал бы считывать данные 
> с такой же скоростью, с какой их будет писать туда nginx. 
> А это означает, что такая ситуация неизбежно приведет 
> к потере части сообщений, которые nginx будет вынужден 
> дропать потому что читатель не успевает их читать 
> с другой стороны unix socket`а. 
> 
> Мне такое нестабильно работающее и ненадежное решение не нужно, 
> которое вроде бы нормально работает под небольшой нагрузкой, 
> но начинает глючить и терять сообщения, когда нагрузка возрастает. 
> 
> Если же nginx пишет логи в файл - тогда такой высокой степени 
> синхронности читателя и писателя логов не нужно, пототому что 
> нет буфера в памяти, который очень быстро может переполниться, 
> а есть просто файлы на диске, и читатель логов может читать их 
> с постоянной скоростью, например, 1 мегабайт в секунду, и даже 
> если будут всплески нагрузки на сервер и в какие-то моменты 
> nginx будет писать логи со скоростью 10 или 100 мегабайт в секунду 
> - это все равно не будет приводить к потере сообщений, потому что 
> в этом случае нет небольшого буфера в оперативной памяти, а роль 
> буфера выполняет фактически все свободное место на диске сервера.> 
> И пиковые всплески нагрузки на сервер будут сглаживаться с помощью 
> очень большого "буфера" на диске, и потери сообщений тогда не будет. 
> 
> То есть, при всех прочих условиях, более надежная и более устойчивая 
> к всплескам нагрузки система обработки логов nginx которая не теряет 
> сообщения является более предпочтительной, чем та система, которая 
> теряет часть сообщений в процессе работы при всплесках нагрузки. 
> 
> В большинстве случаев потери сообщений недопустимы 
> или крайне нежелательны, поэтому запись сообщений 
> напрямую в лог-файлы, без дополнительных костылей 
> через syslog и unix socket`ы практически всегда 
> будет более предпочительным вариантом. 
> 
> Тем более, что работающее решение для ротации логов nginx 
> при 200-250 тысячах подключений в секунду и интервале ротации 
> раз в 30 секунд можно очень легко получить, заменив SIGHUP на 
> SIGUSR1. 
> Это есть ответ на тот Ваш вопрос о решении Вашей настоящей проблемы 
> X, 
> который приведен в самом начале этого сообщения. 
> 

Вы, как и всегда, имеете полное право на свое мнение. 
Свой набор критериев оптимальности и эффективности. 


> > Итоги разных экспериментов: 
> > Исходные данные - 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% и 
> > зависимости результата от файлового ввода-вывода. 
> 
> парсинг лога не только самый быстрый, он еще и самый надежный, 
> потому что в этом варианте нет потери сообщений. - Собственно, 
> о чем я Вам и говорил, что это есть самый оптимальный вариант. 
> 
> нагрузку на сеть можно уменьшить, включив HTTP/1.1 и keepalive 
> при подключении к backend`у - это если делать обработку логов 
> именно через mirror на специально выделенный для этой задачи сервер. 
> 
> Вы же не рассмотрели вариант, когда nginx сам пишет логи напрямую 
> в файл, например, блоками по 1 мегабайту, делая всего один системный 
> вызов для записи одного такого блока информации. Насколько 
> я понимаю, при N рабочих процессах nginx для этого потребуется 
> дополнительно всего лишь только N мегабайт оперативной памяти. 
> Но в результате - получим значительное уменьшение расходования 
> процессора на запись логов и значительно меньшее количество 
> операций переключения контекста, ведь по умолчанию вызывается 
> операция записи для каждой строчки лога. 

Вы, как и ранее, совершенно спокойно решаете за меня что я делал, а чего не делал. 

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


> 
> > Таким образом единственный сколь-нибудь существенный бонус - 
> потенциальная полнота данных для обработки перестает быть 
> существенным, когда считаем 
> > усредненные данные на миллионных выборках. 
> 
> полнота даных для обработки - как правило это важно. 
> 
> если Вам нужны усредненные данные на милионных выборках - 
> тогда с технической точки зрения, самым оптимальным вариантом 
> будет написать модуль для nginx, который будет делать эту работу 
> на лету и практически мгновенно и практически с 0 затратами ресурсов. 

Ок. Встанет перед вами такая задача -- вы выберете соответствующий путь ее решения. 

> 
> > Не знаю насколько эффективен будет Go. 
> 
> Go создан достаточно умными людьми, 
> такими как Роб Пайк, один из создателей кодировки UTF-8. 
> 
> Go позволяет сделать concurrency используя goroutines и channels, 
> и этот язык программирования, созданный в Google практически 
> идеально подходит для работы в состоянии высоких нагрузок, 
> позволяя быстро писать быстрый, качественный и надежный код, 
> который легко справляться даже с очень высокими нагрузками. 

Без проблем -- пишете, тестируете, выкладываете сюда сравнительные результаты. 
С числами, процентами, погрешностями и т.д. в конкретной задаче. 

> 
> Если производиельности которую дает Go будет не хватать, 
> тогда остается только Rust, C++ и C, но обычно - дешевле 
> и проще будет просто горизонтальное масштабирование, 
> путем увеличения количества серверов для вебсайта. 
> 
> Если нет highload, тогда удобнее и приятнее Python, 
> и скорость написания кода будет выше, но скорость 
> работы кода будет ниже - вот такой тут trade-off. 
> 
> > Он должен на порядок превосходить какой-нибудь php 
> 
> Он превосходит. Поэтому практически весь highload делают 
> сейчас именно на Go а не на PHP, если есть возможность выбора 
> и нет необходимости работать с большим количеством legacy кода. 
"Он превосходит" и "он превосходит на порядок" -- несколько разные формулировки. 
Но у вас есть возможность показать это практически -- пишете 2 реализации одного и тогоже функционала на Go и НЕ_Go, 
сравниваете, затем сравниваете с "тупо 200 всем прям с nginx-а" и обнародуете результат. 

На даном этапе лично я свой "костыль" довел до альфа-версии инвалидского кресла с моторчиком :) 
Проверяю возможность автоматического противодействия ДДоС-у почти в реальном времени. 
Но это уже совсем другая история. 

> 
> -- 
> Best regards, 
> Gena 
> 
> _______________________________________________ 
> nginx-ru mailing list 
> nginx-ru на nginx.org 
> https://mailman.nginx.org/mailman/listinfo/nginx-ru 



----------- следующая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20240221/265ffc0c/attachment-0001.htm>


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