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

Igor Sysoev is at rambler-co.ru
Fri Sep 18 15:05:40 MSD 2009


On Fri, Sep 18, 2009 at 02:47:02PM +0400, Maxim Dounin wrote:

> Hello!
> 
> On Fri, Sep 18, 2009 at 01:52:23PM +0400, Igor Sysoev wrote:
> 
> > On Thu, Sep 17, 2009 at 02:59:21PM +0400, Maxim Dounin wrote:
> > 
> > > 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).  Как минимум от 
> > > подобных действий должна случаться ошибка чтения конфигурации (и 
> > > отмена переконфигурации соответственно).
> > 
> > Странно, что не отработал этот код:
> > 
> >             if (n != size) {
> >                 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
> >                                    ngx_read_file_n " returned "
> >                                    "only %z bytes instead of %z",
> >                                    n, size);
> >                 return NGX_ERROR;
> >             }
> > 
> > потому что в strace нет результата ngx_conf_log_error().
> > 
> > У меня в искусствено созданном случае выдаётся
> > [emerg] 7899#0: pread() returned only ... bytes instead of ... in ...
> > и всё завершается.
> 
> 0.6.38

Спасибо. Мне казалось, что эта проверка появилась давно, а оказывается,
только в 0.7.14.


-- 
Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list