參考官方配置頁面:http://emqtt.com/docs/v2/tune.html
Linux 操作系統參數
系統所有進程可打開的文件數量
官方配置:
sysctl -w fs.file-max=2097152 sysctl -w fs.nr_open=2097152 echo 2097152 > /proc/sys/fs/nr_open
服務器當前配置:
[root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/fs/file-max 798344 [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/fs/nr_open 1048576
修改服務器配置:
echo 1048576 > /proc/sys/fs/file-max echo 1048576 > /proc/sys/fs/nr_open
[root@iZuf6ixy03u72vzno4jsiuZ ~]# echo 1048576 > /proc/sys/fs/file-max [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/fs/file-max 1048576 [root@iZuf6ixy03u72vzno4jsiuZ ~]# echo 1048576 > /proc/sys/fs/nr_open [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/fs/nr_open 1048576
系統允許當前進程打開的文件數量:
官方配置:
ulimit -n 1048576
本地服務器配置:
[root@iZuf6ixy03u72vzno4jsiuZ ~]# 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) 31402 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 278528 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 65535 virtual memory (kbytes, -v) unlimited file locks (-x) unlimied
修改配置文件:
ulimit -n 524288
修改后配置:
[root@iZuf6ixy03u72vzno4jsiuZ ~]# ulimit -n 524288 [root@iZuf6ixy03u72vzno4jsiuZ ~]# 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) 31402 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 524288 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 65535 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
/etc/sysctl.conf
持久化 ‘fs.file-max’ 設置到 /etc/sysctl.conf 文件:
官方配置:
fs.file-max = 1048576 #表示文件句柄的最大數量
修改配置:
vm.swappiness = 0 net.ipv4.neigh.default.gc_stale_time=120 net.ipv4.conf.all.rp_filter=0 net.ipv4.conf.default.rp_filter=0 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.all.arp_announce=2 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 1024 net.ipv4.tcp_synack_retries = 2 net.ipv4.conf.lo.arp_announce=2 # fs.file-max=65535 fs.file-max=524288
設置服務最大文件句柄數
/etc/systemd/system.conf 設置服務最大文件句柄數:
DefaultLimitNOFILE=1048576
持久化設置允許用戶/進程打開文件句柄數
/etc/security/limits.conf 持久化設置允許用戶/進程打開文件句柄數:
limits.conf文件限制着用戶可以使用的最大文件數,最大線程,最大內存等資源使用量。
官方配置:
* soft nofile 1048576 * hard nofile 1048576
服務器配置:
# End of file * soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535 * soft nofile 65535 * hard nofile 65535 * - nofile 278528
服務器修改后配置:
# End of file * soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535 * soft nofile 524288 * hard nofile 524288 * - nofile 278528
TCP 協議棧網絡參數
並發連接 backlog 設置:
官方配置:
sysctl -w net.core.somaxconn=32768 #定義了系統中每一個端口最大的監聽隊列的長度,這是個全局的參數。 sysctl -w net.ipv4.tcp_max_syn_backlog=16384 #對於還未獲得對方確認的連接請求,可保存在隊列中的最大數目。如果服務器經常出現過載,可以嘗試增加這個數字。 sysctl -w net.core.netdev_max_backlog=16384 #在每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。
服務端配置:
[root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/core/somaxconn 128 [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/core/netdev_max_backlog 1000
修改配置:
[root@iZuf6ixy03u72vzno4jsiuZ ~]# echo 8192 >/proc/sys/net/core/somaxconn [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/core/somaxconn 8192 [root@iZuf6ixy03u72vzno4jsiuZ ~]# echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/ipv4/tcp_max_syn_backlog 4096 [root@iZuf6ixy03u72vzno4jsiuZ ~]# echo 4096 > /proc/sys/net/core/netdev_max_backlog [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/core/netdev_max_backlog 4096
可用知名端口范圍:
官方配置:
sysctl -w net.ipv4.ip_local_port_range='1000 65535'
服務端配置
cat /proc/sys/net/ipv4/ip_local_port_range [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000
TCP Socket 讀寫 Buffer 設置:
官方配置:
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 #該文件表示每個套接字所允許的最大緩沖區的大小
服務端配置:
[root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/core/rmem_default 124928 [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/core/wmem_default 124928 [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/core/rmem_max 124928 [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/core/wmem_max 124928 [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/core/optmem_max 20480
修改服務端配置:
echo 4194304 > /proc/sys/net/core/rmem_max echo 4194304 > /proc/sys/net/core/wmem_max echo 4194304 > /proc/sys/net/core/optmem_max cat /proc/sys/net/ipv4/tcp_mem #sysctl -w net.ipv4.tcp_mem='16777216 16777216 16777216'
內核分配給TCP連接的內存
第一個數字表示,當 tcp 使用的 page 少於 196608 時,kernel 不對其進行任何的干預
第二個數字表示,當 tcp 使用了超過 262144 的 pages 時,kernel 會進入 “memory pressure” 壓力模式
第三個數字表示,當 tcp 使用的 pages 超過 393216 時(相當於1.6GB內存),就會報:Out of socket memory
sysctl -w net.ipv4.tcp_rmem='1024 4096 16777216' sysctl -w net.ipv4.tcp_wmem='1024 4096 16777216' #為每個TCP連接分配的讀、寫緩沖區內存大小,單位是Byte 第一個數字表示,為TCP連接分配的最小內存 第二個數字表示,為TCP連接分配的缺省內存 第三個數字表示,為TCP連接分配的最大內存 [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/ipv4/tcp_mem 753600 1004800 1507200 #無修改
TCP 連接追蹤設置:
官方配置:
sysctl -w net.nf_conntrack_max=1000000 sysctl -w net.netfilter.nf_conntrack_max=1000000 #CONNTRACK_MAX 允許的最大跟蹤連接條目,是在內核內存中netfilter可以同時處理的“任務”(連接跟蹤條目) sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
服務端配置:
cat /proc/sys/net/nf_conntrack_max cat /proc/sys/net/netfilter/nf_conntrack_max cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_time_wait [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/nf_conntrack_max 65536 [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/netfilter/nf_conntrack_max 65536 [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_time_wait 120
修改服務端配置:
echo 250000 > /proc/sys/net/nf_conntrack_max echo 250000 > /proc/sys/net/netfilter/nf_conntrack_max
TIME-WAIT Socket 最大數量、回收與重用設置
官方配置:
net.ipv4.tcp_max_tw_buckets=1048576 #表示系統同時保持TIME_WAIT的最大數量,如果超過這個數字,TIME_WAIT將立刻被清除並打印警告信息。
當前服務器配置:
cat /proc/sys/net/ipv4/tcp_max_tw_buckets [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/ipv4/tcp_max_tw_buckets 5000
修改服務器配置:
echo 262114 > /proc/sys/net/ipv4/tcp_max_tw_buckets
注意: 不建議開啟該設置,NAT模式下可能引起連接RST
# net.ipv4.tcp_tw_recycle = 1 # net.ipv4.tcp_tw_reuse = 1
FIN-WAIT-2 Socket 超時設置:
net.ipv4.tcp_fin_timeout = 15 cat /proc/sys/net/ipv4/tcp_fin_timeout
[root@iZuf6ixy03u72vzno4jsiuZ ~]# echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout [root@iZuf6ixy03u72vzno4jsiuZ ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout 15
提高Linux應對短連接的負載能力
在存在大量短連接的情況下,Linux的TCP棧一般都會生成大量的 TIME_WAIT 狀態的socket。你可以用下面的命令看到:
netstat -ant| grep -i time_wait
有時候,這個數目是驚人的:
netstat -ant|grep -i time_wait |wc -l
可能會超過三四萬。這個時候,我們需要修改 linux kernel 的 tcp time wait的時間,縮短之,有個 sysctl 參數貌似可以使用,它是 /proc/sys/net/ipv4/tcp_fin_timeout,缺省值是 60,也就是60秒。