[erlang-questions] {error,emfile}

Roberto Ostinelli roberto@REDACTED
Wed Jan 7 16:23:57 CET 2015


Dear all,
I've built a benchmarking tool and I experience an error when connecting
more than 1024 clients to a SSL server. The call to ssl:connect/3 returns a
{error,emfile} instead of a Socket.

According to inet POSIX Error Codes [1], emfile corresponds to too many
open files.
I'm running from a UBUNTU 14.04 LTS box.

However, I've set my /etc/security/limits.conf with:

*   soft    nofile  999999
*   hard    nofile      999999

and rebooted the machine. I can see it applied:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 241197
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 999999
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 241197
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited


I've also set /etc/sysctl.conf with:

# number of file descriptors
fs.file-max=2001000

# extend the ports range
net.ipv4.ip_local_port_range=1024 65535

# increase the max number of receive and send buffer size
net.core.rmem_max=33554432
net.core.wmem_max=33554432

# increase TCP auto-tuning buffer limits settings
net.ipv4.tcp_rmem=4096 16384 33554432
net.ipv4.tcp_wmem=4096 16384 33554432
net.ipv4.tcp_mem=786432 1048576 26777216

# increase the number of memory map areas for the server process
vm.max_map_count=131060

# swap only to avoid an out of memory condition
vm.swappiness=0

# try to always keep 64MB of RAM free
vm.min_free_kbytes=65536

# prevent flooding detection when receiving large number of SYN packets
# use with care as they can detec DoS attacks
# needed with artificial loads while running the benchmark
net.ipv4.tcp_max_tw_buckets=360000
net.core.somaxconn=4096
net.ipv4.tcp_max_syn_backlog=16000
net.ipv4.tcp_syncookies=0
net.ipv4.tcp_tw_recycle=1

# insure keepalive is enabled - use only if needed
net.ipv4.tcp_keepalive_time=900
net.ipv4.tcp_keepalive_intvl=180
net.ipv4.tcp_keepalive_probes=5

And applied them with sudo sysctl -p /etc/sysctl.conf.

Finally, in my Erlang release I've set into vm.args:

+K true
+P 2000000
+Q 1000000
+A 10

When I run my release and attach to the node, I can see:

1> erlang:system_info(check_io).
[{name,erts_poll},
 {primary,epoll},
 {fallback,poll},
 {kernel_poll,epoll},
 {memory_size,113328},
 {total_poll_set_size,1243},
 {fallback_poll_set_size,0},
 {lazy_updates,true},
 {pending_updates,0},
 {batch_updates,false},
 {concurrent_updates,true},
 {max_fds,999999},
 {active_fds,1}]

After all this I cannot connect more than 1024 outgoing HTTPS clients.

Any ideas?

Thank you,
r.



[1] http://erlang.org/doc/man/inet.html#id132028
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20150107/25e88fca/attachment.htm>


More information about the erlang-questions mailing list