ПРОЕКТЫ 


  АРХИВ 


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: Re[6]: Посоветуйте оптимальные настройки



On Thu, 13 Apr 2006, Igor Sysoev wrote:

On Thu, 13 Apr 2006, ForJest wrote:

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

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

Предыдущий патч неверный, его нужно откатить и накатить прилагаемый.


Игорь Сысоев
http://sysoev.ru
--- 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 17:06:01 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,32 @@
         return NGX_ERROR;
     }
 
+    to_send = r->limit_rate * (ngx_time() - r->start_time + 1) - c->sent;
+
+    if (to_send < 0) {
+        to_send = 0;
+    }
+
     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 */) {


 




Copyright © Lexa Software, 1996-2009.