ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [patch] Боремся с перепол нением spool


  • To: nginx-ru@xxxxxxxxx
  • Subject: Re: [patch] Боремся с перепол нением spool
  • From: Andrey Zonov <andrey.zonov@xxxxxxxxx>
  • Date: Fri, 27 Mar 2009 10:47:03 +0300
  • Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from :user-agent:mime-version:to:subject:references:in-reply-to :content-type; bh=Ep6g3btzCEQWeI3NIvMUY8a/BbjdwSj7P4r2lHGazfs=; b=UjTQS0yaJMPKr/ULNGad5JKgZIAvNgaaJ65rwDqAQcEPHvbTjhzNefyo548ILaDMXR RtP+4/3WTiKG8ohbE3u/MO8ce8w5c+57S0nKSjZqpHS9ruZh/ZX7cRqu3ALpYqIRfR0d kwUK3yYXPSNPBUcB6GpY54ZI2ne+goZSZG8cg=
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type; b=jh76qA0O0++kEOPbXzJV6/szXVgNMhmTSJc8ey3eZADpOp2LwN1cjj8koolD15UQlI SBe1D2uSiQLbVEWOR4Eam0JQQF2woTru4NlX09HwSQ7317Qc8OXJLTfTbLWxPh8W7FCG TAc6+KNx34fhJkl/2MyBTDlMmBvJ7zY4pzKk8=
  • In-reply-to: <49CC8429.3030606@xxxxxxxxx>
  • References: <49CC8429.3030606@xxxxxxxxx>

Самое главное забыл...

Andrey Zonov пишет:
 Доброе утро.

Сделал костыль который решает проблему с пустым ответом при переполнении spool-а. Теперь proxy_temp_path и proxy_store/proxy_cache_path можно разнести на разные диски и при переполнении proxy_store/proxy_cache_path не будет происходить отдача пустого тела.

 Как это работает (во freebsd):
1. патчим, пересобираем, инсталлируем и делаем upgrade
cp patch-ngx_file.c patch-ngx_files.c patch-ngx_files.h /usr/ports/www/nginx-devel/files
 cd /usr/ports/www/nginx-devel && make deinstall install clean
 /usr/local/etc/rc.d/nginx upgrade
2. создаём memory-disk на N мб
 mdconfig -a -t malloc -o reserve -s Nm
 newfs ... /dev/md0
 mkdir /data/nginx/spool
 mount /dev/md0 /data/nginx/spool
 chown nobody /data/nginx/spool
3. меняем в конфиге
 proxy_temp_path         /data/nginx/cache/spool ...
 proxy_cache_path        /data/nginx/cache ...
на
 proxy_temp_path         /data/nginx/spool ...
 proxy_cache_path        /data/nginx/cache ...
4. релоадим nginx
 /usr/local/etc/rc.d/nginx reload
5. смотрим логи...

Недостатки:
   * большее потребление cpu
* при переполнении proxy_store/proxy_cache_path сыплются ошибки в error лог о нехватке места (хотя это поведение не сложно изменить)
Достоинства:
   * можно использовать весь выделенный объём ресурсов для хранения кеша
   * можно отрывать "следилки" за переполнением диска
* если proxy_temp_path и proxy_store/proxy_cache_path остаются жить на одном диске - для вас ни чего не меняется
Патч для 0.7.44.

PS: хочется конечно получить "ручки" от автора.
Мне видится несколько:
   * возможность замапить spool в памяти заданного размера
* что-то на подобие моего патча, но с возможностью вкл/выкл - ввиде строки в конфиге * для мелких файлов (размер задавать через конфиг) делать mmap вместо read (хотя в случае с memory disk - это не принципиально)

--- src/core/ngx_file.c.orig    2009-03-25 17:38:40.000000000 +0300
+++ src/core/ngx_file.c 2009-03-25 17:41:42.000000000 +0300
@@ -554,6 +554,13 @@
         return NGX_OK;
     }

+    if (ngx_errno == EXDEV) {
+        //warn("Warn: 18: Cross-device link");
+        if (ngx_rename_file_mv(src->data, to->data) != NGX_FILE_ERROR) {
+            return NGX_OK;
+        }
+    }
+
     err = ngx_errno;

     if (err == NGX_ENOENT) {
@@ -575,6 +582,13 @@
             return NGX_OK;
         }

+        if (ngx_errno == EXDEV) {
+            //warn("Warn: 18: Cross-device link");
+            if (ngx_rename_file_mv(src->data, to->data) != NGX_FILE_ERROR) {
+                return NGX_OK;
+            }
+        }
+
         err = ngx_errno;
         goto failed;
     }
--- src/os/unix/ngx_files.c.orig        2009-03-06 16:01:21.000000000 +0300
+++ src/os/unix/ngx_files.c     2009-03-26 23:24:23.000000000 +0300
@@ -7,6 +7,63 @@
 #include <ngx_config.h>
 #include <ngx_core.h>

+int
+rename_mv(char *from, char *to)
+{
+    static char buf[MAXBSIZE];
+    struct stat st;
+    struct timeval time[2];
+    char *bufp;
+    ssize_t wcount;
+    size_t wresid;
+    off_t wtotal;
+    int from_fd, to_fd, rcount;
+
+    if (stat(from, &st) != 0) {
+        //warn("warn: get stat error");
+    } else {
+        from_fd = open(from, O_RDONLY);
+        if (from_fd == -1) {
+            //warn("warn: error from file");
+        } else {
+            to_fd = open(to, O_CREAT|O_EXCL|O_WRONLY, 0644);
+            if (to_fd == -1) {
+                //warn("warn: error to file");
+                close(from_fd);
+                return NGX_ERROR;
+            } else {
+                wtotal = 0;
+                while((rcount = read(from_fd, buf, MAXBSIZE)) > 0) {
+                    for (bufp = buf, wresid = rcount; ;
+                    bufp += wcount, wresid -= wcount) {
+                        wcount = write(to_fd, bufp, wresid);
+                        if (wcount <= 0)
+                            break;
+                        wtotal += wcount;
+                        if (wcount >= (ssize_t)wresid)
+                            break;
+                    }
+                    if (wcount != (ssize_t)wresid)
+                        break;
+                }
+            }
+            close(to_fd);
+        }
+        close(from_fd);
+
+        time[0].tv_sec = st.st_atime;
+        time[0].tv_usec = 0;
+        time[1].tv_sec = st.st_mtime;
+        time[1].tv_usec  = 0;
+        if (utimes(to, time) !=0) {
+            //warn("warn: set utimes error");
+        }
+    }
+    if (unlink(from) != 0) {
+        //warn("warn: error remove file");
+    }
+    return NGX_OK;
+}

 ssize_t
 ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)
--- src/os/unix/ngx_files.h.orig        2009-03-23 16:14:51.000000000 +0300
+++ src/os/unix/ngx_files.h     2009-03-25 18:18:48.000000000 +0300
@@ -119,7 +119,7 @@

 #define ngx_rename_file(o, n)    rename((const char *) o, (const char *) n)
 #define ngx_rename_file_n        "rename()"
-
+#define ngx_rename_file_mv(o, n) rename_mv((const char *) o, (const char *) n)

 #define ngx_change_file_access(n, a) chmod((const char *) n, a)
 #define ngx_change_file_access_n "chmod()"


 




Copyright © Lexa Software, 1996-2009.