nginx+php压测及报错优化

测试环境:虚拟机centos7,nginx+php

压测工具:Apipost

访问的php程序中添加sleep()增加程序执行时长,使用Apipost进行压测,根据服务器配置设置一个大概可能触发报错的并发和轮训次数,若无报错逐渐增加并发和次数,同时监测nginx错误日志,触发报错。

1.压测报错:recv( )failed (104: Connection reset by peer) while reading response header from upstream

优化方案:

①关闭selinux,编辑 /etc/selinux/config 文件,将 SELINUX=enforcing 改为 SELINUX=disabled,保存并退出,重启服务器(修改完下面第②条再一块重启吧)使其生效。如果改错了,重启卡在了进度条,参考文档:因为错误关闭Selinux导致CentOS7启动失败(进度条卡死,图形界面加载卡死)-CSDN博客

别问我怎么知道的

②编辑/etc/sysctl.conf文件添加如下配置:

net.core.somaxconn = 65535
net.core.netdev_max_backlog = 1024
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000

什么意思?

看了文章也不是全部理解,所以自己研究,说不定有自己的心得。

③有的文章对该报错说编辑nginx.conf添加或增大buffer大小:

    proxy_buffering on;proxy_buffer_size 4k;proxy_buffers 4 32k;proxy_busy_buffers_size 64k;proxy_temp_file_write_size 64k;

这里的值根据服务器配置和业务量情况进行调整,不过后续测试把这里去掉也不会报104错误,所以仅供参考

做完以上修改后,再次使用Apipost没有再次报104错误了,这里说的是相同或稍微增大压测量的情况,不排除大幅度增加并发请求量仍会出现104报错的可能。

2.压测报错2:upstream time out (110: Connection timed out) while reading response header from upstream

该110报错有时候伴随着上面的104出现,也可能单独出现。

针对该报错进行了如下测试:

### 测试情况1:

Php-fpm配置pm.max_children=50,

nginx配置:

fastcgi_connect_timeout 10;

fastcgi_read_timeout 60;

压测工具Apipost,测试300并发,轮循5次,

Nginx110报错数:579

### 测试情况2:

Php-fpm配置pm.max_children=100,

nginx配置:

fastcgi_connect_timeout 10;

fastcgi_read_timeout 60;

压测工具Apipost,测试300并发,轮循5次,

Nginx110报错数:238

### 测试情况3:

Php-fpm配置pm.max_children=100,

nginx配置:

fastcgi_connect_timeout 30;

fastcgi_read_timeout 60;

压测工具Apipost,测试300并发,轮循5次,

Nginx110报错数:0

这里的请求失败数和错误率不一定是程序报错,下面再讲解,检测nginx报错日志是没有报错的。

测试总结:

(110: Connection timed out)字面意思就是连接超时,通过以上测试大概能理解,出现该报错应该是php-fpm进程已达到最大值且已被占满,并且后续大量请求堆积无法在fastcgi_connect_timeout 设置的时间内抢占到php-fpm进程资源导致的超时报错,所以测试2增大了php进程数,提高了请求的消费能力在一定程度上减少了请求堆积情况,而测试3增大了fastcgi_connect_timeout的值,这就给等待处理的请求更宽裕的时间去连接php-fpm进程,提高了容错能力。这个数值肯定不是越大越好,这会增加这些请求的整个响应周期的时长(错误响应也是响应),长时间处于过长时间的等待连接就已经表明需要提高服务进程数或着提高服务器配置了,同时超长时间的请求响应到用户这里可能早就已经不需要或被丢弃了,同时还占用着本来就已经紧张的服务器资源,可以说是雪上加霜。在服务器资源充足的情况的可以通过增加服务进程来提升请求处理能力,在服务器资源枯竭的情况就应该考虑提升服务器配置,如果提升配置到一定瓶颈仍处理不过来,就需要考虑增加服务器数量了。

3.就Apipost失败请求数问题测试。

在上述测试情况3的条件再次压测:

查看nginx访问日志,发现499响应码:

统计499数量:grep "499" access.log | wc -l

刚好7,对应Apipost失败请求数,

搜索http 499状态码:

应该属于Apipost自己的超时策略,主动切断请求导致的499,被视为失败请求。

结合测试2、测试3也刚好应验了把fastcgi_connect_timeout 扩大,会降低nginx报错,但是会拉长这些请求的整个请求周期的时间,在Apipost可能会因为超时被视为失败请求,而结果是失败率变大。

###校验499触发

将nginx配置fastcgi_read_timeout 120;

Php代码中添加sleep(100);

ApiPost压测缩减为10并发2轮

同时用浏览器访问接口

Apipost只耗时40s结束,全部失败,错误率100%

Nginx访问日志全为499响应码

反观浏览器则等待100s返回正常结果,nginx日志也是200响应码

所以apipost压缩应该是有一定的超时策略的,按上述结果应该每个请求超过20s未响应视为失败。

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

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

相关文章

【数据结构】ArrayList与顺序表

ArrayList与顺序表 1.线性表2.顺序表2.1 接口的实现 3. ArrayList简介4. ArrayList使用4.2 ArrayList常见操作4.3 ArrayList的遍历4.4 ArrayList的扩容机制 5. ArrayList的具体使用5.1 杨辉三角5.2 简单的洗牌算法 6. ArrayList的问题及思考 【本节目标】 线性表顺序表ArrayLis…

GaussDB高智能--智能优化器介绍

书接上文库内AI引擎:模型管理&数据集管理,从模型管理与数据集管理两方面介绍了GaussDB库内AI引擎,本篇将从智能优化器方面解读GaussDB高智能技术。 4 智能优化器 随着数据库与AI技术结合的越来越紧密,相关技术在学术界的数…

GDPU Android移动应用 数据存储

又是学到了数据持久化。 登录界面 题外话:有无动画大佬带带呀,前端移动端可免( •̀ .̫ •́ ),合作可私信哦。 1.用户登陆和“记住我”功能 该内容拥有两个Activity活动视图: (1)LoginActivity&#x…

麒麟性能评估优化

cpu性能 Vmstat输出结果详解如下: r 列表示运行和等待cpu时间片的进程数,这个值如果长期大于系统CPU的个数,说 明CPU不足,需要增加CPU; b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等; us 列显示了用户进程消耗的CPU 时间百分比。us的值比较高时,说明用…

Python基础学习-12匿名函数lambda和map、filter

目录 1、匿名函数: lambda 2、Lambda的参数类型 3、map、 filter 4、本节总结 1、匿名函数: lambda 1)语法: lambda arg1, arg2, …, argN : expression using arg 2) lambda是一个表达式,而不是一个语…

uniapp定义new plus.nativeObj.View实现APP端全局弹窗

为什么要用new plus.nativeObj.View在APP端实现弹窗?因为uni.showModal在APP端太难看了。 AppPopupView弹窗函数参数定义 参数一:弹窗信息(所有属性可不填,会有默认值) 1.title:"", //标题 2.content:"", //内容 3.confirmBoxCo…

Qt读写Usb设备的数据

Qt读写Usb设备的数据 问题:要读取usb设备进行通讯,qt好像没有对应的库支持。解决:libusbwindow下载 :Linux下载: QtUsb 开源的第三方库库里面的函数说明:window版本:Linux中也提供的直接下载测试代码:库下载&#xff1…

opengl 三角形

最后效果&#xff1a; OpenGL version: 4.1 Metal 不知道为啥必须使用VAO 才行。 #include <glad/glad.h> #include <GLFW/glfw3.h>#include <iostream> #include <vector>void framebuffer_size_callback(GLFWwindow *window, int width, int heigh…

【C语言篇】探索 C 语言结构体:从基础语法到数据组织的初体验

我的个人主页 我的专栏&#xff1a;C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 目录 什么是结构体结构体的定义与使用结构体内存布局嵌套结构体与指针结构体数组的操作结构体与函数结构体内存对齐机制位域与结构体的结合动态内存分…

mfc110u.dll是什么意思,mfc110u.dll丢失解决方法大全详解

