Я использую 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:
export ERL_MAX_PORTS=8192
<- хотя это устарело, я думаюexport ERL_MAX_ETS_TABLES=6000
export ERL_FLAGS="+Q 350000 +P 750000 +A 100"
И ничего не получилось.
Для этих тестов я использую виртуальную машину с:
Ubuntu 14.04.2
CouchDB 1.5.0
Erlang R16B03 (erts-5.10.4)
Kxepal CouchDb связал меня с это письмо где сказано:
Одна из распространенных проблем с limits.conf заключается в том, что couchdb su для пользователя couchdb, а /etc/pam.d/su в debian / ubuntu по умолчанию не соблюдая 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 поддерживает столько одновременных запросов, сколько я хотел. Он все время игнорировал конфигурацию ограничений.
Я также узнал / понял, что на самом деле требуется много файловых дескрипторов, это сам тест, а не сервис, который нужно тестировать. Может быть, мне стоит провести тест на другой виртуальной машине.