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