当前位置: 首页 > news >正文

nginx参数调优能提升多少性能

前言

nginx安装后一般都会进行参数优化,网上找找也有很多相关文章,但是这些参数优化对Nginx性能会有多大影响?为此我做个简单的实验测试下这些参数能提升多少性能。

声明一下,测试流程比较简单,后端服务也很简单,测试时间也很短,所以实验并不严谨,结果仅作参考,需要根据实际情况进行参数调优。

文章或有错误和疏漏之处,欢迎各位大佬指出或补充。

环境

IP操作系统CPU内存部署服务
192.168.3.60Debian 11.844 GBwrk
192.168.3.61Debian 11.844 GBnginx
192.168.3.62Debian 11.844 GB后端服务
  • nginx:版本1.24.0,编译参数:
./configure --with-threads --with-file-aio --with-http_ssl_module --with-http_v2_module --with-http_gunzip_module --with-http_gzip_static_module --with-stream --with-compat --with-pcre-jit --prefix=/home/admin/apps/nginx
  • 使用wrk进行性能测试,版本为 4.1.0,通过 apt 包管理器安装。
  • 因为主要测试nginx反向代理的性能,所以用go写了个响应"hello world"的api,减少后端服务导致的性能影响。

测试方法:调整nginx参数后多次运行wrk,取平均值。(方法并不严谨,应该用更专业的工具测试运行几小时,将测试数据采用更科学的方法汇总,但时间精力有限,所以采用这个非常简单无脑的实验方法)

实验结果

下面的实验过程主要就是调参数,比较繁琐,所以把实验结果先放到前面。综合配置可参考“实验过程 - 13. 综合调优”。

再次声明,由于测试流程和后端逻辑都比较简单,服务器和网络情况也没严格控制变量所以结果仅供参考。

根据实验结果来看,增大工作进程数能直接提升性能,但不是和CPU核心数一致就能最大化,可能少一点才能达到最佳性能。

除了nginx和系统参数调优,网络和后端服务对性能的影响也很大,而且在大部分ToB业务场景下,后端服务和数据库才是性能短板。

序号测试方式Nginx参数优化项总请求数平均每秒请求数平均延迟优化效果
1wrk -> 后端413998468884.591.66ms+673%
2wrk -> nginx -> 后端无,默认配置5348598911.3012.04ms-
3.1wrk -> nginx -> 后端设置工作进程数为2102774517127.495.95ms+92.19%
3.2wrk -> nginx -> 后端设置工作进程数为367665111274.058.97ms+26.51%
3.3wrk -> nginx -> 后端设置工作进程数为auto(4)5477949125.6611.14ms+2.41%
4wrk -> nginx -> 后端设置工作进程数和CPU亲和性为auto5377138958.1011.67ms+0.52%
5wrk -> nginx -> 后端在4的基础上设置worker_connections 65535;5327588874.8511.80ms-0.4%
6wrk -> nginx -> 后端在5的基础上设置accept_mutex on;4255407088.3915.58ms-20.45%
7wrk -> nginx -> 后端在6的基础上设置multi_accept on5915009854.7710.60ms+10.58%
8wrk -> nginx -> 后端在7的基础上设置改为upstream5586799308.3012.00ms+4.45%
9wrk -> nginx -> 后端在8的基础上设置keepalive63267310541.4910.06ms+18.29%
10wrk -> nginx -> 后端在9的基础上设置加一个后端100648516772.086.53ms+88.21%
11wrk -> nginx -> 后端在2的基础上设置加一个后端61088210178.2610.21ms+14.21%
12wrk -> nginx -> 后端在3.1的基础上设置keepalive104102417348.365.94ms+94.67%
13wrk -> nginx -> 后端在2的基础上设置deferred5961979934.6110.90ms+11.48%
14wrk -> nginx -> 后端在2的基础上修改内核参数5815359689.9110.95ms+8.73%
15wrk -> nginx -> 后端综合调优108715118115.785.94ms+103.28%

单独测试nginx的性能,避免后端服务和网络情况的影响。

