Estou usando o CouchDB para atender milhares de solicitações por segundo. Quando sob carga pesada, parece responder lentamente, então comecei a fazer testes com o banco apache. O sofá pode responder a 50k solicitações, 1k simultâneas. Em seguida, aumentei a simultaneidade para 2k, mas o benchmark está sempre quebrado em torno de 8k solicitações com a mensagem:
apr_socket_recv: Connection reset by peer (104)
No log do CouchDb, posso encontrar esses dois erros:
[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}}}}}
Infelizmente, não entendo o que eles significam.
O que eu fiz até agora tentando incrementar recursos para o CouchDB:
- Gerou o limite de descritores de arquivo para 250k, tanto hard quanto soft
- Gerou "Limites de recursos do sistema" conforme descrito aqui :
-
export ERL_MAX_PORTS=8192
< - embora isso seja obsoleto, acho
-
export ERL_MAX_ETS_TABLES=6000
-
export ERL_FLAGS="+Q 350000 +P 750000 +A 100"
- Gerou quase todos os valores na configuração do CouchDB
- Eu também li algo sobre portas sendo em TIME_WAIT, mas depois de um benchmark parece ser apenas 280 portas nesse estado
E nada funcionou.
Para esses testes, estou usando uma VM com:
-
Ubuntu 14.04.2
-
CouchDB 1.5.0
-
Erlang R16B03 (erts-5.10.4)