Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: fastcgi keep-alive
ab при указании ключа -k шлет заголовок Connection: Keep-Alive, но при
этом версия HTTP/1.0. nginx если отдает статический файл, то не
закрывает соединение, при отдаче ответа с fastcgi соединение
закрывается. Происходит это скорее всего потому, что Content-Length
при отдаче статического файла известен, а при динамически создаваемом
ответе - нет, в случае HTTP/1.1 ответ идет чанками, в случае HTTP/1.0
чанки не поддерживаются, потому ответ идет без Content-Length с
закрытием соединения.
Попробовал httperf, довольно хорошая штука, поддерживает HTTP/1.1, но
при использовании большого количества соединений отжирает МНОГО CPU
(полностью одно ядро), потому о тестировании сервера говорить не
приходится.
Вкратце моя задача: правильно настроить связку nginx-fastcgi для
увеличения количества ответов в секунду (сейчас fastcgi-сервер - это
просто выдача "Hellow World" на клиента, за основу взято
http://www.fastcgi.com/devkit/examples/threaded.c), при этом клиентов
на сервер около 1000, т.е. 1000 соединений, каждый клиент постоянно
шлет запросы.
С настройкой fastcgi свои проблемы, во-первых, непонятно сколько
потоков должно быть у fastcgi-сервера при нескольких тыс. запросов в
секунду к nginx, сейчас пробую 200, но это пальцем в небо если не
сказать хуже. Во-вторых, странные результаты тестов:
1) при использовании unix domain sockets ab выдает картину:
$ ab -c 1000 -n 100000 http://localhost/
Concurrency Level: 1000
Time taken for tests: 19.685463 seconds
Complete requests: 100000
Failed requests: 95022
(Connect: 0, Length: 95022, Exceptions: 0)
Write errors: 0
Non-2xx responses: 755
Keep-Alive requests: 755
Total transferred: 33916538 bytes
HTML transferred: 21683403 bytes
Requests per second: 5079.89 [#/sec] (mean)
Time per request: 196.855 [ms] (mean)
Time per request: 0.197 [ms] (mean, across all concurrent requests)
Transfer rate: 1682.51 [Kbytes/sec] received
Странность что за Failed requests: 95022, при том что Non-2xx
responses: 755. При увеличении количества потоков картина немного
улучшается, но кардинально не изменяется.
При этом в логах постоянно появляется ошибка
[error] 15444#0: *1341999 connect() to unix:/tmp/a.out failed (11: )
while connecting to upstream, client: 127.0.0.1, server: localhost,
request: "GET / HTTP/1.0", upstream: "fastcgi://unix:/tmp/a.out:",
host: "localhost"
Я так понимаю это connection refused (надо увеличить backlog? где в
linux устанавливается его предел? по умолчанию предел 128 или 2048?).
Backlog как минимум 128. Вообще возможно чтобы nginx не бомбил сервер
соединениями, а имел какой-нибудь пул соединений?
2) при использовании TCP сокетов все замирает, при этом ни nginx ни
fcgi-сервер абсолютно не нагружены, но появляется следующая ошибка:
[error] 17291#0: *2159 upstream timed out (110: ) while connecting to
upstream, client: 127.0.0.1, server: localhost, request: "GET /
HTTP/1.0", upstream: "fastcgi://127.0.0.1:9000", host: "localhost"
Заканчивается все тем, что ab выдает:
apr_socket_recv: Connection timed out (110)
Итого, основной вопрос: как правильно настроить nginx и fastcgi-сервер
для максимальной производительности (количество ответов в секунду) при
условии большого количества клиентов (соединений, 1000) и большого
количества запросов по каждому соединению.
2009/4/12 Борис Долгов <boris@xxxxxxxxxxx>:
> ab -k :)
>
> 12 апреля 2009 г. 12:46 пользователь Alexander Dolgarev
> <a.dolgarev@xxxxxxxxx> написал:
>>
>> хм, действительно, ab посылает HTTP/1.0, не посоветуете другую тулзу
>> для проверки производительности?
>>
>> 2009/4/12 Maxim Dounin <mdounin@xxxxxxxxxx>:
>> > Hello!
>> >
>> > On Sun, Apr 12, 2009 at 01:49:09AM +0300, Alexander Dolgarev wrote:
>> >
>> >> возник вопрос относительно модуля ngx_http_fastcgi_module, вопрос
>> >> собственно простой: почему не работает keep-alive при использовании
>> >> FastCGI (nginx посылает Conncetion: close)?
>> >>
>> >> Например:
>> >> location / {
>> >> root html;
>> >> index index.html index.htm;
>> >>
>> >> fastcgi_pass unix:/tmp/a.out;
>> >>
>> >> fastcgi_param QUERY_STRING $query_string;
>> >> fastcgi_param REQUEST_METHOD $request_method;
>> >> fastcgi_param CONTENT_TYPE $content_type;
>> >> fastcgi_param CONTENT_LENGTH $content_length;
>> >> }
>> >>
>> >> Если закомментировать fastcgi_pass, то keep-alive работает.
>> >
>> > Потому что в HTTP/1.0 нет другого способа передать ответ без
>> > Content-Length. При использовании HTTP/1.1 - не отключается.
>> >
>> > Maxim Dounin
>> >
>> >
>
>
>
> --
> С уважением, Борис Долгов.
> icq 77556665
> e-mail boris@xxxxxxxxxxx
>
|