【NGINX--12】性能调优

1、使用压测工具实现测试自动化

需要使用压测工具实现测试自动化,以确保测试一致性和可重复性。

使用 HTTP 压测工具,例如 Apache Jmeter、Locust、Gatling 或团队标准化的任何测试工具。为压测工具创建配置,对您的 Web 应用做全面测试,包括对服务进行测试。查看从测试中收集的指标,以建立基线。缓慢增加模拟的并发用户数,以模拟典型的生产使用情况并确定改进点。对 NGINX 进行调优并不断重复此流程,直至实现预期性能。
详解
通过使用自动化测试工具来定义测试,可通过一致的测试,构建 NGINX 调优指标。必须能够重复测试并衡量性能优劣以进行科学分析。在对 NGINX 配置进行任何调整之前,先进行测试以建立基线,这样才能衡量配置更改是否实现了性能优化。对每次更改进行衡量,有助于确定性能得以提升的根源。

2、保持客户端长连接

需要增加可在单个客户端连接上发起的请求数以及空闲连接可保持的时长。

使用 keepalive_requests 和 keepalive_timeout 指令,更改可在单个连接上发起的请求数以及空闲连接可保持打开状态的时长。

http {keepalive_requests 320; keepalive_timeout 300s;# ...
}

keepalive_requests 指令默认值为 100,keepalive_timeout 指令默认值为 75 秒。
详解
一般情况下,单个连接上的默认请求数能够满足客户端需求,因为现代浏览器能够为每台服务器(根据 FQDN)打开多个连接。与同一域名的并发开放连接数通常仍限制为小于 10,因此就这一点而言,仍会发生在单个连接上发送多个请求的情况。内容交付网络常用的 HTTP/1.1 创建多个域名指向内容服务器,并以编码的方式轮换所用域名,从而使浏览器打开更多连接。如果前端应用不断轮询后端应用以进行更新,那么这些连接优化可能会很有帮助,因为允许更多请求和保持更长时间的连接可减少需要建立的连接数量。

3、 保持上游长连接

需要保持上游(upstream)服务器长连接,以通过连接复用提高性能。

在 upstream 上下文中使用 keepalive 指令,保持上游服务器连接开放以供复用:

proxy_http_version 1.1; 
proxy_set_header Connection "";
upstream backend { server 10.0.0.42;server 10.0.2.56;keepalive 32;
}

upstream 上下文中的 keepalive 指令会为每个 NGINX worker 进程保持打开状态的连接开启高速缓存。该指令表示每个 worker 进程可保持打开状态的最大空闲连接数。在upstream 代码块上使用的代理模块指令在确保 keepalive 指令正常用于上游服务器连接方面发挥着不可或缺的作用。proxy_http_version 指令指示代理模块使用 HTTP 版本1.1,以允许在单个保持打开状态的连接上连续发送多个请求。proxy_set_header 指令指示代理模块删除默认请求头 close,以允许连接保持打开状态。
详解
需要保持上游服务器长连接,以缩短建立连接所需的时间,并允许 worker 进程直接将请求分发到空闲连接上进行处理。需要注意的是,长连接的数量可以超过 keepalive 指令中指定的连接数量,因为长连接和空闲连接并不等同。keepalive 连接数应尽量少,以允许上游服务器接受其他接入连接。该 NGINX 调优技巧可通过减少连接建立开销,提升服务器性能。

4、 响应缓冲

需要在内存中为上游服务器和客户端之间的响应启用缓冲区,以避免将响应写入临时文件。

调整代理缓冲区设置,以允许 NGINX 将响应内容写入内存缓冲区:

server {proxy_buffering on; proxy_buffer_size 8k; proxy_buffers 8 32k; proxy_busy_buffer_size 64k;# ...
}

proxy_buffering 指令的值可以是 on 或 off,默认是 on。proxy_buffer_size 表示用于读取来自代理服务器的响应首包和响应头的缓冲区大小,默认为 4K 或 8K,具体取决于平台。proxy_buffers 指令包含两个参数:缓冲区数量和缓冲区大小。默认情况下,proxy_buffers 指令被设置为 8 个缓冲区,依据平台不同单个缓冲区容量为 4k 或 8k。proxy_busy_buffer_size 指令限定了繁忙缓冲区的大小,繁忙缓冲区可支持 NGINX 在还未完全读取上游服务响应内容的情况下直接响应客户端。繁忙缓冲区的大小默认为代理缓冲区或正常缓冲区大小的两倍。如果禁用代理缓冲区,那么发生故障时,将无法把请求发送给下一台上游服务器,因为请求内容已由 NGINX 发送。
详解
代理缓冲区能显著提升代理服务性能,具体取决于响应内容的大小。调整缓冲区设置可能会产生不利影响,因此务必要参考响应消息体的平均大小并反复进行全面测试。非必要情况下不要设置过大缓冲区,因为这会占用大量的 NGINX 内存。可以只为已知会返回大型响应消息体的特定位置设置大型缓冲区,从而优化性能。
参考资料
“NGINX proxy_request_buffering 模块配置”

