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