mfc110u.dll是Microsoft Foundation Classes (MFC)库的一个特定版本&#xff08;版本11.0&#xff09;的Unicode动态链接库文件。MFC是Microsoft为C开发者设计的一个应用程序框架&#xff0c;主要用于简化Windows应用程序的开发工作。这个框架封装了很多Windows API函数&#x…

python代码示例(读取excel文件,自动播放音频)

目录 python 操作excel 表结构 安装第三方库 代码 自动播放音频 介绍 安装第三方库 代码 python 操作excel 表结构 求出100班同学的平均分 安装第三方库 因为这里的表结构是.xlsx文件,需要使用openpyxl库 如果是.xls格式文件,需要使用xlrd库 pip install openpyxl /…

NSSCTF web刷题

1 虽然找到了flag,但是我要怎么去改他的代码,让他直接输出flag呢? (好像是要得到他的json代码,这题不让看) 2 wllm应该就是他的密码,进入许可了 意思是服务器可以执行通过POST的请求方式传入参数为wllm的命令&#xff0c;那这就是典型的命令执行&#xff0c;当然&#xff0c…

springboot项目报错问题总结

springboot循环依赖问题处理 发现问题 Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2024-11-27 21:30:58.695 [f8cd6df4693e404aa607363bbe3dcf00] [main] ERROR o.s.boot.SpringApplication - - App…

简单线性DP

数字三角形--简单线性DP 题目链接&#xff1a;数字三角形 解题代码&#xff1a; import java.io.BufferedReader; import java.io.InputStreamReader;public class Main {static int N510;static int INF (int) -1e9;static String[] q;static int[][]fnew int[N][N];static …

强化学习导论 -章9 基于函数逼近的同轨策略预测

基于函数逼近的同轨策略预测 我们前面已经完成了基于表格的学习任务&#xff0c;基于表格的就是每个s是独立学习的&#xff0c;基本上不考虑泛化的能力&#xff0c;但是也对于每个任务状态学习的非常好。考虑到状态空间越来越大&#xff0c;我们必须考虑到函数逼近的情况。 1…

架构-微服务-服务治理

文章目录 前言一、服务治理介绍1. 什么是服务治理2. 常见的注册中心 二、nacos简介三、nacos实战入门1. 搭建nacos环境2. 将商品微服务注册到nacos3. 将订单微服务注册到nacos 四、实现服务调用的负载均衡1. 什么是负载均衡2. 自定义实现负载均衡3. 基于Ribbon实现负载均衡 五、…

Vue使用Mockjs插件实现模拟数据

官方文档&#xff1a;Mock.js 一.引言 在前端开发过程中&#xff0c;我们经常会遇到后端接口尚未完成&#xff0c;但前端需要进行页面构建和功能测试的情况。这时候&#xff0c;Mockjs就如同救星一般出现了。Mockjs 是一款能够模拟生成随机数据&#xff0c;拦截 Ajax 请求并返…

docker 创建Dockerfile

一、定义 1.用Dockerfile 创建镜像。 2.设置自启动方式二&#xff1a; 3.容器自启动 4.glm4 容器部署案例 二、实现 1.用Dockerfile 创建镜像。 创建空文件夹&#xff1a; mkdir /myfile cd /myfile pwd2.编写Dockerfile FROM pytorch/pytorch:2.1.0-cuda12.1-cudnn8-deve…

基于深度学习的手势识别算法

基于深度学习的手势识别算法 概述算法原理核心逻辑效果演示使用方式参考文献 概述 本文基于论文 [Simple Baselines for Human Pose Estimation and Tracking[1]](ECCV 2018 Open Access Repository (thecvf.com)) 实现手部姿态估计。 手部姿态估计是从图像或视频帧集中找到手…

2024-11-25 二叉树的定义

一、基本概念 1.二叉树是n(n>0)个结点的有限集合: ① 或者为空二叉树&#xff0c;即n0。 ②或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。 特点&#xff1a; ①每个结点至多只有两棵子树。 ②左右子树不能颠倒&am…