| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- .. _tune:
- ============
- Tuning Guide
- ============
- Tuning the Linux Kernel, Networking, Erlang VM and the *EMQ* broker for one million concurrent MQTT connections.
- -------------------
- Linux Kernel Tuning
- -------------------
- The system-wide limit on max opened file handles::
- # 2 million system-wide
- sysctl -w fs.file-max=2097152
- sysctl -w fs.nr_open=2097152
- echo 2097152 > /proc/sys/fs/nr_open
- The limit on opened file handles for current session::
- ulimit -n 1048576
- /etc/sysctl.conf
- ----------------
- Add the 'fs.file-max' to /etc/sysctl.conf, make the changes permanent::
- fs.file-max = 1048576
- /etc/security/limits.conf
- -------------------------
- Persist the limits on opened file handles for users in /etc/security/limits.conf::
- * soft nofile 1048576
- * hard nofile 1048576
- --------------
- Network Tuning
- --------------
- Increase number of incoming connections backlog::
- sysctl -w net.core.somaxconn=32768
- sysctl -w net.ipv4.tcp_max_syn_backlog=16384
- sysctl -w net.core.netdev_max_backlog=16384
- Local Port Range::
- sysctl -w net.ipv4.ip_local_port_range="1000 65535"
- Read/Write Buffer for TCP connections::
- sysctl -w net.core.rmem_default=262144
- sysctl -w net.core.wmem_default=262144
- sysctl -w net.core.rmem_max=16777216
- sysctl -w net.core.wmem_max=16777216
- sysctl -w net.core.optmem_max=16777216
- #sysctl -w net.ipv4.tcp_mem='16777216 16777216 16777216'
- sysctl -w net.ipv4.tcp_rmem='1024 4096 16777216'
- sysctl -w net.ipv4.tcp_wmem='1024 4096 16777216'
- Connection Tracking::
- sysctl -w net.nf_conntrack_max=1000000
- sysctl -w net.netfilter.nf_conntrack_max=1000000
- sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
- The TIME-WAIT Buckets Pool, Recycling and Reuse::
- net.ipv4.tcp_max_tw_buckets=1048576
- # Enable fast recycling of TIME_WAIT sockets. Enabling this
- # option is not recommended for devices communicating with the
- # general Internet or using NAT (Network Address Translation).
- # Since some NAT gateways pass through IP timestamp values, one
- # IP can appear to have non-increasing timestamps.
- # net.ipv4.tcp_tw_recycle = 1
- # net.ipv4.tcp_tw_reuse = 1
- Timeout for FIN-WAIT-2 sockets::
- net.ipv4.tcp_fin_timeout = 15
- ----------------
- Erlang VM Tuning
- ----------------
- Tuning and optimize the Erlang VM in etc/emq.conf file:
- .. code-block:: properties
- ## Erlang Process Limit
- node.process_limit = 2097152
- ## Sets the maximum number of simultaneously existing ports for this system
- node.max_ports = 1048576
- --------------
- The EMQ Broker
- --------------
- Tune the acceptor pool, max_clients limit and sockopts for TCP listener in etc/emqttd.config:
- .. code-block:: properties
- ## TCP Listener
- mqtt.listener.tcp = 1883
- mqtt.listener.tcp.acceptors = 64
- mqtt.listener.tcp.max_clients = 1000000
- --------------
- Client Machine
- --------------
- Tune the client machine to benchmark emqttd broker:
- .. code-block:: bash
- sysctl -w net.ipv4.ip_local_port_range="500 65535"
- sysctl -w fs.file-max=1000000
- echo 1000000 > /proc/sys/fs/nr_open
- ulimit -n 100000
- ---------------
- emqtt_benchmark
- ---------------
- Test tool for concurrent connections: http://github.com/emqtt/emqtt_benchmark
|