5、访问日志的缓冲

当系统处于高负载状态时,需要启用日志缓冲,以降低 NGINX worker 进程发生阻塞的可能性。

设置访问日志的缓冲区大小和刷新时间:

http {access_log /var/log/nginx/access.log main buffer=32k flush=1m gzip=1;
}

access_log 指令的 buffer 参数表示内存缓冲区的大小,在写入磁盘之前日志数据可保存在内存缓冲区中。access_log 指令的 flush 参数设置在写入磁盘之前,日志可保存在缓冲区中的最长时间。当使用 gzip 时,日志数据在写入日志之前会进行压缩,具有1(最快轻度压缩)到 9(最慢极限压缩)九个压缩级别。
详解
将日志数据缓冲到内存中可能只是一种很小的优化手段。但是,对于存在大量请求的站点和应用来说,这会显著影响磁盘和 CPU 的使用率。当 access_log 指令中包含buffer 参数时,如果日志条目无法再进入缓冲区,日志会直接写入磁盘。如果同时包含flush 参数和 buffer 参数,当缓冲区中的数据超过指定期限时,日志也会写入磁盘。如果跟踪日志,您可能会发现启用缓冲时,延迟可达到 flush 参数指定的时长。

6、操作系统调优

为应对尖峰负载或高流量站点,需要优化操作系统以接受更多连接。

检查 net.core.somaxconn 的内核设置,该参数表示内核可排队等待 NGINX 处理的最大连接数。如果将其设置为大于 512 的值,则需要设置 NGINX 配置中 listen 指令的 backlog 参数以进行匹配。当需要检查此内核设置时,内核日志会给予明确提示。NGINX 会非常快速地处理连接,因此对于大多数用例,无需更改此设置。

通常更需要调大可打开文件描述符(open file descriptor)上限。在 Linux 中会为每个连接打开一个文件句柄;因此,如果将 NGINX 用作代理或负载均衡器,由于需要与上游服务建立连接,NGINX 可能会为每个连接打开两个文件句柄。为了满足大量连接需求,可能需要使用内核选项 sys.fs.file_max 调大系统的文件描述符上限;而对于系统用户,NGINX 就按照 /etc/security/limits.conf 文件中的配置运行。此外,可能还需要更改 worker_connections 和 worker_rlimit_nofile 的值。它们都是 NGINX 配置中的指令。

开启更多临时端口以支持更多连接。当 NGINX 充当反向代理或负载均衡器时,每个上游连接都会为响应流量打开一个临时端口。根据系统配置,服务器可能不会将所有临时端口都打开。如要确认打开端口的数量,请查看内核设置 net.ipv4.ip_local_port_range 的设置。该设置表示所能使用的临时端口范围。通常将此内核设置设为从 1024 到 65535。1024 是 TCP 注册端口结束的位置,65535 是动态或临时端口结束的位置。请记住,下限应高于最高的开放侦听服务端口号。
详解
当为了满足大量连接需求而开始调优时,应首先优化操作系统。可以根据特定用例,对内核进行多方面的优化。但是,内核调优不应只是一时兴起,而是应根据其性能表现来衡量更改,以确保 更改有所帮助。如前所述,可以根据内核日志中记录的消息来确定何时开始优化内核,或者当 NGINX 在错误日志中给予明确提示时,开始优化内核。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】static 和 extern 的理解和应用。

对于 C 语言的初学者,对 static 和 extern 的理解可能会遇到一些问题。 用在哪? 首先明确 static 和 extern 可以用在哪? static 和 extern 都可以用来修饰【变量】和【函数】。ok,知道这么多就行了,所谓实践出真知&…

【Unity动画】为一个动画片段添加事件Events

动画不管播放到那一帧,我们都可以在这里“埋伏”一个事件(调用一个函数并且给函数传递一个参数,参数在外部设置,甚至传递一个物体)! 嗨,亲爱的Unity小伙伴们!你是否曾想过为你的动画…

常用性能工具与性能分析

iperf3 iperf3是一个用于测量网络带宽和性能的工具。它支持客户端-服务器模式,通过在客户端和服务器之间进行数据传输来评估网络的吞吐量、延迟和丢包率等指标。 iperf3的基本使用方法: 1. 安装iperf3: 首先,你需要在客户端和…

WPF halcon 机器视觉

1 鼹鼠的故事第14集 鼹鼠与智能房 鼹鼠无意中坐进了一辆小汽车,小汽车开进了一所智能住宅。鼹鼠看到房主在智能房里,享受着现代化的服务。趁着主人看电视的时候,鼹鼠也享用了一顿丰盛的智能晚餐。 小编大胆的畅想,这些食物 前一秒…

创建conan包-打包现有二进制文件

创建conan包-打包现有二进制文件 1 Packaging Existing Binaries1.1 Packaging Pre-built Binaries1.2 Downloading and Packaging Pre-built Binaries 本文是基于对conan官方文档Packaging Existing Binaries翻译而来, 更详细的信息可以去查阅conan官方文档。 1 P…

