1. 单进程最大打开文件数限制
一般 linux 操作系统默认限制单进程最大打开 1024 个文件,高并发下已无法 满足需求,但是 root 启动的单一进程最大可用打开文件数的限制为 65535 个, 直接修改系统内核文件配置参数,使用 root 用户执行以下命令:
vi /etc/security/limits.conf
滚动页面到最下面,添加下图所示命令:
其中“*”号表示修改所有用户的限制;soft 或 hard 指定要修改软限制还是 硬限制;65535 则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。
修改完后保存文件。保存后,关闭窗口退出,再重新登陆,使用以下命令:
ulimit -a
查看参数 open files 参数是否生效
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]}'
查看 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
添加后使用 sysctl -p 命令使参数生效,配置以上的提升服务器的负载能力之外,还能够防御小流量程度的 DoS、CC 和 SYN 攻击。生效后,在查看服务器tcp 状态,可以查看到 TIME_WAIT 的个数明显减少,就配置成功了。
此外,再优化一下 TCP 的可使用端口范围,进一步提升服务器的并发能力,参数如下:
#表示当 keepalive 起用的时候,TCP 发送 keepalive 消息的频度。缺省是 2 小 时
net.ipv4.tcp_keepalive_time= 7200
#表示用于向外连接的端口范围。缺省情况下很小,改为 1024 到 65000。
net.ipv4.ip_local_port_range= 1024 65000
#表示 SYN 队列的长度,默认为 1024,加大队列长度为 8192,可以容纳更多 等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog= 8192
添加后使用 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
添加后使用 sysctl -p 命令使参数生效。如下图所示: