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