首页 > 其他分享 >性能问题分析排查的实践方法

性能问题分析排查的实践方法

时间:2023-09-04 10:24:49浏览次数:48  
标签:分析 Nginx 压测 性能 实践 问题 排查 静态

知识星球有同学遇到了一个性能问题,问题表现是这样的:静态资源放在Nginx,资源大概十几M大小,Nginx用docker部署,压测时发现静态资源加载很慢。在群里问该如何排查和分析。

这是很常见的一种性能问题,导致这种现象的原因一般是带宽、内存等资源不足导致的。当然,性能问题分析不能仅凭借猜测和经验去武断的下结论,还是应该用工程的思维去分析排查,最后进行优化验证

这篇文章,结合自己的经验,聊聊性能问题分析和排查在实践中的方法。

 

性能问题分析链

先看下面这张思维导图,是我在工作中遇到性能问题时常用的分析方法,我称之为分析链。

如上图所示,分析链应该是这样的(数据仅供参考):

  • 观察问题表现:测试环境,服务配置2C4G,20-200并发递增,并发达到100,RT飙升,20%错误请求;
  • 寻找证据链路:即找到哪里出现了问题,比如带宽打满、内存使用率100%、大量请求超时报错、出现异常堆栈;
  • 分析问题原因:为什么会出现这些问题?一般分析的时候是自上而下,即脚本-数据-场景-配置-代码-系统架构;
  • 性能优化验证:利用监控和日志,先用排除法快速找到可能的原因(需要丰富的经验打底),然后调试验证猜测。没问题的话修改问题后重新压测验证,并及时观察监控和日志,确认问题得到解决;

 

性能分析实践案例

以文章开头这位同学的问题为例,我们该如何进行分析呢?

首先,这个压测的场景中会加载静态文件,我们常见的静态资源主要有图片或者前端的一些页面;其次资源大小为10+M,那可以假设这个静态资源为图片或者短视频;问题描述中提到了Nginx用docker部署,静态资源挂载在Nginx,那么Nginx的存储资源需要考虑,为什么呢?

在压测过程中,一般都是模拟多个不同用户请求去访问URL的,如果每次请求都返回不同的图片,并发比较高的情况下,服务的IO压力会比较大。

还有一种情况需要考虑,就是压测集群到被测服务之间的网络带宽资源,如果带宽只有100M,那实际的传输效率理论上峰值只有12.5M/S。这种场景下就会出现一个问题:即使并发再高,它实际的TPS可能是<=1的。

很多测试同学在执行性能测试时常犯的错误就是不考虑实际的业务场景和被测服务的配置和网络带宽,无脑模拟高并发请求,这样做既不科学也不合理。

实际上应该考虑具体的业务场景,以及被测服务的配置,然后再设计脚本,比如电商业务常见的秒杀场景,这个时候可以模拟高并发。

在上述问题中,还有两点需要考虑:第一个是将比较大的静态资源挂载于Nginx,而比较合理的技术方案应该是静态资源或者大文件,用专门的文件存储服务,比如图片就可以存储于CND中。

第二点也是容易忽略的一点,为了提高性能,文件最好是先压缩再传输,然后在展示层解压,当然这样做的前提是对图片没有高分辨率要求。

 

网上很多文章介绍了压测工具如何使用,测试数据如何准备以及如何模拟并发的技巧,但是在我看来这些都是手段。

性能测试最重要的环节是性能需求分析阶段,在分析阶段就应该尽可能考虑到被测的业务场景特点,背后的系统架构和技术实现方案是否合理,是否存在潜在的性能瓶颈点。压测,只是验证的手段,而非验证的目的

近几年大家都在提测试左移,除了质量内建和质量门禁,需求阶段的分析评估,以及准备兜底策略,其实是更重要的。

 

标签:分析,Nginx,压测,性能,实践,问题,排查,静态
From: https://www.cnblogs.com/imyalost/p/17676236.html

