网络内核参数优化
1 、 /proc/sys/net/ipv4/tcp_syn_retries
/proc/sys/net/ipv4/tcp_syn_retries 参数标识对一个新建连接,内核要发送多少个SYN连接请求才决定放弃,此值不应该大于255,默认值是5, 建议设置为2 设置方法如下:
echo 2 > /proc/sys/net/ipv4/tcp_syn_retries
2、/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_time 参数表示 当 keepalive 启用的时候,TCP发送keepalive消息的频度。默认值是7200秒,建议修改为300秒。设置方法
echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
3、/proc/sys/net/ipv4/tcp_orphan_retries
/proc/sys/net/ipv4/tcp_orphan_retries 参数表示孤儿Socket 废弃前重试的次数,重负载web服务器建议调小。普通Web服务器建议设置为 1。设置方法
echo 1 > /proc/sys/net/ipv4/tcp_orphan_retries
4、/proc/sys/net/ipv4/tcp_syncookies
/proc/sys/net/ipv4/tcp_syncookies 参数表示开启SYN Cookies。当出现SYN等待队列溢出时,启用Cookies 来处理,可防范少了SYN攻击。默认值为0,表示关闭,普通web服务器建议设置如下:
echo 1 > //proc/sys/net/ipv4/tcp_syncookies
这里提到SYN攻击,他是当前最流行的DoS(拒绝服务)和DDos(分布式拒绝服务)的方式之一,它利用TCP协议缺陷,发送大量的TCP连接请求,常用假冒的IP和IP号段发送海量的请求连接第一个握手包。被攻击服务器回应第二个握手包,因为是假冒IP,对方永远收不到(不会回应)第三个握手包,导致被攻击服务器处于拥有大量的SYN_RECV状态的“半连接”,并且默认重试5次之后回应第2次握手包,直到塞满整个TCP队列,导致CPU/内存资源耗尽。
5、/proc/sys/net/ipv4/tcp_max_syn_backlog
/proc/sys/net/ipv4/tcp_max_syn_backlog 参数表示 设置SYN队列最大长度,默认值为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数,普通Web服务器建议设置为:
echo 8192 > /proc/sys/net/ipv4/tcp_max_syn_backlog
6、/proc/sys/net/ipv4/tcp_synack_retries
/proc/sys/net/ipv4/tcp_synack_retries 用来降低服务器SYN+ACK 报文重试次数(默认是5次),尽快释放等待资源,对于远端的SYN请求,内核会发送 SYN+ACK 数据报文,以确认收到上一个SYN请求包,这就是所谓的三次握手 机制的第二次。此参数是觉得内核放弃连接之前所送出的SYN+ACK的数目。
上面三个参数对于SYN攻击的危害一一对应,完完全全是对症下药,但这些措施也是双刃剑,设置过大可能会造成更多的服务器资源消耗,因此设置前需评估服务器资源压力。
7、/proc/sys/net/ipv4/tcp_tw_recycle
/proc/sys/net/ipv4/tcp_tw_recycle 参数表示开启TCP连接中TIME-WAIT sockets的快速回收,默认值是0,表示关闭,普通Web服务器建议设置:
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
这里重点介绍一下 TIME-WAIT 。这个TIME-WAIT 是指在TCP四次握手过程中,首先调用关闭连接发起的一方,在发送最后一个ACK之后就会进入 TIME-WAIT 的状态。在高并发连接的 TCP服务器上,在服务器请求处理完成后,会立刻主动正常关闭连接,此时就会出现大量的Socket请求处于TIME-WAIT的状态。如果客户端请求持续增高,部分客户端会因为服务器资源(服务器临时连接端口,PS:服务器可用端口为0~65535)连接不上服务器导致 连接不上服务器。
对应Web服务器优化时,要特别注意这个TCP状态 TIME-WAIT,要查看 TIME-WAIT状态 可以使用命令:
netstat -nat | awk '{print $6}' | sort | uniq -c | sort -rn
8、/proc/sys/net/ipv4/tcp_tw_reuse
/proc/sys/net/ipv4/tcp_tw_reuse 参数表示开启重用,运行将TIME-WAIT socket是重新用于新的TCP连接,因为重用连接比重新建立新的连接要方便的多,此值默认值为0,表示关闭;因为改resuse的同时 必须同时启用 快速回收recycle(即 tcp_tw_recycle 为1)。设置方式:
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
9、/proc/sys/net/ipv4/tcp_fin_timeout
/proc/sys/net/ipv4/tcp_fin_timeout 参数表示处于TIME-WAIT状态的连接在回收前必须等待的最小时间,改小他可以加快回收。建议设置:
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout
10、/proc/sys/net/ipv4/tcp_keepalive_probes
/proc/sys/net/ipv4/tcp_keepalive_probes 参数用来减少超时前的探测次数。
echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes
11、 /proc/sys/net/core/netdev_max_backlog
/proc/sys/net/core/netdev_max_backlog 参数是用来设置每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数。默认值为1000.
echo 3000 > /proc/sys/net/core/netdev_max_backlog
12、 /proc/sys/net/core/rmem_max wmem_max
这两个参数可以 提高TCP 最大缓冲区大小。
rmem:表示接收套接字缓冲区大小的最大值
wmem:表示发送套接字缓冲区大小的最大值
echo 16777216 > /proc/sys/net/core/rmem_max
echo 16777216 > /proc/sys/net/core/wmem_max
13、/proc/sys/net/core/tcp_rmem tcp_wmem
这两个参数可以提高Linux 内核自动对Socket缓冲区进行优化的能力
tcp_rmem:用来配置读缓冲的大小第一个值为最小值,第二个值为 默认值,第三个值为最大值
tcp_wmem: 用来配置写缓冲的大小第一个值为最小值,第二个值为 默认值,第三个值为最大值
echo "4096 87380 16777216" > /proc/sys/net/core/tcp_rmem
echo "4096 87380 16777216" > /proc/sys/net/core/tcp_wmem
14、/proc/sys/net/core/somaxconn
/proc/sys/net/core/somaxconn 参数用来设置Socket监听的backlog上限。backlog是Socket监听队列,当一个请求尚未被处理或者建立时,他会进入backlog。当Server 处理请求较慢时,监听队列被塞满,新来的请求就会被拒绝。默认值为128.
echo 4096 > /proc/sys/net/core/somaxconn