序号Nginx参数优化项总请求数平均每秒请求数平均延迟优化效果
1无,默认配置232740038787.612.71ms-
2在1的基础上设置工作进程数为auto7418729123633.13791.04us218.74%
3在2的基础上设置CPU亲和性7437087123945.45784.02us219.54%
4在3的基础上设置工作进程连接数和多请求7638947127300.44764.67us228.19%

调整环境,nginx都采用默认配置,只是修改了各组件的位置。因为组件在同一台服务器,资源竞争情况也会影响性能。

环境总请求数平均每秒请求数平均延迟
wrk、nginx和后端各在不同的服务器5348598911.3012.04ms
wrk单独服务器,nginx和后端在同一台服务器3866306441.0516.24ms
wrk、nginx和后端在同一台服务器4021636700.3815.15ms

实验过程

1. 直连后端测试

首先用wrk直接测试后端。因为没有中间商赚差价,所以理论上直连性能会比nginx代理的性能高。

# curl 测试后端响应是否正常
curl http://192.168.3.62:8101# wrk 直接测试后端服务。线程数为4,连接数为100,测试时间为60秒。
wrk -t4 -c100 -d60s http://192.168.3.62:8101

wrk测试结果

总请求数平均每秒请求数平均延迟
413998468884.591.66ms

2. 使用nginx默认配置代理

nginx刚安装后有一个默认配置,这里只改了location /的配置,修改为反向代理到后端服务

location / {#root   html;#index  index.html index.htm;proxy_pass http://192.168.3.62:8101;
}

wrk测试结果。相较于后端直连,性能缩水很多

总请求数平均每秒请求数平均延迟
5348598911.3012.04ms

3. 增加工作进程数

nginx默认工作进程数为1,通过修改worker_processes可指定,一般小于或等于CPU核心数

worker_processes总请求数平均每秒请求数平均延迟对比默认配置
1(默认)5348598911.3012.04ms-
2102774517127.495.95ms+92.19%
367665111274.058.97ms+26.51%
auto(4)5477949125.6611.14ms+2.41%

4. 设置CPU亲和性

通过worker_cpu_affinity绑定工作进程和CPU,避免nginx进程在CPU之间切换导致的伪共享带来的性能问题。

nginx配置:

worker_processes  auto;
worker_cpu_affinity auto;

wrk测试结果

总请求数平均每秒请求数平均延迟对比默认配置
5377138958.1011.67ms+0.52%

5. 设置worker_connections

worker_connections用于设置每个Nginx进程可处理并发连接的最大数,默认为1024。

worker_processes  auto;
worker_cpu_affinity auto;
events {worker_connections 65535;
}

wrk测试结果

总请求数平均每秒请求数平均延迟对比默认配置
5327588874.8511.80ms-0.4%

6. 启用互斥锁

nginx配置

worker_processes  auto;
worker_cpu_affinity auto;
events {worker_connections 65535;accept_mutex on;
}

wrk测试结果

总请求数平均每秒请求数平均延迟对比默认配置
4255407088.3915.58ms-20.45%

7. 启用多请求支持

默认情况下,每个工作进程一次只接受一个新连接。开启后,每个工作进程将接受所有的新连接。

nginx配置

worker_processes  auto;
worker_cpu_affinity auto;
events {worker_connections 65535;accept_mutex on;multi_accept on;
}

wrk测试结果

总请求数平均每秒请求数平均延迟对比默认配置
5915009854.7710.60ms+10.58%

8. 使用upstream

之前的配置都通过proxy_pass直接反向代理到后端,修改为upstream。

nginx配置

