Linux内核调优常用参数

/etc/sysctl.conf配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

# 共享内存段的最大尺寸
kernel.shmmax = 34359738367
# 共享内存页数
kernel.shmall = 8388608
# 共享内存最大数量
kernel.shmmni = 4096

# 单个消息队列中允许的最大字节长度(限制单个消息队列中所有消息包含的字节数之和)
kernel.msgmnb = 65536
# 消息队列中单个消息的最大字节数
kernel.msgmax = 65536

# 该值越高则linux越倾向于将部分长期没有用到的页swap,即便有足够空余物理内存(1~100)
vm.swappiness = 0
# 是否允许内存的过量分配,允许进程分配比它实际使用的更多的内存
vm.overcommit_memory = 1

# 定义了一个进程能拥有的最多的内存区域
vm.max_map_count = 655360

# 系统中所有进程能够同时打开的文件句柄数量
fs.file-max = 655350
# 最大允许aio请求数量(会涉及到数据库的aio请求)
fs.aio-max-nr = 1048576

# 开启内核转发功能
net.ipv4.ip_forward = 1
# 开启SYN缓存,开启SYN洪水攻击保护。TCP建立连接的3次握手过程中,当服务端收到最初的SYN请求时,会检查应用程序的syn_backlog(上条说的SYN队列)队列是否已满,启用syncookie,可以解决超高并发时的Cant't Connet'问题。但是会导致TIME_WAIT状态fallback为保持2MSL时间,高峰期时会导致客户端可复用连接而无法连接服务器
net.ipv4.tcp_syncookies = 1
# 开启桥设备内核监控(ipv6)
net.bridge.bridge-nf-call-ip6tables = 1
# 开启桥设备内核监控(ipv4)
net.bridge.bridge-nf-call-iptables = 1

net_ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216

# 表示开启TCP连接TIME-WAIT sockets的快速回收,让连接更快释放,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1
# 表示系统允许SYN连接的重试次数。为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK包。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。
net.ipv4.tcp_synack_retries = 1
# 表示在内核放弃建立连接之前发送SYN包的数量。
net.ipv4.tcp_syn_retries = 1
# 表示开启重用,允许将TIME-WAIT sockets重新用于新的tcp连接
net.ipv4.tcp_tw_reuse = 1
# 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2 状态的时间
net.ipv4.tcp_fin_timeout = 60
# 系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息,默认值为180000,设为较小数值此项参数可以控制TIME_WAIT套接字的最大数量,避免服务器被大量的TIME_WAIT套接字拖死。(是TCP挥手时出现的,等待关闭状态)
net.ipv4.tcp_max_tw_buckets = 655350
# 打开FACK(Forward ACK)拥塞避免和快速重传功能(转发确认,不要在缓冲区停留)
net.ipv4.tcp_fack = 1
# 可以接收多少个SYN请求数,缓冲列队列长度的意思,可以改大,默认1024
net.ipv4.tcp_max_syn_backlog = 655350
# 服务器端可用端口范围(建议值 1024 65535)
net.ipv4.ip_local_port_range = 10240 65500

#如果TCP连接在空闲30秒后,内核才发起probe(探查),如果probe3次(每次3秒即tcp_keepalive_intvl值)不成功,内核才彻底放弃,认为连接已失效
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_keepalive_intvl = 3
net.ipv4.tcp_keepalive_probes = 3

# 内存中最多ip_conntrack结构的数量
net.netfilter.nf_conntrack_max=8388608
net.netfilter.nf_conntrack_tcp_timeout_close_wait=60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait=60
net.netfilter.nf_conntrack_tcp_timeout_time_wait=60

# 表示socket监听(listen)的backlog上限,可以粗理解为服务端能一次处理backlog队列中的个数
net.core.somaxconn=655350
net.core.netdev_max_backlog = 655350

net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_default = 8388608
net.core.wmem_max = 16777216

net.ipv4.tcp_mem = 786432 1048576 1572864
net.ipv4.tcp_rmem = 134217728 268435456 536870912
net.ipv4.tcp_wmem = 4194304 268435456 536870912