一、内核参数的查看和修改
- 查看内核参数
sysctl -a
- 临时修改内核参数
Linux系统启动后,所有的内核参数都保存在/proc/sys
目录下, 只需要把要修改的数值写入对应的文件中就行了。
- 永久修改内核参数
直接修改/etc/sysctl.conf
修改完成后sysctl -p
或者重启服务器使配置生效
二、常见问题
- Time wait bucket table overflow 报错
服务器/var/log/message
日志如下,执行命令ss -anp -o state time-wait|wc -l
统计处于 TIME_WAIT 状态的 TCP 连接数,发现处于 TIME_WAIT 状态的 TCP 连接非常多。
Feb 19 13:44:20 i-*** kernel: TCP: time wait bucket table overflow
Feb 19 13:44:24 i-*** kernel: printk: 432 messages suppressed.
Feb 19 13:44:34 i-*** kernel: TCP: time wait bucket table overflow
Feb 19 13:44:42 i-*** kernel: printk: 132 messages suppressed.
参数 net.ipv4.tcp_max_tw_buckets
可以调整内核管理中 TIME_WAIT 连接的数量,当服务器中处于 TIME_WAIT 连接的数量和需要转换为 TIME_WAIT 状态的连接数之和超过 net.ipv4.tcp_max_tw_buckets
的参数值时,服务器的日志中会出现以上错误
解决方法:调高改参数的值,或者在业务层面去改进TCP连接
- 服务器中 FIN_WAIT2 状态的 TCP 链接过多
原因分析:HTTP服务中,Server由于某种原因会主动关闭连接,列如keepalive超时的情况下。作为主动关闭连接的Server就会进入FIN_WAIT2状态;TCP/IP协议栈中存在连接半连接的概念,FIN_WAIT2状态不算超时,如果client不关闭,FIN_WAIT2将b保持到系统重启,越来越多的FIN_WAIT2会是内核出问题
解决方法:修改/etc/sysctl.conf
文件,加入以下内容
net.ipv4.tcp_syncookies = 1 # 该参数表示是否打开 TCP 同步标签(SYN_COOKIES),内核必须开启并编译 CONFIG_SYN_COOKIES,SYN_COOKIES 可以防止一个套接字在有过多试图连接到达时引起过载。
#默认值 0 表示关闭,当该参数被设置为 1 且 SYN_RECV 队列满了之后,内核会对 SYN 包的回复做一定的修改。启用 net.ipv4.tcp_syncookies 后,会忽略 net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog = 8192 # 该参数决定了系统中处于 SYN_RECV 状态的 TCP 连接数量。SYN_RECV 状态指的是当系统收到 SYN 后,作了 SYN+ACK 响应后等待对方回复三次握手阶段中的最后一个 ACK 的阶段
net.ipv4.tcp_max_tw_buckets = 5000
- 服务器中出现大量 CLOSE_WAIT 状态的 TCP 连接
原因分析:关闭TCP连接时,TCP连接的两端都可以发起关闭连接的请求,若对端发起了关闭连接,但本地没有关闭连接,那么连接就会处于CLOSE_WAIT状态。虽然该连接已经处于半开状态,但是已经无法和对端通信,需要及时释放掉该链接,可以从业务层判断某个连接是否已经被对端关闭。 - 其它常用内核参数
net.core.somaxconn:这个参数用于调节系统同时发起的TCP连接数,在高并发的请求中,默认的值可能会导致链接超时或重传。该参数指的是处于 ESTABLISHED 的数量上限。若服务器业务负载很高,则有必要调高该参数
net.ipv4.tcp_max_syn_backlog:指的是还在三次握手的半连接的上限
net.ipv4.tcp_fin_timeout:定义连接保持在FINFIN-WAIT-2状态的时间,默认60S
net.ipv4.tcp_tw_reuse:允许将TIME-WAIT 连接重新用于新的TCP连接,默认为0,1表示开启
net.ipv4.tcp_rw_recycle:为1时表示开启TCP连接中TIME-WAIT连接的快速回收
net.ipv4.tcp_syncookies:启用 SYN Cookies功能,当出现SYN队列溢出时,启用Cookie来处理,可以防范少量SYN攻击,默认开启
net.ipv4.tcp_keepalive_time:当keepalive开启时,TCP发送keepalive消息的频率,默认7200S,建议设置为600S
net.ipv4.ip_locall_port:允许系统打开的端口范围,即用于向外连接的端口范围
# 禁用整个系统所有接口的IPv6
net.ipv6.conf.all.disable_ipv6 = 1
# 禁用某一个指定接口的IPv6(例如:eth0, lo)
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1
三、禁用 CentOS 7 系统的 IPV6 接口
- 修改 /etc/default/grub 文件,把第六行修改为以下内容
GRUB_CMDLINE_LINUX="ipv6.disable=1 crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
- 重新生成 grub.cfg 文件
grub2-mkconfig -o /boot/grub2/grub.cfg
-
重启系统查看 IPV6 接口是否被禁用