Re: Re[6]: Посоветуйте оптимальные настройки

Igor Sysoev is at rambler-co.ru
Thu Apr 13 15:26:41 MSD 2006


On Thu, 13 Apr 2006, ForJest wrote:

> Ну тут я уже не знаю какой выбрать :-). Со спаньём в 0 секунд вроде
> выглядит неплохо довольно, к тому же отвечает старому поведению по
> ограничению скорости.
> Ведь если там было маленькое значение sent и большое значение
> limit_rate то я так понимаю как раз получался 0 msec для таймера.

Я решил оставить старый алгоритм вычисления таймера, но вычислять
ограничение для отправки с учётом уже отосланного. Патч прилагается.
limit_rate 4K, 32K, 1M, 2M вполне работают.


Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
--- src/http/ngx_http_write_filter_module.c	Wed Jan 11 15:37:47 2006
+++ src/http/ngx_http_write_filter_module.c	Thu Apr 13 15:17:03 2006
@@ -47,7 +47,7 @@
 ngx_int_t
 ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)
 {
-    off_t                      size, sent;
+    off_t                      size, sent, to_send;
     ngx_uint_t                 last, flush;
     ngx_chain_t               *cl, *ln, **ll, *chain;
     ngx_connection_t          *c;
@@ -209,23 +209,27 @@
         return NGX_ERROR;
     }
 
+    to_send = r->limit_rate * (ngx_time() - r->start_time + 1) - c->sent;
     sent = c->sent;
 
-    chain = c->send_chain(c, r->out, r->limit_rate);
+    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
+                   "http write filter to send %O", to_send);
+
+    chain = c->send_chain(c, r->out, to_send);
 
     ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
                    "http write filter %p", chain);
 
-    if (r->limit_rate) {
+    if (chain == NGX_CHAIN_ERROR) {
+        c->error = 1;
+        return NGX_ERROR;
+    }
+
+    if (to_send) {
         sent = c->sent - sent;
         c->write->delayed = 1;
         ngx_add_timer(r->connection->write,
                       (ngx_msec_t) (sent * 1000 / r->limit_rate));
-    }
-
-    if (chain == NGX_CHAIN_ERROR) {
-        c->error = 1;
-        return NGX_ERROR;
     }
 
     for (cl = r->out; cl && cl != chain; /* void */) {


More information about the nginx-ru mailing list