增加 CouchDB 并发连接数

增加 CouchDB 并发连接数

我使用 CouchDB 每秒处理数千个请求。在高负载下,它似乎响应缓慢,因此我开始使用 apache bench 进行测试。Couch 可以响应 50k 个请求,1k 个并发。然后我将并发性提高到 2k,但基准测试总是在 8k 个请求左右时中断,并显示以下消息:

apr_socket_recv: Connection reset by peer (104)

在 CouchDb 日志中我发现这两个错误:

[Sat, 21 Nov 2015 17:16:07 GMT] [error] [<0.8073.2>] {error_report,<0.31.0>,
                      {<0.8073.2>,crash_report,
                       [[{initial_call,
                          {mochiweb_acceptor,init,
                           ['Argument__1','Argument__2','Argument__3']}},
                         {pid,<0.8073.2>},
                         {registered_name,[]},
                         {error_info,
                          {exit,
                           {error,accept_failed},
                           [{mochiweb_acceptor,init,3,
                             [{file,"mochiweb_acceptor.erl"},{line,34}]},
                            {proc_lib,init_p_do_apply,3,
                             [{file,"proc_lib.erl"},{line,239}]}]}},
                         {ancestors,
                          [couch_httpd,couch_secondary_services,
                           couch_server_sup,<0.32.0>]},
                         {messages,[]},
                         {links,[<0.105.0>]},
                         {dictionary,[]},
                         {trap_exit,false},
                         {status,running},
                         {heap_size,233},
                         {stack_size,27},
                         {reductions,330}],
                        []]}}

// and this:

[Sat, 21 Nov 2015 17:11:54 GMT] [error] [<0.105.0>] {error_report,<0.31.0>,
                        {<0.105.0>,std_error,
                         {mochiweb_socket_server,297,
                             {acceptor_error,{error,accept_failed}}}}}

遗憾的是,我不明白它们的意思。

到目前为止,我已尝试增加 CouchDB 的资源:

  • 将文件描述符限制提高到 250k,包括硬文件和软文件
  • 如上所述提高“系统资源限制”这里
    • export ERL_MAX_PORTS=8192<- 虽然我认为这已经过时了
    • export ERL_MAX_ETS_TABLES=6000
    • export ERL_FLAGS="+Q 350000 +P 750000 +A 100"
  • 提高了 CouchDB 配置中的几乎所有值
  • 我也读过一些关于端口处于 TIME_WAIT 状态的信息,但经过基准测试,似乎只有 280 个端口处于该状态

但什么也没起作用。

对于这些测试我使用了具有以下配置的虚拟机:

  • Ubuntu 14.04.2
  • CouchDB 1.5.0
  • Erlang R16B03 (erts-5.10.4)

答案1

CouchDb 的 Kxepal 链接我到这封电子邮件其中写道:

limits.conf 的一个常见问题是,couchdb su 为 couchdb 用户,而 debian/ubuntu 中的 /etc/pam.d/su 默认为不是关于 limits.conf,您需要启用它。

于是我照做了vim /etc/pam.d/su,结果发现:

# Sets up user limits, please uncomment and read /etc/security/limits.conf
# to enable this functionality.
# (Replaces the use of /etc/limits in old login)
#session    required   pam_limits.so

我取消注释了最后一行,重启了虚拟机,CouchDB 现在支持我想要的任意数量的并发请求。它一直忽略限制配置。

我还了解到/意识到,实际上需要大量文件描述符的是基准测试本身,而不是要进行基准测试的服务。也许我应该从不同的虚拟机进行基准测试。

相关内容