Re: nginx отъедает все процессорное время

Maxim Dounin mdounin на mdounin.ru
Вт Мар 1 18:24:19 UTC 2016


Hello!

On Tue, Mar 01, 2016 at 01:05:37PM -0500, mikhal123 wrote:

> Maxim Dounin Wrote:
> > Это, безусловно, ошибка - должна быть ругань в логе, а не цикл.
> > E.g, при выключенном sendfile'е - будет что-то вроде:
> > 
> > [alert] ... read() read only ... of ... from "..."
> > 
> > А на FreeBSD и при использовании sendfile() в таком случае будет:
> > 
> > [alert] ... sendfile() reported that "..." was truncated at ...
> > 
> > На Linux'е интерфейс sendfile() несколько другой, и явного 
> > детектирования таких ошибок сейчас nginx делать не умеет.  
> > Когда-нибудь обязательно научим, тем более, что при использовании 
> > thread'ов это стало нехорошо проявляться.
> > 
> > Следует, однако, понимать, что в случае неатомарного обновления 
> > файлов клиент имеет все шансы получить произвольную смесь из 
> > старого и нового файлов (не говоря уже о новом содержимом, 
> > обрезанном по старому размеру), и делать так - не надо.  А если вы 
> > так делаете - то надо быть готовым как минимум к мусору в ответах, 
> > а как максимум - и к более другим проблемам.
> > 
> > "В точно такой же конфигурации" - это вряд ли.  Два года назад в 
> > nginx'е не было поддержи "aio threads", а на цикл вы наступили 
> > именно из-за неё - в обычной ситуации на Linux'е соединение просто 
> > повиснет до таймаута.
> > 
> > Что до мусора, то тут всё зависит от везения и конкретного формата 
> > данных.  Если специально не пытаться ловить повреждения данных - 
> > можно долго ничего не замечать, списывая проблемы на подземный 
> > стук.
> 
> По поводу iao threads согласен, запамятовал что включил его после
> обновления
> 
> Про ошибки
> [alert] ... read() read only ... of ... from "..."
> помню, встречал. В моем случае решается несложно - обновляемый файл (а мне
> нужно его обновлять, тут никуда не деться) всегда дополняется пробелами до
> заранее заданного размера, и nginx остается доволен

Ну то есть вы тщательно проигнорировали всё то доброе и вечное, что 
nginx писал вам про некорректность вашей работы с файлами, и 
вместо того, чтобы исправить проблему, заткнули сообщение, 
дополнив файл пробелами?  И, судя по тому, что сейчас у вас всё 
зацикливается - ещё и убрали из кода это дополнение пробелами?  
Почему-то вспоминается старый анекдот про японскую бензопилу. ;)

Не надо так.  Обновляйте файл атомарно, i.e., пишите новый файл, а 
потом делайте rename() в старое имя.  И будет вам счастье.

> Но проблему с зацикливанием, как я понимаю, в ближайшее время вы не сможете
> решить, и как самый простой вариант - отключить aio threads до лучших
> времен?

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

-- 
Maxim Dounin
http://nginx.org/



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