Игорь, посмотрите, почему зависает, если указать 2000 вместо 1000 при
3000 limit rate. Я полагаю что это поможет устранить баг с зависанием
некоторых сессий наших клиентов.
Потому что послано меньше, чем нужно: c->sent <= to_send
Есть два варианта решения:
1) первый всё-таки добавлять нулевой таймер и тогда это соединение
будет обработано при следующем kevent()/epoll/etc
2) или послать ещё, не отходя от кассы:
------------
for ( ;; ) {
chain = c->send_chain(c, r->out, r->limit_rate);
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
"http write filter %p", chain);
if (chain == NGX_CHAIN_ERROR) {
c->error = 1;
return NGX_ERROR;
}
for (cl = r->out; cl && cl != chain; /* void */) {
ln = cl;
cl = cl->next;
ngx_free_chain(r->pool, ln);
}
r->out = chain;
if (r->limit_rate) {
to_send = r->limit_rate * (ngx_time() - r->start_time);
if (c->sent <= to_send) {
continue;
}
c->write->delayed = 1;
ngx_add_timer(r->connection->write,
(ngx_msec_t) ((c->sent - to_send) * 1000 / r->limit_rate));
}
break;
}
------------
Я пока думаю, какой вариант выбрать.
Игорь Сысоев
http://sysoev.ru