一、针对IPV4的内核7个参数的配置优化

这里提及的参数是和IPV4网络有关的Linux内核参数,可以将这些内核参数追加到Linux系统的/etc/sysctl.conf文件中,然后使用如下命令使更改生效:

#/sbin/sysctl -p

常用的参数包含以下:
net.core.netdev_max_backlog参数,表示当每个网络接口接受数据包的速率比内核处理这些包的速度快是,运行发送到队列的数据包的最大数目。一般默认为128(可能不同的Linux系统该数值不同)。Nginx服务器中定义的NGX_LISTEN_BACKLOG默认为511.可以将服务器参数调整如下:

net.core.netdev_max_backlog = 262144

net.core.somaxconn参数,用于调节系统同事发起的TCP连接数,一般默认值为128。在客户端存在高并发请求的情况下,该默认值较小可能导致连接超时或者重传问题,我们可以根据实际需要结合并发请求数来调整,笔者的系统设置为:

net.core.somaxconn = 262144

net.ipv4.tcp_max_orphans参数,用于设定系统中最多允许存在多少TCP套接字不被关联到任何一个用户文件句柄上。如果超出这个数字,没有与用户文件句柄关联的TCP套件字将立即被复位。同时给出警告信息。这个限制只是为了防止简单的DoS(Denial of Service,拒绝服务)攻击。一般在系统内存比较充足的情况下可以增大这个参数的赋值:

net.ipv4.tcp_max_orphans = 262144

net.ipv4.tcp_max_syn_backlog参数,用于记录尚未收到客户端确认信息的连接请求的最大值。对于拥有128M内存的系统而言,此参数的默认值是 1024,对小内存的系统则是128.一般在内存较为充足的情况下,可以增大这个参数的赋值:

net.ipv4.tcp_max_syn_backlog = 262144

net.ipv4.tcp_timestamps参数,用于设置时间戳,这可以避免序列号的卷绕。在一个1Gb/s的链路上,遇到以前用过的序列号的概率很大。当此值赋值为0时,禁用对TCP时间戳的支持。在默认情况下,TCP协议会让内核接受这种“异常”的数据包。针对Nginx服务器来说,建议将其关闭:

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp-synack_retries参数,用于设置内核放弃TCP连接之前向客户端发送SYN+ACK包的数量。为了建立对端的连接服务,服务器好客户端需要进行三次握手,第二次握手期间,内核需要发送SYN并附带一个回应前一个SYN的ACK。这个参数主要影响这个进程,一般赋值为1,即内核放弃连接之前发送一次SYN+ACK包,可以设定为:

net.ipv4.tcp_synack_retries = 1

net.ipv4.tcp_syn_retries参数,该参数和上一个参数类似,设置内核放弃建立连接之前发送SYN包的数量,赋值和上一个参数一样:

net.ipv4.tcp_syn_retries = 1

二、针对CPU的Nginx配置优化的2个指令

处理器已经进入多核时代。多内核指一枚处理器中集成2个或者多个完整的计算引擎,多核处理器是单芯片,一枚多核心处理器上可以承载多枚内核。但是需要单一的处理器插槽就可以工作。
在Nginx配置文件中,有这样2个指令:work_processes 和work_cpu_affinity,它们可以针对多核CPU进行配置优化。
work_processes指令用来设置Nginx服务器的进程数。官方文档建议此指令一般设定为1,赋值太多会影响系统的IO效率,降低Nginx服务器的性能。根据笔者的经验,为了让多核CPU更换的并行处理任务,可以将worker_processes指令的赋值适当的增大一些,最好是赋值为机器CPU的倍数。当然这个值并不是越大越好,Nginx进程太多可能增加主进程调度负担,也可能影响系统的IO效率。

worker_processes 4;

请输入图片描述

work_cpu_affinity指令的值是由几组二进制表示的。其中,每一组代表一个进程,每一组中的每一位表示该进程使用CPU的情况,1代表使用,0代表不使用。注意二进制位排列顺序和CPU的顺序是相反的。建议将不同的进程平均分配到不同的CPU运行内核上。
笔者设置Nginx服务的进程数是4,CPU是4核心,因此会有4组值,并且每组有4位,所以此指令的配置为:

worker_cpu_affinity 0001 0100 1000 0010;

四组二进制数值分别对应4个进程,第一个进程对应0001,表示使用第一个CPU内核;第二个进程对应0010,表示使用第二个内核,以此类推。

如果worker_processes指令赋值为8(即4核心开启8进程),即赋值为CPU内核数的两倍,则worker_cpu_affinity的指令设置:

worker_cpu_affinity 0001 0010 0100 1000 0001 0010 0100 1000;

如果一台主机主机的CPU是8个CPU,并且worker_processes指令赋值为8,那么worker_cpu_affinity指令设置:

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

worker_processes最多开启8个,8个以上性能就不会再提升了,而且稳定性会变的更低,因此8个进程够用了。



最后修改:2021 年 02 月 04 日
如果觉得我的文章对你有用,请随意赞赏