tune
This commit is contained in:
parent
952d62f39a
commit
6ced604dc4
|
@ -49,6 +49,7 @@ Contents:
|
||||||
bridge
|
bridge
|
||||||
commands
|
commands
|
||||||
plugins
|
plugins
|
||||||
|
tune
|
||||||
|
|
||||||
-------
|
-------
|
||||||
License
|
License
|
||||||
|
|
|
@ -0,0 +1,144 @@
|
||||||
|
|
||||||
|
.. _tune:
|
||||||
|
|
||||||
|
============
|
||||||
|
Tuning Guide
|
||||||
|
============
|
||||||
|
|
||||||
|
Tuning the Linux Kernel, Networking, Erlang VM and emqttd broker for one million concurrent MQTT connections.
|
||||||
|
|
||||||
|
-------------------
|
||||||
|
Linux Kernel Tuning
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
The system-wide limit on max opened file handles::
|
||||||
|
|
||||||
|
# 2 millions 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 to 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
|
||||||
|
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=2000 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
|
||||||
|
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 and optimize the Erlang VM in etc/vm.args file::
|
||||||
|
|
||||||
|
## max process numbers
|
||||||
|
+P 2097152
|
||||||
|
|
||||||
|
## Sets the maximum number of simultaneously existing ports for this system
|
||||||
|
+Q 1048576
|
||||||
|
|
||||||
|
## Increase number of concurrent ports/sockets, deprecated in R17
|
||||||
|
-env ERL_MAX_PORTS 1048576
|
||||||
|
|
||||||
|
-env ERTS_MAX_PORTS 1048576
|
||||||
|
|
||||||
|
## Mnesia and SSL will create temporary ets tables.
|
||||||
|
-env ERL_MAX_ETS_TABLES 1024
|
||||||
|
|
||||||
|
## Tweak GC to run more often
|
||||||
|
-env ERL_FULLSWEEP_AFTER 1000
|
||||||
|
|
||||||
|
-------------
|
||||||
|
emqttd broker
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Tune the acceptor pool, max_clients limit and sockopts for TCP listener in etc/emqttd.config::
|
||||||
|
|
||||||
|
{mqtt, 1883, [
|
||||||
|
%% Size of acceptor pool
|
||||||
|
{acceptors, 64},
|
||||||
|
|
||||||
|
%% Maximum number of concurrent clients
|
||||||
|
{max_clients, 1000000},
|
||||||
|
|
||||||
|
%% Socket Access Control
|
||||||
|
{access, [{allow, all}]},
|
||||||
|
|
||||||
|
%% Connection Options
|
||||||
|
{connopts, [
|
||||||
|
%% Rate Limit. Format is 'burst, rate', Unit is KB/Sec
|
||||||
|
%% {rate_limit, "100,10"} %% 100K burst, 10K rate
|
||||||
|
]},
|
||||||
|
...
|
||||||
|
|
||||||
|
--------------
|
||||||
|
Client Machine
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Tune the client machine to benchmark emqttd broker::
|
||||||
|
|
||||||
|
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
|
||||||
|
|
Loading…
Reference in New Issue