Ubuntu开机出现Welcome to emergency mode解决办法

问题描述 笔记本电脑安装了windows 10和ubuntu 16.04双系统,windows系统关机时按电源键强制关机,再次开机进入Ubuntu系统时无法进入图形界面,出现Welcome to emergency mode。 问题分析 异常关机导致文件系统受损,依据提示使用…

上传文件获得下载链接方法:直链!直链!

!非 百度网盘 不是直接用网盘下载,要用直链,百度上有很多方法。 我自己研究了个,跳过百度网盘输密码进网页的方法 还是先还是要把文件上传网盘让后搜索网盘获取直链的方法(那百度网盘举例) 地址 https:…

数据结构:字典树(前缀树,Trie树),压缩字典树(Radix)

字典树Trie Tree 字典树也称前缀树,Trie树。在 Elasticsearch 的倒排索引中用的也是 Trie 树。是一种针对字符串进行维护的数据结构。 字典树是对词典的一种存储方式,这个词典中的每个“单词”就是从根节点出发一直到某一个目标节点的路径,…

<JavaEE> 多线程编程中的“等待和通知机制”:wait 和 notify 方法

目录 一、等待和通知机制的概念 二、wait() 方法 2.1 wait() 方法的使用 2.2 超时等待 2.3 异常唤醒 2.4 唤醒等待的方法 三、notify() 方法 四、notifyAll() 方法 五、wait 和 sleep 的对比 一、等待和通知机制的概念 1)什么是等待和通知机制&#xff1f…

EM32DX-E4【C#】

1外观: ecat总线,分布式io 2电源: 靠近SW拨码:24V 中间:0V 靠近面板:PE接地 3DI: 6000H DI输入寄存器 16-bit (16位输入) 00H U8 子索引总数 01H Unsigned16 IN1…

事务管理 springboot

事务是一组操作的集合 它是一个不可分割的工作单位 这些操作 要么同时成功要么同时失败 Spring事务管理 #Spring事务管理日志 logging: level: org.springframework.jdbc.support.JdbcTransactionManager: debug

【深度学习】回归模型相关重要知识点总结

回归分析为许多机器学习算法提供了坚实的基础。在这篇文章中,我们将总结 10 个重要的回归问题和5个重要的回归问题的评价指标。 一、线性回归的假设是什么 线性回归有四个假设: 线性:自变量(x)和因变量(y&…

JWT 认证机制

1. Session 认证的局限性 Session 认证机制需要配合 Cookie 才能实现。由于 Cookie 默认不支持跨域访问,所以,当涉及到前端跨域请求后端按口的时候,需要做很多额外的配置,才能实现跨域 Session 认证。 注意: 1&#xf…

CoreDNS实战(一)-构建高性能、插件化的DNS服务器

1 概述 在企业高可用DNS架构部署方案中我们使用的是传统老牌DNS软件Bind, 但是现在不少企业内部流行容器化部署,所以也可以将Bind替换为 CoreDNS ,由于 CoreDNS 是 Kubernetes 的一个重要组件,稳定性不必担心,于此同时还可将K8S集…

linux系统中安装nginx到指定目录

linux系统中安装nginx到指定目录 下载要求版本的nginx源码包 上传并解压nginx源码包 # 在/opt/app目录下创建nginx解压安装目录 cd /opt/app mkdir nginx# 切换到解压目录下 cd /opt/app/nginx# 解压 tar -zxvf nginx-1.24.0.tar.gz编译安装 # 在/opt/app/nginx路径下&…

智能优化算法应用:基于社会群体算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于社会群体算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于社会群体算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.社会群体算法4.实验参数设定5.算法结果6.参考…

【unity3D】unity中如何查找和获取游戏物体

💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的学习笔记 🈶本篇是unity中游戏物体的查找与获取 这里写自定义目录标题 获取当前物体的基本属性查找其它物体- 通过名称查找其它物体- 通过标签查找- 通过类…

PostgreSQL 连接更新操作

假设有两个表,table_a 和 table_b,它们有一个共同的列 common_column,我们想要通过连接这两个表并根据某些条件更新 table_a 的列。 -- 创建表 table_a CREATE TABLE table_a (id SERIAL PRIMARY KEY,common_column INT,data_a VARCHAR(255)…

使用UART和USART在STM32上进行双向通信

在本文中,我们将深入了解如何在STM32上使用UART(通用异步收发传输器)和USART(通用同步异步收发传输器)实现双向通信。UART和USART是常见的串口通信协议,通常用于与其他设备进行数据传输。我们将重点介绍如何…

基于PaddleSeg开发的人像抠图web api接口

前言 基于PaddleSeg开发的人像抠图web api接口,提取官方代码,适配各种系统,通过api的接口进行访问。 环境要求 1、Python3.7以上 2、源码(文章最后下载) 源码结构 测试module.py中添加如下代码: if __na…