Linux内核优化参数

作为一个高性能的WEB服务器,仅仅调整Nginx本身的参数是不可能的,因为Nginx服务依赖于一个高性能的操作系统。

以下是几种常见的Linux内核参数优化方法。

tcp_max_tw_buckets

对于tcp连接,服务器和客户端的状态在通信后更改为timewait。如果服务器非常繁忙,并且连接数特别多,那么等待时间将会增加。

毕竟会占用一定的资源,所以应该有一个最大值。当超过这个值时,系统将删除最早的连接,该连接将始终保持在一个数量级。

该值由参数net.ipv4.tcp_max_tw_buckets确定。

CentOS7系统,可以使用sysctl -a |grep tw_buckets查看其值,默认值为32768。

可以适当调低,比如调到8000。毕竟这种状态下连接太多会消耗资源。

但是不要调整到几十或者几百,因为这种状态下的tcp连接也是有用的。

如果同一客户端再次与服务器通信,则无需再次建立新的连接。使用这种旧渠道既省时又省力。

net . IP v4 . TCP _ tw _ recycle = 1

该参数的作用是在timewait状态下快速回收连接。虽然上面提到了系统会自动删除处于timewait状态的连接,但是如果重用这样的连接会更好。

因此,将该参数设置为1可以使timewait状态下的连接快速恢复,需要与以下参数配合使用。

net.ipv4.tcp_tw_reuse = 1

该参数设置为1,处于timewait状态的连接重新用于新的TCP连接,该连接应与上述参数一起使用。

net . IP v4 . TCP _ sync ookies = 1

在tcp三次握手中,客户端向服务器发送一个syn请求,服务器收到后,也会向客户端发送一个syn请求,并附带一个ack确认。

如果客户端发送请求后直接断开与服务器的连接,没有收到服务器发起的请求,服务器会重试多次。

这个重试过程会持续一段时间(通常超过30秒)。当这种状态下的连接数非常大时,服务器会消耗大量资源,导致瘫痪。

正常的连接进不去,这种恶意的半连接行为其实叫做syn flood攻击。

设置为1就是开启SYN Cookies,可以避免上述syn flood攻击。

该参数开启后,服务器在收到客户端的ack后,会要求客户端在短时间内响应一个序列号,然后向客户端发送ack+syn。

如果客户端不能提供序列号或者提供的序列号错误,则认为客户端是非法的,所以不会向客户端发送ack+syn,更不用说重试。

net.ipv4.tcp_max_syn_backlog

此参数定义系统可以接受的处于半连接状态的最大tcp连接数。客户端发送一个syn包给服务器,服务器收到后会记录下来。

该参数决定了最多可以记录多少个这样的连接。在CentOS7中,默认值为256。当出现syn flood攻击时,如果这个值太小,很容易导致服务器瘫痪。

实际上,服务器并不会消耗太多资源(cpu、内存等。)这个时候,所以可以适当调整,比如调整到30000。

net.ipv4.tcp_syn_retries

该参数适用于客户端,它定义了启动syn的最大重试次数。默认值为6,建议改为2。

net.ipv4.tcp_synack_retries

该参数适用于服务器,它定义了启动syn+ack的最大重试次数。默认值为5,建议改为2,可以适当防止syn flood攻击。

net . IP v4 . IP _本地_端口_范围

此参数定义端口范围。默认预留端口为1024及以下,以上部分为自定义端口。该参数适用于客户端,

当客户端与服务器建立连接时,例如访问服务器的端口80,客户端随机打开一个端口来启动与服务器的连接。

该参数定义了随机端口的范围。默认值为32768 61000,建议调整为1025 61000。

net.ipv4.tcp_fin_timeout

在tcp连接的状态中,客户端有一个FIN-WAIT-2状态,这是状态变为timewait之前的状态。

此参数定义不属于任何进程的连接状态的超时。默认值为60,建议调整为6。

net.ipv4.tcp_keepalive_time

tcp连接状态之一是established状态,只有在这种状态下,客户端和服务器才能通信。在正常情况下,当通信完成时,

客户端或服务器将告诉另一方关闭连接,状态将变为timewait。如果客户端不告诉服务器,

而且服务器没有告诉客户端关机(比如客户端断开),所以需要这个参数来确定。

例如,客户端已经断开连接,但是服务器上的连接状态仍然是建立的。为了确认客户端是否断开连接,

你需要每隔一段时间发送一次探测包,确认对方是否在线。这个时间由这个参数决定。其默认值为7200秒,建议设置为30秒。

net.ipv4.tcp_keepalive_intvl

该参数与上述参数一起使用。服务器在指定时间内启动探测,以查看客户端是否在线。如果客户不确认,

此时,服务器不能认为对方不在线,而是要尝试多次。该参数定义了重新发送探测的时间,即第一次发现对方有问题后,需要多长时间再次发起探测。

默认值为75秒,可以更改为3秒。

net.ipv4.tcp_keepalive_probes

参数10和11指定何时启动检测以及检测失败后多长时间启动检测,但它们不定义* * *检测完成的次数。

此参数定义启动探测的数据包数量。默认为9,建议设置为2。

设置和示例

Linux下调整内核参数可以直接编辑配置文件/etc/sysctl.conf,然后执行sysctl -p命令即可生效。