nginx-0.8.1
Volkov Oleg
nginx at teratelecom.ru
Wed Jun 10 22:04:36 MSD 2009
В Срд, 10/06/2009 в 20:28 +0400, Igor Sysoev пишет:
> On Wed, Jun 10, 2009 at 07:20:49PM +0400, Volkov Oleg wrote:
>
> > В Срд, 10/06/2009 в 13:58 +0400, Igor Sysoev пишет:
> > > On Tue, Jun 09, 2009 at 07:53:38PM +0400, Volkov Oleg wrote:
> > >
> > > > > > Вот пример одного из запросов. Урл заменен на ...
> > > > > > Файловая система xfs
> > > > > > Замена на tmpfs не помогает
> > > > >
> > > > > [...]
> > > > >
> > > > > > 2009/06/09 08:27:27 [debug] 18409#0: *29739 cached open
> > > > > > file: /var/tmp/nginx/proxy_cache2/7/4c/d834b44900b7d1770f6819308056b4c7,
> > > > > > fd:4195, c:1, e:0, u:9
> > > > >
> > > > > Отключите open_file_cache.
> > > >
> > > > Максим, огромное спасибо. Заработало.
> > > > Отключил open_file_cache для проксируемых запросов и эффективность
> > > > кеширования стала 99.86%.
> > > >
> > > > Желательно все же подправить исходники (в будущих версиях), чтобы при
> > > > изменении состояния кеша с включенной опцией open_file_cache nginx
> > > > нормально работал.
> > >
> > > Похоже, проблема в xfs и tmpfs. nginx сравнивает inode закэшированного
> > > открытого файла и inode файла в зоне кэша. Похоже, что xfs и tmpfs вместо
> > > inode возварщают ноль. Нужно смотреть, что уникально для файла в xfs,
> > > tmpfs и прочих им подобных.
> >
> > Могу предложить при выполнении записи в кеш (переименовании из
> > временного файла) чистить нужное значение в open_file_cache.
>
> Кэш общий для всех воркеров, а open_file_cache - внутри каждого воркера
> свой: файловые дескрипторы у каждого свои.
Ага, это объясняет поведение nginx при количестве воркеров > 1, когда
часть запросов проксировалась, а часть из кеша отдавалась. Кстати, если
как-то вывести в лог номер воркера (в обычный лог, не дебаг)... А то у
меня предположение, что ломается именно тот воркер, который и апдейтит
кеш. Предположение основано на том, что у меня при 8 воркерах
эффективность кеширования была порядка 80%. Поэтому предлагаю
реализовать очистку open_file_cache текущего воркера, я наложу этот патч
и посмотрю что выйдет.
А вообще, между воркерами есть система сигналов? Можно дать команду на
очистку конкретного значения из open_file_cache всеми воркерами?
Вообще если какая либо программа откроет файл, а другая программа в него
переименует второй файл, то первая программа просто не узнает об этом.
Ей надо закрыть файл и открыть снова. Файл будет удален, но на диске он
будет продолжать существовать, пока его не отпустит программа номер 1.
Что касаемо инод в XFS
$ echo 1 >1
$ echo 2 >2
$ find . -printf "%p %i\n"
. 100666534
./1 103771654
./2 105527833
$ mv 2 1
$ find . -printf "%p %i\n"
. 100666534
./1 105527833
Так что номер иноды меняется. Для tmpfs все абсолютно тоже самое.
--
С уважением,
Волков Олег
More information about the nginx-ru
mailing list