Увеличение числа одновременных соединений CouchDB

Я использую CouchDB для обслуживания тысяч запросов в секунду. Когда он находится под большой нагрузкой, кажется, что он реагирует медленно, поэтому я начал запускать тесты на Apache Bench Couch может отвечать на запросы по 50 тыс., По 1 тыс. Одновременно. Затем я повысил параллелизм до 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:

  • Увеличен лимит файловых дескрипторов до 250 Кб, как жестких, так и программных
  • Поднял "Системные ограничения ресурсов", как описано здесь:
    • 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 ответ

Решение

Kxepal из CouchDb связал меня с этим письмом, где говорится:

Одна распространенная ошибка с limit.conf заключается в том, что couchdb su для пользователя couchdb и /etc/pam.d/su в debian/ubuntu по умолчанию не соблюдают limit.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 поддерживает столько параллельных запросов, сколько я хотел. Он игнорировал конфигурацию пределов все время.

Я также узнал / понял, что на самом деле требуется много файловых дескрипторов, это сам тест, а не сервис, который нужно тестировать. Может быть, мне стоит сравнить с другой виртуальной машиной.

Другие вопросы по тегам