1. 程式人生 > >Linux核心引數修改及含義(EMQ配置)

Linux核心引數修改及含義(EMQ配置)

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) unlimited

修改配置檔案:

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秒。