2012-01-24 20 views
7

Mam dość prostą konfigurację CouchDB na moim polu Mint/Debian. Moja webaprawa Java cierpiała na dość długie opóźnienia w wysyłaniu zapytań do CouchDB, więc zacząłem szukać przyczyn.CouchDB/MochiWeb: negatywny efekt trwałych połączeń

EDIT: Wzór zapytania jest wiele małych zapytań i małych obiektów JSON (jak 300 bajtów w górę/w dół) 1Kbyte.

Wysypiska Wireshark są całkiem niezłe, pokazując najczęściej 3-5-milisekundową reakcję na żądanie. Próbkowanie ramek JVM pokazało mi, że kod gniazda (zapytania po stronie klienta do kanapy) jest nieco zajęty, ale nic nadzwyczajnego. Potem próbowałem profilować to samo z ApacheBench i oops: obecnie widzę, że keep-alive wprowadza stałe dodatkowe 39 ms opóźnienia w stosunku do nietrwałych konfiguracji.

Czy ktoś wie, jak to wyjaśnić? Może trwałe połączenia zwiększają okno przeciążenia na warstwie TCP, a następnie są nieaktywne ze względu na TCP_WAIT i małe rozmiary żądań/odpowiedzi, czy coś w tym stylu? Czy ta opcja (TCP_WAIT) powinna być zawsze włączona dla połączeń typu loopback tcp?

[email protected] ~ $ uname -a 
Linux mint 2.6.39-2-486 #1 Tue Jul 5 02:52:23 UTC 2011 i686 GNU/Linux 
[email protected] ~ $ curl http://127.0.0.1:5984/ 
{"couchdb":"Welcome","version":"1.1.1"} 

działa z trzymać żyje przeciętnie 40 millis na życzenie

[email protected] ~ $ ab -n 1024 -c 1 -k http://127.0.0.1:5984/ 
>>>snip 
Server Software:  CouchDB/1.1.1 
Server Hostname:  127.0.0.1 
Server Port:   5984 

Document Path:  /
Document Length:  40 bytes 

Concurrency Level:  1 
Time taken for tests: 41.001 seconds 
Complete requests:  1024 
Failed requests:  0 
Write errors:   0 
Keep-Alive requests: 1024 
Total transferred:  261120 bytes 
HTML transferred:  40960 bytes 
Requests per second: 24.98 [#/sec] (mean) 
Time per request:  40.040 [ms] (mean) 
Time per request:  40.040 [ms] (mean, across all concurrent requests) 
Transfer rate:   6.22 [Kbytes/sec] received 

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  0 0 0.0  0  0 
Processing:  1 40 1.4  40  48 
Waiting:  0 1 0.7  1  8 
Total:   1 40 1.3  40  48 

Percentage of the requests served within a certain time (ms) 
    50%  40 
>>>snip 
    95%  40 
    98%  41 
    99%  44 
100%  48 (longest request) 

Nie keepalive i voila - 1 ms za zamówienie, głównie.

[email protected] ~ $ ab -n 1024 -c 1 http://127.0.0.1:5984/ 
>>>snip 
Time taken for tests: 1.080 seconds 
Complete requests:  1024 
Failed requests:  0 
Write errors:   0 
Total transferred:  236544 bytes 
HTML transferred:  40960 bytes 
Requests per second: 948.15 [#/sec] (mean) 
Time per request:  1.055 [ms] (mean) 
Time per request:  1.055 [ms] (mean, across all concurrent requests) 
Transfer rate:   213.89 [Kbytes/sec] received 

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  0 0 0.0  0  0 
Processing:  1 1 1.0  1  11 
Waiting:  1 1 0.9  1  11 
Total:   1 1 1.0  1  11 

Percentage of the requests served within a certain time (ms) 
    50%  1 
>>>snip 
    80%  1 
    90%  2 
    95%  3 
    98%  5 
    99%  6 
100%  11 (longest request) 

OK, teraz z włączonym trybem, ale także z prośbą o zamknięcie połączenia za pośrednictwem nagłówka http. Również 1 ms na każde żądanie.

[email protected] ~ $ ab -n 1024 -c 1 -k -H 'Connection: close' http://127.0.0.1:5984/ 
>>>snip 
Time taken for tests: 1.131 seconds 
Complete requests:  1024 
Failed requests:  0 
Write errors:   0 
Keep-Alive requests: 0 
Total transferred:  236544 bytes 
HTML transferred:  40960 bytes 
Requests per second: 905.03 [#/sec] (mean) 
Time per request:  1.105 [ms] (mean) 
Time per request:  1.105 [ms] (mean, across all concurrent requests) 
Transfer rate:   204.16 [Kbytes/sec] received 

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  0 0 0.0  0  0 
Processing:  1 1 1.2  1  14 
Waiting:  0 1 1.1  1  13 
Total:   1 1 1.2  1  14 

Percentage of the requests served within a certain time (ms) 
    50%  1 
>>>snip 
    80%  1 
    90%  2 
    95%  3 
    98%  6 
    99%  7 
100%  14 (longest request) 

Odpowiedz

8

Tak, jest to związane z opcjami konfiguracji gniazda tcp. Ta konfiguracja wyrównała wszystkie trzy przypadki z szybkością 1ms na żądanie.

[httpd] 
socket_options = [{nodelay, true}] 

Zobacz to na szczegóły: http://wiki.apache.org/couchdb/Performance#Network

+1

Dzięki dla kontynuacji. Natychmiast pomyślałem o 'nodelay', ale nie byłem pewien, czy to było właściwe, czy jak to potwierdzić. – JasonSmith