Назад | Перейти на главную страницу

Как избавиться от буферизации TCP или lighttpd 4KB на выходе CGI?

У меня есть стандартная установка lighttpd на AMI Amazon Linux, работающая на EC2. Единственное, что я внес в конфигурацию, - это включить поддержку CGI.

Затем существует специальный инструмент CGI (написанный на C), помещенный в / cgi-bin /, который вызывается из внешнего мира и выводит сжатый с помощью gzip JSON. Этот инструмент выводит данные регулярно, скажем, каждые 10-20 секунд, но каждый раз только несколько сотен байтов.

Проблема в том, что где-то между CGI stdout и тем, что lighttpd возвращает клиенту, вещи буферизуются и прибывают примерно 4 КБ за раз. К сожалению, эта система отстает от балансировщика нагрузки Amazon Elastic Load Balancer, который не допускает простоя подключений более 60 секунд. Из-за буферизации это как-будто сервер ничего не возвращает в первые 60 секунд, поэтому соединение прерывается, а клиент ничего не получает.

Итак, как мне отследить этот параметр буферизации и значительно уменьшить его? Я попытался изменить некоторые параметры конфигурации lighttpd и даже изменить "net.ipv4.tcp_wmem" в ядре, но, похоже, ничего не работает.

Когда я писал cgi на Perl, это был параметр, который мне приходилось включать в сценарий perl. В perl это было $|=1. Вероятно, вам нужно сделать эквивалент в C. Возможно, вы захотите спросить Переполнение стека вместо.

strace процесс lighttpd с включенным следующим:

strace -f -tt -p PIDOFLIGHTTPD

Вы получите вывод, который показывает каждый системный вызов, сделанный lighttpd и CGI. Временная метка в микросекундах должна указывать, когда CGI возвращает данные, а когда lighttpd записывает их обратно клиенту. Это также ответит, если проблема связана с восходящим потоком (если вы видите, что lighttpd отправляет данные почти мгновенно и т. Д.).

Lighttpd по умолчанию буферизует вывод. Тебе нужно server.stream-response-body = 1 как обсуждалось Вот. Официальные документы https://redmine.lighttpd.net/projects/lighttpd/wiki/Server_stream-response-bodyDetails