<div dir="ltr">Dear all,<div>I've built a benchmarking tool and I experience an error when connecting more than 1024 clients to a SSL server. The call to <font face="monospace, monospace">ssl:connect/3 </font>returns a <font face="monospace, monospace">{error,emfile}</font> instead of a Socket.</div><div><br></div><div><div>According to inet POSIX Error Codes [1], <font face="monospace, monospace">emfile</font> corresponds to too many open files.</div></div><div>I'm running from a UBUNTU 14.04 LTS box.</div><div><br></div><div>However, I've set my <font face="monospace, monospace">/etc/security/limits.conf</font> with:</div><div><br></div><div><div><font face="monospace, monospace">*   soft    nofile<span style="white-space:pre">      </span>999999</font></div><div><font face="monospace, monospace">*   hard    nofile      999999</font></div></div><div><br></div><div>and rebooted the machine. I can see it applied:</div><div><br></div><div><div><font face="monospace, monospace">$ ulimit -a</font></div><div><font face="monospace, monospace">core file size          (blocks, -c) 0</font></div><div><font face="monospace, monospace">data seg size           (kbytes, -d) unlimited</font></div><div><font face="monospace, monospace">scheduling priority             (-e) 0</font></div><div><font face="monospace, monospace">file size               (blocks, -f) unlimited</font></div><div><font face="monospace, monospace">pending signals                 (-i) 241197</font></div><div><font face="monospace, monospace">max locked memory       (kbytes, -l) 64</font></div><div><font face="monospace, monospace">max memory size         (kbytes, -m) unlimited</font></div><div><font face="monospace, monospace">open files                      (-n) 999999</font></div><div><font face="monospace, monospace">pipe size            (512 bytes, -p) 8</font></div><div><font face="monospace, monospace">POSIX message queues     (bytes, -q) 819200</font></div><div><font face="monospace, monospace">real-time priority              (-r) 0</font></div><div><font face="monospace, monospace">stack size              (kbytes, -s) 8192</font></div><div><font face="monospace, monospace">cpu time               (seconds, -t) unlimited</font></div><div><font face="monospace, monospace">max user processes              (-u) 241197</font></div><div><font face="monospace, monospace">virtual memory          (kbytes, -v) unlimited</font></div><div><font face="monospace, monospace">file locks                      (-x) unlimited</font></div></div><div><br></div><div><br></div><div>I've also set <font face="monospace, monospace">/etc/sysctl.conf </font>with:</div><div><br></div><div><div><font face="monospace, monospace"># number of file descriptors</font></div><div><font face="monospace, monospace">fs.file-max=2001000</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"># extend the ports range</font></div><div><font face="monospace, monospace">net.ipv4.ip_local_port_range=1024 65535</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"># increase the max number of receive and send buffer size</font></div><div><font face="monospace, monospace">net.core.rmem_max=33554432</font></div><div><font face="monospace, monospace">net.core.wmem_max=33554432</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"># increase TCP auto-tuning buffer limits settings</font></div><div><font face="monospace, monospace">net.ipv4.tcp_rmem=4096 16384 33554432</font></div><div><font face="monospace, monospace">net.ipv4.tcp_wmem=4096 16384 33554432</font></div><div><font face="monospace, monospace">net.ipv4.tcp_mem=786432 1048576 26777216</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"># increase the number of memory map areas for the server process</font></div><div><font face="monospace, monospace">vm.max_map_count=131060</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"># swap only to avoid an out of memory condition</font></div><div><font face="monospace, monospace">vm.swappiness=0</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"># try to always keep 64MB of RAM free</font></div><div><font face="monospace, monospace">vm.min_free_kbytes=65536</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"># prevent flooding detection when receiving large number of SYN packets</font></div><div><font face="monospace, monospace"># use with care as they can detec DoS attacks</font></div><div><font face="monospace, monospace"># needed with artificial loads while running the benchmark</font></div><div><font face="monospace, monospace">net.ipv4.tcp_max_tw_buckets=360000</font></div><div><font face="monospace, monospace">net.core.somaxconn=4096</font></div><div><font face="monospace, monospace">net.ipv4.tcp_max_syn_backlog=16000</font></div><div><font face="monospace, monospace">net.ipv4.tcp_syncookies=0</font></div><div><font face="monospace, monospace">net.ipv4.tcp_tw_recycle=1</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"># insure keepalive is enabled - use only if needed</font></div><div><font face="monospace, monospace">net.ipv4.tcp_keepalive_time=900</font></div><div><font face="monospace, monospace">net.ipv4.tcp_keepalive_intvl=180</font></div><div><font face="monospace, monospace">net.ipv4.tcp_keepalive_probes=5</font></div></div><div><br></div><div>And applied them with <font face="monospace, monospace">sudo sysctl -p /etc/sysctl.conf</font>.</div><div><br></div><div>Finally, in my Erlang release I've set into <font face="monospace, monospace">vm.args</font>:</div><div><br></div><div><div><span style="font-family:monospace,monospace">+K true</span><br></div><div><font face="monospace, monospace">+P 2000000</font></div><div><font face="monospace, monospace">+Q 1000000</font></div><div><font face="monospace, monospace">+A 10</font></div></div><div><br></div><div>When I run my release and attach to the node, I can see:</div><div><br></div><div><div><div><font face="monospace, monospace">1> erlang:system_info(check_io).</font></div><div><font face="monospace, monospace">[{name,erts_poll},</font></div><div><font face="monospace, monospace"> {primary,epoll},</font></div><div><font face="monospace, monospace"> {fallback,poll},</font></div><div><font face="monospace, monospace"> {kernel_poll,epoll},</font></div><div><font face="monospace, monospace"> {memory_size,113328},</font></div><div><font face="monospace, monospace"> {total_poll_set_size,1243},</font></div><div><font face="monospace, monospace"> {fallback_poll_set_size,0},</font></div><div><font face="monospace, monospace"> {lazy_updates,true},</font></div><div><font face="monospace, monospace"> {pending_updates,0},</font></div><div><font face="monospace, monospace"> {batch_updates,false},</font></div><div><font face="monospace, monospace"> {concurrent_updates,true},</font></div><div><font face="monospace, monospace"> {max_fds,999999},</font></div><div><font face="monospace, monospace"> {active_fds,1}]</font></div></div></div><div><br></div><div>After all this I cannot connect more than 1024 outgoing HTTPS clients.</div><div><br></div><div>Any ideas?</div><div><br></div><div>Thank you,</div><div>r.</div><div><br></div><div><br></div><div><br></div><div>[1] <a href="http://erlang.org/doc/man/inet.html#id132028">http://erlang.org/doc/man/inet.html#id132028</a></div></div>