Linux系统内核参数优化

497 阅读4分钟

1. 单进程最大打开文件数限制

一般 linux 操作系统默认限制单进程最大打开 1024 个文件,高并发下已无法 满足需求,但是 root 启动的单一进程最大可用打开文件数的限制为 65535 个, 直接修改系统内核文件配置参数,使用 root 用户执行以下命令:

vi /etc/security/limits.conf

滚动页面到最下面,添加下图所示命令:

image.png

其中“*”号表示修改所有用户的限制;soft 或 hard 指定要修改软限制还是 硬限制;65535 则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。

修改完后保存文件。保存后,关闭窗口退出,再重新登陆,使用以下命令:

ulimit -a

查看参数 open files 参数是否生效

image.png

2. 内核 TCP 参数优化

在 centos 系统下,TCP 连接断开后,会以 TIME_WAIT 状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的 TIME_WAIT 状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化 TCP 的内核参数,来及时将 TIME_WAIT 状态的端口清理掉。执行以下命令,完成服务器 tcp 状态统计:

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

image.png

查看 TIME_WAIT 的个数,查看到有多少个 time_wait,就占用了多个端口。操作系统只有 65535 个端口,占用一个少一个,会严重的影响到后继的新连接。这种情况下,我们就有必要调整下 Linux 的 TCP 内核参数,让系统更快的释放TIME_WAIT 连接。执行以下命令:

vi /etc/sysctl.conf

添加以下配置实现 tcp 端口复用,参数如下:

#表示开启 SYNCookies。当出现 SYN 等待队列溢出时,启用 cookies 来处理, 可防范少量 SYN 攻击,默认为 0,表示关闭;
net.ipv4.tcp_syncookies= 1

#表示开启重用。允许将 TIME-WAIT sockets 重新用于新的 TCP 连接,默认为 0,表示关闭;
net.ipv4.tcp_tw_reuse= 1

#表示开启 TCP 连接中 TIME-WAIT sockets 的快速回收,默认为 0,表示关闭;
net.ipv4.tcp_tw_recycle= 1

#修改系統默认的 TIMEOUT 时间;
net.ipv4.tcp_fin_timeout= 30

image.png 添加后使用 sysctl -p 命令使参数生效,配置以上的提升服务器的负载能力之外,还能够防御小流量程度的 DoS、CC 和 SYN 攻击。生效后,在查看服务器tcp 状态,可以查看到 TIME_WAIT 的个数明显减少,就配置成功了。

此外,再优化一下 TCP 的可使用端口范围,进一步提升服务器的并发能力,参数如下:

#表示当 keepalive 起用的时候,TCP 发送 keepalive 消息的频度。缺省是 2 小 时
net.ipv4.tcp_keepalive_time= 7200

#表示用于向外连接的端口范围。缺省情况下很小,改为 102465000。 
net.ipv4.ip_local_port_range= 1024 65000

#表示 SYN 队列的长度,默认为 1024,加大队列长度为 8192,可以容纳更多 等待连接的网络连接数。 
net.ipv4.tcp_max_syn_backlog= 8192

image.png 添加后使用 sysctl -p 命令使参数生效。

其他内核参数配置,参数如下:

#避免放大攻击 
net.ipv4.icmp_echo_ignore_broadcasts = 1 

#为了打开对端的连接,内核需要发送一个 SYN 并附带一个回应前面一个的 ACK。也就是所谓三次握手中的第二次握手。
#这个设置决定了内核放弃连接 之前发送 SYN+ACK 包的数量 
net.ipv4.tcp_synack_retries = 1 

#在内核放弃建立连接之前发送 SYN 包的数量 
net.ipv4.tcp_syn_retries = 1 

#开启恶意 icmp 错误信息保护 
net.ipv4.icmp_ignore_bogus_error_responses = 1 

#系统中最多有多少个 TCP 套接字不被关联到任何一个用户文件句柄上,如果 超过这个数字,连接将即刻被复位并打印出警告信息,
#这个限制仅仅是为了防 止简单的 DoS 攻击,不能过分依靠它或者人为地减小这个值,更应该增加这 个值(如果增加了内存之后)。 
net.ipv4.tcp_max_orphans = 3276800 

#centos 默认的 vm.swappiness 值是 60,这一默认值已经很合适了。但你可以改 小一些降低 swap 的加载,系统性能会有提升,把 60 换成 10 
vm.swappiness= 10

image.png

添加后使用 sysctl -p 命令使参数生效。如下图所示:

image.png