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()"
|