Connection

增加 CouchDB 並發連接

  • December 10, 2015

我正在使用 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 個埠處於該狀態

沒有任何效果。

對於這些測試,我使用的 VM 具有:

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

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

我取消了最後一行的註釋,我重新啟動了 VM,CouchDB 現在支持任意數量的並發請求。它一直忽略限製配置。

我還了解到/意識到實際上需要大量文件描述符的是基準測試本身,而不是要進行基準測試的服務。也許我應該從不同的 VM 進行基準測試。

引用自:https://serverfault.com/questions/735760