【问题标题】:CouchDB / MochiWeb : negative effect of persistent connectionsCouchDB / MochiWeb:持久连接的负面影响
【发布时间】:2023-03-28 02:20:01
【问题描述】:

我在我的 Mint/Debian 盒子上安装了非常简单的 CouchDB。我的 Java webapp 在查询 CouchDB 时遇到了相当长的延迟,所以我开始寻找原因。

编辑:查询模式是大量的小查询和小的 JSON 对象(例如 300 字节向上/1Kbyte 向下)。

Wireshark 转储非常好,主要显示 3-5 毫秒的请求-响应周转时间。 JVM 帧采样向我展示了套接字代码(对 Couch 的客户端查询)有些忙,但没有什么了不起的。然后我尝试使用 ApacheBench 和 oops 进行分析:我目前看到 keep-alive 在非持久设置上引入了稳定的额外 39 毫秒延迟。

有人知道怎么解释吗?也许持久连接会增加 TCP 层的拥塞窗口,然后由于 TCP_WAIT 和较小的请求/响应大小或类似的东西而空闲? 是否应该为环回 tcp 连接打开此选项 (TCP_WAIT)?

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)

【问题讨论】:

    标签: http tcp profiling couchdb congestion-control


    【解决方案1】:

    是的,这与 tcp 套接字设置选项有关。现在,此配置将所有三种情况都稳定在每个请求 1 毫秒。

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

    查看详情: http://wiki.apache.org/couchdb/Performance#Network

    【讨论】:

    • 感谢您的跟进。我立刻想到了nodelay,但我不确定这是否正确或如何确认。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2017-07-12
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多