<div dir="ltr">Hi!<div><br></div><div>What is your current problem with lots of connections?</div><div><br></div><div>Just in case, here are problems I've hit:</div><div>  - (emfile) max ports beam option: erl +Q 2000000 (check with 'erlang:system_info(port_limit)')</div><div>  - (emfile) ulimit (OS/shell feature): check 'ulimit -n'. Make it large enough (use google). Check 'max_fds' field in 'erlang:system_info(check_io)'</div><div>  - (eaddrnotavail) local TCP ports exausted: on Linux, check 'sysctl net.ipv4.ip_local_port_range'. Increase it. Use '{reuseaddr, true}' option and manually distribute local ports (one local port is OK to use with different remote {Addr, Port}s).</div><div><br></div><div>More info on a problem with local TCP ports exausted:</div><div>  - Try<span style="color:rgb(34,36,38);font-family:Arial,'Helvetica Neue',Helvetica,sans-serif;font-size:15px;line-height:19.5px"> </span>TCP_TW_REUSE option <a href="http://stackoverflow.com/questions/6426253/tcp-tw-reuse-vs-tcp-tw-recycle-which-to-use-or-both">http://stackoverflow.com/questions/6426253/tcp-tw-reuse-vs-tcp-tw-recycle-which-to-use-or-both</a></div><div>  - Use multiple addresses on your network interface (it's easy with IPv6). Use round-robin or random local address for every new connection.</div><div><br></div><div><br></div><div>And if you use HTTP(S) to connect to a limited number of servers, it's better to use keep-alive connections. With them you don't spend time on TCP handshake and use much fewer local ports.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jan 18, 2016 at 1:33 AM, scdelta1249 <span dir="ltr"><<a href="mailto:scdelta1249@gmail.com" target="_blank">scdelta1249@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span style="font-size:13px">I have an application where I need to make 10s of millions of short-lived plain TCP (gen_tcp) or HTTP/HTTPS (httpc/gun/hackney) requests to different servers. The parameters for the requests are stored in a database. My plan is for a controlling gen_server on each node in the cluster to:</span><div><br><div style="font-size:13px">* grab a group of requests from the database </div><div style="font-size:13px">* spawn a process for each request </div><div style="font-size:13px">* the spawned process connects, makes the request, processes the response and shuts down the connection</div><div style="font-size:13px"><div><br></div><div>What is the best strategy to maximize the number of concurrent clients? My current plan is to maintain a list of pending requests in the controlling process (gen_server). As processes complete, they remove themselves from the list. If they error out on initialization I'd implement some sort of back-off timer, pushing the unexecuted requests back into the database if they couldn't execute after a predefined time limit.</div></div><div style="font-size:13px"><br></div><div style="font-size:13px">Is there a better way to maximize the number of TCP client connections per node in Erlang?</div><div style="font-size:13px"><br></div><div style="font-size:13px">Thanks.</div><div><br></div></div></div>
<br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div><font face="'courier new', monospace">Danil Zagoskin | <a href="mailto:z@gosk.in" target="_blank">z@gosk.in</a></font></div></div></div>
</div>