Master процесс nginx 0.6.38 съедает всю доступную память

Maxim Dounin mdounin at mdounin.ru
Thu Sep 17 17:14:17 MSD 2009


Hello!

On Thu, Sep 17, 2009 at 04:22:41PM +0500, Одинцов Павел wrote:

> Добрый вечер!
> 
> Да, такое было вполне возможно, т.к. клиентские настройки сразу
> вливаются в конфиг. Но, к сожалению, правильно переписывать конфиг (с
> mv) не можем, т.к. рулит конфигами закрытый софт.

Если конфиги переписываются в процессе их чтения - то прочитаться 
может любая смесь старого и нового.  В хорошем случае она будет 
невалидна синтаксически, в плохом - валидна, но делать совсем не 
то что от неё ожидается.

Так что эту проблему вам так или иначе решать, и чем быстрее - тем 
лучше.

Я бы для начала просто перевесил nginx на другой конфиг, 
подкладывал бы конфиги из "закрытого софта" через mv, и дёргал 
nginx только убедившись что файл закрыт на запись (через fstat).

> Я верно понял, что nginx пытается найти в "старом конце файла" eof и
> на этом виснет?

Он пытается прочитать столько, каков был размер файла исходно.  И 
не может.  От чего очень огорчается.  :)

Maxim Dounin


> 
> 2009/9/17 Maxim Dounin <mdounin at mdounin.ru>:
> > Hello!
> >
> > On Thu, Sep 17, 2009 at 09:11:02AM +0500, Одинцов Павел wrote:
> >
> >> Доброе утро!
> >>
> >> Снова воспроизвелось на 0.6.38 и очень красиво воспроизвелось :)
> >
> > [...]
> >
> >
> >> --- SIGHUP (Hangup) @ 0 (0) ---
> >> gettimeofday({1253118667, 649143}, NULL) = 0
> >> rt_sigreturn(0x667b29)                  = -1 EINTR (Interrupted system call)
> >> gettimeofday({1253118667, 649273}, NULL) = 0
> >> uname({sys="Linux", node="server4.hosting.reg.ru", ...}) = 0
> >> open("/etc/nginx/nginx.conf", O_RDONLY) = 21
> >> fstat(21, {st_mode=S_IFREG|0640, st_size=1023752, ...}) = 0
> >> pread(21, "################################"..., 4096, 0) = 4096
> >
> > [...]
> >
> >> pread(21, "\tproxy_pass http://87.242.78.188"..., 4093, 1021200) = 2539
> >> brk(0x1cc67000)                         = 0x1cc67000
> >> pread(21, "", 4094, 1023739)            = 0
> >
> > [...]
> >
> > Судя по всему, nginx.conf переписали в процессе чтения его
> > nginx'ом.  Прочиталось всего 1023739 байт (1021200 + 2539), а файл
> > исходно был размером 1023752 байта.
> >
> > Баг это не отменяет, но вообще так делать нельзя, файлы надо
> > менять атомарно (писать в другое место + rename).  Как минимум от
> > подобных действий должна случаться ошибка чтения конфигурации (и
> > отмена переконфигурации соответственно).
> >
> > Maxim Dounin
> >
> >
> 
> 
> 
> -- 
> С уважением, Одинцов Павел





More information about the nginx-ru mailing list