24 Nginx 的内核参数优化
更新时间:2020-03-03 10:04:34
困难只能吓倒懦夫懒汉,而胜利永远属于敢于等科学高峰的人。——茅以升

前言

在前面的两篇文章中,我们介绍了如何使用gzip对静态文件进行压缩,又介绍了如何对Nginx的常用配置进行优化。总而言之,都是为了更大限度的提高Nginx的性能。那么对于一个系统级别的软件来说,它还有很多功能依赖于操作系统本身。

默认的操作系统内核参数考虑的是最通用场景,不太符合用于支持高并发访问的Web服务器的场景,所以需要修改一些操作系统内核参数,使得Nginx可以拥有更高的性能。

优化内核参数

内核有非常多的参数,所以我们在在优化的时候,要根据业务特点来进行调整。在不同的场景下,比如当Nginx作为静态web服务器、或者反向代理或者提供压缩服务器的时候,其内核参数的调整都是不同的。

下面我们就看看有哪些常用的参数可以提高Nginx的性能:
图片描述

文件句柄

我们知道,在Linux系统中,所有的东西都是文件,对于一个TCP连接也一样,Linux使用一个文件句柄来标识一个连接。每个进程可以使用的文件句柄数量是有限的,所以我们要调节这个值用以满足要求,防止因为文件句柄数量达到上限而导致建立TCP连接失败。

fs.file-max = 999999  # 单进程可以使用的最大文件句柄数量

建连参数

建连队列

建立TCP连接的时候有两个队列(大家可以查阅相关的文档),通过设置队列的长度,可以加快建连的速度。

net.ipv4.tcp_max_syn_backlog = 8192

这个参数是设置三次握手阶段时候处于SYN状态的队列大小。

端口号范围

其实这个参数影响的是客户端可以使用的端口号数量,和服务端没有关系。但是我还是要在这里说一下这个参数,因为我们的Nginx服务器可能会作为客户端去请求其他服务器,这个情况下,该参数就会影响到Nginx服务器了。

net.ipv4.ip_local_port_range = 1024 65000 # tcp和upd使用的端口号范围

这个值由空格分隔的两部分组成,分别代表start portend port,要把这个值调节的稍微大一点。

TCP状态参数

我们先看一下TCP的时序状态转移图:
图片描述
(图片来自网络)

TIME_WAIT状态

正常情况下,处于TIME_WAIT状态的套接字是不能使用的,这是为了防止识别错误的报文。但是如果有大量的套接字处于TIME_WAIT的话,就会导致服务端的套接字数量不够,所以我们可以让处于这个状态的套接字可以服用。

# 让处于TIME_WAIT状态的套接字可复用
net.ipv4.tcp_tw_reuse = 1

#设置处于TIME_WAIT状态的套接字的最大数量
net.ipv4.tcp_max_tw_buckets = 5000
FIN_WAIT2状态
net.ipv4.tcp_fin_timeout = 30

设置这个时间也是为了尽快的释放套接字资源。

套接字参数

也有很多选项可以控制套接字相关的性能,我们来简单的了解一下。因为这些配置项都非常的简单易懂。

套接字缓冲区

共有四个常用的参数控制着套接字缓冲区的性能,分别如下:

#内核套接字接受缓存区默认大小
net.core.rmem_default = 6291456

#内核套接字发送缓存区默认大小
net.core.wmem_default = 6291456

#内核套接字接受缓存区较大大小
net.core.rmem_max = 12582912

#内核套接字发送缓存区较大大小
net.core.wmem_max = 12582912

上面几个参数要根据服务器的硬件进行相应的设定。

长连接事件

我把长连接也放到了这个部分,因为我认为因为长连接,所以可以让一个套接字被循环使用,避免了重复建立连接,销毁连接的操作。但是如果一个连接一直没有数据,我们应该及时的把他销毁,避免消耗一个套接字。

# 长连接保持的事件
ner.ipv4.tcp_keepalive_time = 600

总结

优化是一个长期的工作,不能一蹴而就。
这些是我们常用到的一些参数,大家的工作的过程中要不断的总结,不停的优化。

}