相关文章

  • 探索 Rust:高性能系统编程语言的魅力与安装指南
    Rust是什么?Rust是一门系统编程语言,旨在提供高性能、并发安全和内存安全的编程环境。它于2010年首次发布,由Mozilla开发,并在开源社区的支持下不断发展壮大。优点内存安全:Rust最重要的特点之一是内存安全。它通过引入所有权(ownership)、借用(borrowing)和生命周期(lifetimes)的概念,允......
  • uniapp项目实践总结(八)自定义加载组件
    有时候一个页面请求接口需要加载很长时间,这时候就需要一个加载页面来告知用户内容正在请求加载中,下面就写一个简单的自定义加载组件。目录准备工作逻辑思路实战演练效果预览准备工作在之前的全局组件目录components下新建一个组件文件夹,命名为q-loading,组件为q-loading......
  • 基于状态模式: 没有实践,再多的理论都是扯淡!!!
    基于状态模式:没有实践的理论都是扯淡!!!定义状态模式是一种面向对象的设计模式,它允许一个对象在其内部状态改变时改变它对应的行为。状态模式的关键在于如何区分事物内部的状态,事物内部状态的改变往往会带来事物的行为的改变。通常我们谈到封装,一般都会优先封装对象的行为(比如,某个函......
  • 高性能网络通信模型——Reactor 和 Proactor
    原来8张图,就能学废Reactor和Proactor(qq.com)高并发编程--Reactor模式与Proactor模式(qq.com)Reactor模型Reactor,翻译为反应器,他是一个被动的感觉,可以理解为接收到客户端事件后,Reactor模型会根据事件类型调用相应的代码进行处理。Reactor模型也叫作Dispatcher模式,底层是......
  • GO语言工程实践课后作业
    项目背景该项目是一个基于Gin框架开发的消息板应用,提供发布话题和回复功能。GinGin是一个基于Go语言的轻量级Web框架,它提供了快速构建高性能Web应用程序的工具和功能。以下是Gin框架的一些特点和使用方法:特点:快速:Gin是一个非常快速的框架,因为它使用了Radix树路由和高......
  • 排序算法性能总结(时间复杂度)
    学习:https://blog.csdn.net/weixin_43207025/article/details/114902065......
  • 【专题】2023AIGC应用与实践展望报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=33544自2022年11月ChatGPT发布以来,其超出预期的“涌现”能力彻底点燃了AIGC赛道。从人力资源角度来看,AIGC相关职位数量明显增加,并且人才对于这些职位的投递也更加积极。阅读原文,获取专题报告合集全文,解锁文末190份AIGC行业相关报告。值得注意的是,A......
  • 【性能测试】JVM自带内存分析工具详解
    一、Jstat使用(重点)Jstat命令是jvm调优非常重要,且非常有效的命令。具体用法如下:1.垃圾回收统计jstat-gcjstat-gc进程id这个命令非常常用,在线上有问题的时候,可以通过这个命令来分析问题。下面我们来测试一下,启动一个项目,然后在终端驶入jstat-gc进程id,得到如下结果上面......
  • 扩容Linux文件系统:从基本原理到实践
    一、引言在Linux系统中,文件系统是存储和组织数据的核心组件。随着应用程序和数据的不断增加,有时候需要扩大文件系统的容量。本文将介绍扩容Linux文件系统的方法和步骤,帮助您轻松应对存储需求。二、准备步骤在进行文件系统扩容之前,需要确保以下事项:了解现有磁盘空间:使用df-h命令查......
  • uniapp项目实践总结(七)编写一个简单的应用页面
    之前自定义了顶部和底部导航栏,那接下来就写一个简单的二级页面,这个是出了导航页面之外经常用到的。目录结构模板样式方法示例结构一个普通页面的结构应该是如下所示:<!--html--><template><viewclass="list">列表内容</view></template><!--js--><scrip......