worker_processes  auto;
worker_cpu_affinity auto;
events {worker_connections 65535;accept_mutex on;multi_accept on;
}
http {upstream backend {server 192.168.3.62:8101;}server {location / {proxy_pass http://backend;}}
}

wrk测试结果。性能有所降低,但在多个后端的情况下,还是配置upstream更方便。

总请求数平均每秒请求数平均延迟对比默认配置
5586799308.3012.00ms+4.45%

9. 设置keepalive长连接

长连接的存在可以减少建立和关闭TCP连接带来的消耗和延迟。

nginx配置

worker_processes  auto;
worker_cpu_affinity auto;
events {worker_connections 65535;accept_mutex on;multi_accept on;
}
http {upstream backend {server 192.168.3.62:8101;keepalive 32;keepalive_requests 2000;}server {location / {proxy_pass http://backend;}}
}

wrk测试结果

总请求数平均每秒请求数平均延迟对比默认配置
63267310541.4910.06ms+18.29%

10. 增加后端实例数

分别在默认配置和上一步的基础上,将后端实例数加1。

修改后的nginx配置

worker_processes  auto;
worker_cpu_affinity auto;
events {worker_connections 65535;accept_mutex on;multi_accept on;
}
http {upstream backend {server 192.168.3.62:8101;server 192.168.3.62:8102;keepalive 32;keepalive_requests 2000;}server {location / {proxy_pass http://backend;}}
}

wrk测试结果

配置总请求数平均每秒请求数平均延迟对比默认配置
默认配置多后端61088210178.2610.21ms+14.21%
默认配置,长连接,工作进程数2104102417348.365.94ms+94.67%
修改配置多后端100648516772.086.53ms+88.21%

11. 延迟处理新连接

设置deferred参数可延迟处理新连接,加上这个配置后,当用户与nginx服务器建立连接时,只有用户有请求数据时才会将TCP连接状态改为ESTABLISHED,否则就直接丢弃这条连接。通过减少服务器和客户端之间发生的三次握手建立连接的数量来帮助提高性能。

nginx配置

worker_processes  1;
events {worker_connections 1024;
}
http {server {listen 8100 deferred;}
}

wrk测试结果

总请求数平均每秒请求数平均延迟对比默认配置
5961979934.6110.90ms+11.48%

12. 修改内核参数

修改的内核参数如下

# 网卡接受数据包的队列最大长度
net.core.netdev_max_backlog = 24800
# 已经收到syn包,但是还没有来得及确认的连接队列
net.ipv4.tcp_max_syn_backlog = 24800
# 端口监听队列的最大长度, 存放的是已经处于ESTABLISHED而没有被应用程序接管的TCP连接
net.core.somaxconn = 65535
# SYN的超时重传次数
net.ipv4.tcp_syn_retries = 2
# 服务端等待客户端响应ACK的超时重传次数
net.ipv4.tcp_synack_retries = 2
# 作为服务端才拥有TCP Fast Open机制
net.ipv4.tcp_fastopen = 2

nginx的配置为默认配置。

wrk测试结果

总请求数平均每秒请求数平均延迟对比默认配置
5815359689.9110.95ms+8.73%

13. 综合调优

开启多请求支持,增加工作进程连接数,配置长连接,增加后端实例,修改内核参数。

如果不想一遍遍修改工作进程数,直接设置为auto最省事,虽然不一定会是最优配置,但总比默认强。

nginx配置

worker_processes  auto;
events {worker_connections 65535;multi_accept on;
}
http {upstream backend {server 192.168.3.62:8101;server 192.168.3.62:8102;keepalive 32;keepalive_requests 2000;}server {lister deferred backlog=24800;location / {proxy_pass http://backend;}}
}

内核参数

net.core.netdev_max_backlog = 24800
net.ipv4.tcp_max_syn_backlog = 24800
net.core.somaxconn = 65535
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_fastopen = 2

wrk测试结果

总请求数平均每秒请求数平均延迟对比默认配置
108715118115.785.94ms+103.28%

14. 单独测试nginx

以上测试场景都有nginx反向代理后端,而网络和后端也会在一定程度上影响nginx性能,所以这里单独测试nginx。

nginx配置

worker_processes  auto;
worker_cpu_affinity auto;
events {worker_connections 65535;multi_accept on;
}
http {server {location / {return 200 'hello world';}}
}

wrk测试结果。在没有反向代理的情况下,增加工作进程数就能直接提升nginx性能。

序号Nginx参数优化项总请求数平均每秒请求数平均延迟优化效果
1无,默认配置232740038787.612.71ms-
2在1的基础上设置工作进程数为auto7418729123633.13791.04us218.74%
3在2的基础上设置CPU亲和性7437087123945.45784.02us219.54%
4在3的基础上设置工作进程连接数和多请求7638947127300.44764.67us228.19%

【性能测试】终于有一套全面的性能测试教程啦!真实企业性能测试全流程项目实战!

 

相关文章:

nginx参数调优能提升多少性能

前言 nginx安装后一般都会进行参数优化,网上找找也有很多相关文章,但是这些参数优化对Nginx性能会有多大影响?为此我做个简单的实验测试下这些参数能提升多少性能。 声明一下,测试流程比较简单,后端服务也很简单&…...

用友U8 Cloud 反序列化RCE漏洞复现

0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP,主要聚焦成长型、创新型企业,提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友U8 Cloud存在多处(FileManageServlet和LoginVideoServlet)反序列化漏洞,系统未将…...

acwing算法基础之数据结构--STL简介

目录 1 基础知识2 模板3 使用示例3.1 vector3.2 pair3.3 string3.4 queue 1 基础知识 无。 2 模板 vector, 变长数组,倍增的思想size() 返回元素个数empty() 返回是否为空clear() 清空front()/back() 使用时,必须判断向量类容器非空push_back()/po…...

【Python深入学习】- 书籍推荐|数据结构和算法介绍|内建集合数据类型

🌈个人主页: Aileen_0v0 🔥系列专栏:PYTHON学习系列专栏 💫"没有罗马,那就自己创造罗马~" 若把编写代码比作行军打仗,那么要想称霸沙场,不能仅靠手中的利刃,还需深谙兵法。Python是一把利刃&…...

物联网对接协议

物联网对接协议有很多种,以下是几种常见的物联网对接协议: Modbus:是一种强大的通信标准,广泛应用于工业自动化和SCADA系统,以便将仪表、传感器和执行器的信号发送回主控制器。 Modbus具有广泛的通信协议,…...

腾讯待办关停,导出的数据怎么恢复到手机上面?

相信有不少腾讯待办的用户都发现了其“业务关停通知”,确实如此,由于业务调整,腾讯待办将于2023年的12月20日全面停止运营并下架,这就表示以后我们无法继续使用它了。在腾讯待办关停之前,绝大多数用户需要做的就是及时…...

视频特效编辑软件 After Effects 2022 mac中文版介绍 (ae 2022)

After Effects 2022 mac是一款视频特效编辑软件,被称为AE,拥有强大的特效工具,旋转,用于2D和3D合成、动画制作和视觉特效等,效果创建电影级影片字幕、片头和过渡,是一款可以帮助您高效且精确地创建无数种引…...

innovus:解决报告复制时一行拆成两行的问题

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? innovus复制报告时一行的东西出现在两行上,解决只需要一条命令: set_table_style -no_frame_width...

MySQL数据脱敏(Data masking plugin functions)

对于企业而言,数据脱敏可以在数据共享或测试时用于保护敏感数据(如信用卡,社保卡,地址等)。通过对敏感数据进行脱敏处理,组织可以最大限度地降低数据泄露和未经授权访问的风险,同时仍能够使用真…...

Flutter 07 框架和三棵树(Widgets、Elements和RenderObjects)

一、Flutter框架的整体结构: Flutter是Google推出并开源的跨平台开发框架,主打跨平台、高保真、高性能。开发者可以通过Dart语 言开发Flutter应用,一套代码同时运行在ios和Android平台。不仅如此,Flutter还支持Web、桌面、嵌 入应…...

EasyExcel 导出冻结指定行

导出的实体类 package org.jeecg.modules.eis.test;import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.*; import lombok.Getter; import lombok.Setter; import org.apache.poi.ss.usermodel.HorizontalAlignment;import…...

ke9案例三:页面提交文件,我服务器端接收

案例三:页面提交文件,我服务器端接收 ProcessFile.java 1value "/process-file" 2获取邮件消息的所有部分part--Collection<Part> partsrequest.getParts(); 3遍历每一个part 4之后可以打印头文件等String headerpart.getHeader("content-disposition&q…...

springboot调用第三方接口json转换成对象

请求接口是一个比较常见的需求&#xff0c;接口返回一般是一个json类型&#xff0c;需要进行组装成对应的类&#xff0c;例 {"status_code": 200,"message": "success","data": {"cost": 286.6933,"bom_list": […...

uniapp使用vue3和ts开发小程序自定义tab栏,实现自定义凸出tabbar效果

要实现自定义的tabbar效果&#xff0c;可以使用自定义tab覆盖主tab来实现&#xff0c;当程序启动或者从后台显示在前台时隐藏自带的tab来实现。自定义一个tab组件&#xff0c;然后在里面实现自定义的逻辑。 组件中所使用的组件api可以看&#xff1a;Tabbar 底部导航栏 | uView…...

麒麟信安获批牵头成立国家关键领域信创行业产教融合共同体

日前&#xff0c;由麒麟信安、长沙理工大学、长沙职业技术学院联合牵头成立的国家关键领域信创行业产教融合共同体&#xff08;以下简称&#xff1a;共同体&#xff09;已获湖南省教育厅批准&#xff0c;并推荐至教育部。 目前共同体已吸引10余家联盟单位及全国20余家企业、高…...

好消息,微信消费者投诉工具升级,可以直接回复用户、处理投诉了。。。

大家好&#xff0c;我是小悟 兄弟们&#xff0c;阅读本文之前&#xff0c;建议先阅读【连夜干出来一个自动处理【微信消费者投诉管理系统】&#xff0c;支持多商户】。 为了使工具更好用&#xff0c;也为帮助商户更好地处理消费者投诉&#xff0c;提升用户满意度&#xff0c;…...

手动修复 rabbitmq 报错 “Crash dump is being written to“

rabbitmq 报错: 2023-11-07 16:38:52.682 [error] emulator Error in process <0.368.0> on node rabbitrabbitmq-0.rabbitmq-discovery.openstack.svc.cluster.local with exit value: {shutdown,[{mnesia_loader,handle_exit,2,[{file,"mnesia_loader.erl"}…...

日志门面技术

1.JCL public abstract class LogFactory {public static Log getLog(Class clazz) throws LogConfigurationException {// 默认实现类为LogFactoryImplreturn getFactory().getInstance(clazz);} }利用LogFactoryImpl实例化具体的日志框架。其中&#xff0c;如果存在log4j依赖…...

机器人制作开源方案 | 管内检测维护机器人

一、作品简介 作者&#xff1a;李泽彬&#xff0c;李晋晟&#xff0c;杜张坤&#xff0c;禹馨雅 单位&#xff1a;运城学院 指导老师&#xff1a;薛晓峰 随着我国的社会主义市场经济的飞速发展和科学技术的革新&#xff0c;各行各业的发展越来越离不开信息化和网络化的…...

k8s存储卷

目录 1、emptyDir存储卷 2、hostPath存储卷 3、nfs共享存储卷 4、PVC 和 PV 4.1 PV和PVC之间的相互作用遵循这个生命周期&#xff1a; 4.2 PV的状态 4.3 一个PV从创建到销毁的具体流程如下&#xff1a; 静态PVC&#xff1a; 动态PVC 1、emptyDir存储卷 当Pod被分配给节…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系&#xff0c;可直观判断线性相关、非线性相关或无相关关系&#xff0c;点的分布密…...

第6章:Neo4j数据导入与导出

在实际应用中&#xff0c;数据的导入与导出是使用Neo4j的重要环节。无论是初始数据加载、系统迁移还是数据备份&#xff0c;都需要高效可靠的数据传输机制。本章将详细介绍Neo4j中的各种数据导入与导出方法&#xff0c;帮助读者掌握不同场景下的最佳实践。 6.1 数据导入策略 …...

如何在Spring Boot中使用注解动态切换实现

还在用冗长的if-else或switch语句管理多个服务实现? 相信不少Spring Boot开发者都遇到过这样的场景:需要根据不同条件动态选择不同的服务实现。 如果告诉你可以完全摆脱条件判断,让Spring自动选择合适的实现——只需要一个注解,你是否感兴趣? 本文将详细介绍这种优雅的…...

MySQL技术内幕1:内容介绍+MySQL编译使用介绍

文章目录 1.整体内容介绍2.下载编译流程2.1 安装编译工具和依赖库2.2 下载编译 3.配置MySQL3.1 数据库初始化3.2 编辑配置文件3.3 启动停止MySQL3.4 登录并修改密码 1.整体内容介绍 MySQL技术系列文章将从MySQL下载编译&#xff0c;使用到MySQL各组件使用原理源码分析&#xf…...