CouchDB / MochiWeb: негативный эффект постоянных соединений - PullRequest
7 голосов
/ 24 января 2012

У меня довольно простая настройка CouchDB на моей коробке Mint / Debian. Мое веб-приложение на Java испытывало довольно длительные задержки при запросе CouchDB, поэтому я начал искать причины.

РЕДАКТИРОВАТЬ : шаблон запроса представляет собой множество небольших запросов и небольших объектов JSON (например, 300 байтов вверх / 1 Кбайт вниз).

Дампы Wireshark довольно хороши, показывая в основном 3-5 миллисекунд обработки запроса-ответа. Выборка кадра JVM показала мне, что код сокета (клиентские запросы к Couch) несколько занят, но ничего примечательного. Затем я попытался профилировать то же самое с помощью ApacheBench и упс: в настоящее время я вижу, что keep-alive обеспечивает постоянную дополнительную задержку в 39 мс по сравнению с непостоянными настройками.

Кто-нибудь знает, как это объяснить? Может быть, постоянные соединения увеличивают окно перегрузки на уровне TCP, а затем отключаются из-за TCP_WAIT и небольших размеров запросов / ответов, или что-то в этом роде? Должна ли эта опция (TCP_WAIT) быть когда-либо включена для петлевых TCP-соединений?

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

работает с поддержкой активности, в среднем 40 миллис на запрос

w@mint ~ $ 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)

Нет keepalive и вуаля - в основном 1 мс на запрос.

w@mint ~ $ 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)

Хорошо, теперь с включенным keep-alive, но также с просьбой закрыть соединение через заголовок http. Также 1 мс на запрос или около того.

w@mint ~ $ 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)

1 Ответ

8 голосов
/ 25 января 2012

Да, это связано с параметрами настройки сокета tcp.Эта конфигурация теперь выровняла все три случая на 1 мс на запрос.

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

См. Это для деталей: http://wiki.apache.org/couchdb/Performance#Network

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...