Использование $r-rflush в perl'овых скриптах под nginx
(http_perl_module) - дорогая по времени операция.
Скорость отдачи ответа вот так:
$r->header_out("Count", $count);
$r->send_http_header("text/html");
return OK;
или вот так:
$r->send_http_header("text/html");
$r->print($count);
return OK;
составляет 0.01 секунду.
А вот так:
$r->send_http_header("text/html");
$r->print($count);
$r->rflush;
return OK;
- 0.1 секунда.
(я не привожу конфигураций аппаратного и программного обеспечения,
потому что результат относителен, но в моих условиях - до
чрезвычайности стабилен).
Игорь, это так и должно быть или тебе открылось поле для оптимизаций? :)
В 0.3.38 ngx_http_perl_module будет пооптимизирован, но в данном случае
дело не в этом.
$r->send_http_header() в ядро ничего не передаёт (размер заголовка мал).
Небольшой $r->print() тоже ничего не передаёт. Все эти данные просто
накапливаются, пока не превысят postpone_output (1460) или запрос не будет
полностью отработан.
А вот $r->rflush - передаёт накопившиеся данные в ядро. Мораль - последний
$r->rflush не нужен. Промежуточные - в зависимости от ситуации.
Игорь Сысоев
http://sysoev.ru