ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
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
>


 




Copyright © Lexa Software, 1996-2009.