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

ForJest forjest at gmail.com
Thu Apr 13 09:08:06 MSD 2006


On 4/12/06, AleXXX V. NovikoFF <alexxx at alexxx.ru> wrote:
>
> > >>
> > >> X-Accel-Limit-Rate задаёт скорость в байтах в секунду.
> > >> "X-Accel-Limit-Rate: 10" - это 10 байт в секунду.
> > >
> > > все, кажись разобрался, пришлось скорость увеличить в 2 раза, тогда
> > > стало более менее побыстрее.... опять же до предела не доходит...
> >
> > А какая скорость используется ?
> >
>
> было 16 кб сек (16384)
>
> --
> AleXXX V. NovikoFF <alexxx at alexxx.ru>
есть предложение попробовать нижеследующий патч.
Правда я не знаю как он будет работать с keep-alive соединениями - я
ещё недостаточно хорошо разобрался в архитектуре. По поводу этого
может сказать Игорь.

Смысл этого патча в следующем:
- Текущий алгоритм ограничения скорости учитывает скорость лишь между
2-мя отсылками данных. А на деле времени между 2-мя отсылками данных
проходить больше чем 0 миллисекунд. Из-за этого, как мне кажется и
могут возникать казусы со скоростью
- Этот алгоритм учитывает среднюю скорость отсылки в течении всего
времени ответа, и основан именно на средней скорости. По-моему именно
среднюю скорость и пытаются ограничить люди, когда выставляют
limit_rate. По крайней мере я раньше использовал в своих PHP скриптах
именно такой алгоритм и он неплохо себя зарекомедовал.
- Достоинство: скорость тем точнее ограничена, чем больше прошло
времени, в отличии от алгоритма Игоря - чем меньше значения скорости -
тем точнее она расчитывается.

Предлагаю попробовать и рассказать о результатах.

--- src/http/ngx_http_write_filter_module.c:1.1 Thu Apr 13 02:45:52 2006
+++ src/http/ngx_http_write_filter_module.c     Thu Apr 13 07:56:16 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, need_to_sent;
     ngx_uint_t                 last, flush;
     ngx_chain_t               *cl, *ln, **ll, *chain;
     ngx_connection_t          *c;
@@ -217,10 +217,15 @@
                    "http write filter %p", chain);

     if (r->limit_rate) {
-        sent = c->sent - sent;
+        need_to_sent = r->limit_rate*(ngx_time() - r->start_time);
         c->write->delayed = 1;
-        ngx_add_timer(r->connection->write,
-                      (ngx_msec_t) (sent * 1000 / r->limit_rate));
+        if (c->sent > need_to_sent){
+            ngx_add_timer(r->connection->write,
+                      (ngx_msec_t) ((c->sent - need_to_sent) * 1000 /
r->limit_rate));
+        }
+        else{
+            ngx_add_timer(r->connection->write, 0);
+        }
     }

     if (chain == NGX_CHAIN_ERROR) {


More information about the nginx-ru mailing list