nginx-0.8.1
Igor Sysoev
is at rambler-co.ru
Thu Jun 11 13:33:33 MSD 2009
On Wed, Jun 10, 2009 at 10:04:36PM +0400, Volkov Oleg wrote:
> В Срд, 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, когда
> часть запросов проксировалась, а часть из кеша отдавалась. Кстати, если
> как-то вывести в лог номер воркера (в обычный лог, не дебаг)... А то у
$pid
> меня предположение, что ломается именно тот воркер, который и апдейтит
> кеш. Предположение основано на том, что у меня при 8 воркерах
> эффективность кеширования была порядка 80%. Поэтому предлагаю
> реализовать очистку open_file_cache текущего воркера, я наложу этот патч
> и посмотрю что выйдет.
>
> А вообще, между воркерами есть система сигналов? Можно дать команду на
> очистку конкретного значения из open_file_cache всеми воркерами?
Сигналов пока нет. Но чистить нужно лениво по inode, а не для всех подряд.
> Вообще если какая либо программа откроет файл, а другая программа в него
> переименует второй файл, то первая программа просто не узнает об этом.
> Ей надо закрыть файл и открыть снова. Файл будет удален, но на диске он
> будет продолжать существовать, пока его не отпустит программа номер 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 все абсолютно тоже самое.
Патч, исправляющий проверку inode на старте.
--
Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
Index: src/http/ngx_http_file_cache.c
===================================================================
--- src/http/ngx_http_file_cache.c (revision 2252)
+++ src/http/ngx_http_file_cache.c (working copy)
@@ -172,8 +172,9 @@
rc = ngx_http_file_cache_exists(cache, c);
- ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
- "http file cache exists: %i e:%d", rc, c->exists);
+ ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "http file cache exists: %i e:%d %uXL",
+ rc, c->exists, (uint64_t) c->uniq);
if (rc == NGX_ERROR) {
return rc;
@@ -320,6 +321,7 @@
c->node->uses = 1;
c->node->body_start = c->body_start;
c->node->exists = 1;
+ c->node->uniq = of.uniq;
cache->sh->size += (c->length + cache->bsize - 1) / cache->bsize;
}
Index: src/core/ngx_open_file_cache.c
===================================================================
--- src/core/ngx_open_file_cache.c (revision 2252)
+++ src/core/ngx_open_file_cache.c (working copy)
@@ -209,6 +209,10 @@
goto add_event;
}
+ ngx_log_debug2(NGX_LOG_DEBUG_CORE, pool->log, 0,
+ "uniq: %uXL %uXL",
+ (uint64_t) of->uniq, (uint64_t) file->uniq);
+
if (file->use_event
|| (file->event == NULL
&& (of->uniq == 0 || of->uniq == file->uniq)
More information about the nginx-ru
mailing list