Несколько непонятностей по nginx

Igor Sysoev is at rambler-co.ru
Tue Apr 24 02:39:59 MSD 2007


On Tue, Apr 24, 2007 at 02:33:12AM +0400, Igor Sysoev wrote:

> On Tue, Apr 24, 2007 at 02:24:49AM +0400, Igor Sysoev wrote:
> 
> > On Mon, Apr 23, 2007 at 08:16:12PM +0300, Александр Ворона wrote:
> > 
> > > Igor Sysoev пишет:
> > > >On Mon, Apr 23, 2007 at 07:15:17PM +0300, Александр Ворона wrote:
> > > >
> > > >>Igor Sysoev пишет:
> > > >>
> > > >>>А если поставить "limit_rate  1M" ? В этом случае nginx сам больше 1M
> > > >>>за раз передавать не будет..
> > > >>но он же и будет лимитировать скорость в 1М :)
> > > >>А проблема имеет место только в случае когда отдача по сети быстрее чем 
> > > >>диск - nonblock не даёт ничего тогда
> > > >
> > > >Ну, можно поставить 10M.
> > > 
> > > Чистое ядро 64bit, чистый nginx, limit_rate 10М, отдача 4G файла с диска 
> > > по 1G линку.
> > > Наблюдаются замирания закачки после тех моментов, когда sendfile выслал 
> > > ровно столько сколько его запросили.
> > > также проблему длинных sendfile не решило :)
> > > sendfile(11, 14, [1647065810], 187942190) = 187942190
> > > epoll_wait(13, {}, 512, 17924)          = 0
> > > sendfile(11, 14, [1835008000], 220200960) = 220200960
> > > epoll_wait(13, {}, 512, 21001)          = 0
> > > sendfile(11, 14, [2055208960], 251658240) = 251658240
> > > 
> > > Отдача естественно рывками идёт. Средняя скорость в итоге 9.41М
> > 
> > Можно попробовать прилагаемый патч. Он ограничивает размер передаваемых
> > данных за один раз 128K без ограничения скорости.
> > 
> > Настраивается в src/os/unix/ngx_linux_init.c
> > 
> > off_t ngx_linux_sendfile_limit = 128 * 1024;

0.5.18.2 откатить, 0.5.18.3 накатить.


-- 
Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
Index: src/http/ngx_http_write_filter_module.c
===================================================================
--- src/http/ngx_http_write_filter_module.c	(revision 502)
+++ src/http/ngx_http_write_filter_module.c	(working copy)
@@ -47,7 +47,7 @@
 ngx_int_t
 ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)
 {
-    off_t                      size, sent, to_send;
+    off_t                      size, sent, limit;
     ngx_uint_t                 last, flush;
     ngx_chain_t               *cl, *ln, **ll, *chain;
     ngx_connection_t          *c;
@@ -210,28 +210,35 @@
     }
 
     if (r->limit_rate) {
-        to_send = r->limit_rate * (ngx_time() - r->start_sec + 1) - c->sent;
+        limit = r->limit_rate * (ngx_time() - r->start_sec + 1) - c->sent;
 
-        if (to_send <= 0) {
+        if (limit <= 0) {
             c->write->delayed = 1;
             ngx_add_timer(c->write,
-                          (ngx_msec_t) (- to_send * 1000 / r->limit_rate + 1));
+                          (ngx_msec_t) (- limit * 1000 / r->limit_rate + 1));
 
             c->buffered |= NGX_HTTP_WRITE_BUFFERED;
 
             return NGX_AGAIN;
         }
 
+#if (NGX_LINUX)
+
+    } else if (ngx_linux_sendfile_limit) {
+        limit = ngx_linux_sendfile_limit;
+
+#endif
+
     } else {
-        to_send = 0;
+        limit = 0;
     }
 
     sent = c->sent;
 
     ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
-                   "http write filter to send %O", to_send);
+                   "http write filter to send %O", limit);
 
-    chain = c->send_chain(c, r->out, to_send);
+    chain = c->send_chain(c, r->out, limit);
 
     ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
                    "http write filter %p", chain);
@@ -241,12 +248,21 @@
         return NGX_ERROR;
     }
 
-    if (to_send) {
+    if (r->limit_rate) {
         sent = c->sent - sent;
         c->write->delayed = 1;
         ngx_add_timer(c->write, (ngx_msec_t) (sent * 1000 / r->limit_rate + 1));
     }
 
+#if (NGX_LINUX)
+
+      else if (c->write->ready && ngx_linux_sendfile_limit) {
+        c->write->delayed = 1;
+        ngx_add_timer(c->write, 1);
+    }
+
+#endif
+
     for (cl = r->out; cl && cl != chain; /* void */) {
         ln = cl;
         cl = cl->next;
Index: src/os/unix/ngx_linux_init.c
===================================================================
--- src/os/unix/ngx_linux_init.c	(revision 502)
+++ src/os/unix/ngx_linux_init.c	(working copy)
@@ -17,6 +17,7 @@
 
 int   ngx_linux_rtsig_max;
 
+off_t ngx_linux_sendfile_limit = 128 * 1024;
 
 static ngx_os_io_t ngx_linux_io = {
     ngx_unix_recv,
Index: src/os/unix/ngx_linux.h
===================================================================
--- src/os/unix/ngx_linux.h	(revision 502)
+++ src/os/unix/ngx_linux.h	(working copy)
@@ -13,5 +13,7 @@
 
 extern int ngx_linux_rtsig_max;
 
+extern off_t ngx_linux_sendfile_limit;
 
+
 #endif /* _NGX_LINUX_H_INCLUDED_ */


More information about the nginx-ru mailing list