热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

【性能方案】系统性能容量

接到业务方性能测试的需求,需要评估当前系统可以支撑的用户量,在这个性能测试过程中踩了很多坑阶段一:请求比压测由于无法在线上进行测试&#

接到业务方性能测试的需求,需要评估当前系统可以支撑的用户量,在这个性能测试过程中踩了很多坑

阶段一:请求比压测

由于无法在线上进行测试,按照之前的做法,评估线上请求量top20的接口,按照tps的比例在压测环境进行压测
受制于环境和资源,压测环境比如mysql、redis、nginx等的资源无法和线上一致,压测一轮后发现tps远低于理论支撑值,得出的性能数据完全没有参考意义

阶段二:单接口单实例压测

在这个基础上又做了一个不是那么明智的决定,通过单个接口,对于单个实例进行压测来评估系统的容量,而且还验证1个实例、2个实例、4个实例的tps是否倍增,后面当用户量猛增后发现本次测试得出的性能数据即使乘了系数依然打脸打的够疼

阶段三:全链路压测

线上环境比如db隔离影子库等环境都没有具备,无法直接在线上进行测试,而且这些环境的准备时间上来不及,只能在阿里云上搭建一套和线上环境一模一样的环境进行全链路压测
步骤如下:
一、业务架构和调用关系梳理

业务梳理

  1. 梳理业务调用链关系
  2. 依赖的中间件关联(zk、mq、db、ES、redis、nginx等)
  3. 依赖第三方服务(特别是收费服务需要切断)
  4. 画出性能测试拓扑图

二、核心场景及操作

  1. 由于对于压测业务了解不足,需要和功能测试小伙伴一起了解业务场景,梳理出核心场景(本次梳理了10个场景)和操作后,与产品经理一起确认拍板
  2. 这个阶段需要确认不同场景的TPS占比,但是业务埋点中并不能获取该数据,想了一个方式,抓取场景的node接口请求,找出仅在这个场景中请求的接口做为这个场景请求的tps

三、抓取各个场景所有node层接口请求

在这个过程中发现的问题

  1. 在一个场景中单个用户的操作对于单个接口进行重复请求
  2. 没必要的请求比如在不同的业务逻辑情况下前端均对后台发起请求

四、编写脚本

  1. 编写脚本其实并不难,主要是效率的问题,后续需要考虑如何拉取线上流量进行全链路压测,这样可以大大提高当前的效率
  2. 需要将脚本中的变量进行参数化且单数据单线程调通当前脚本

五、构造场景

需要结合场景,通过脚本模拟出对应的并发,比如QPS配比,比如不同数据请求(如班级人数等)
在场景模拟时发现一个问题:
有一个这样场景,比如一个班级1个教师50名学生,需要同时并发教师发送一个答题板,50个学生同时对于这个答题板发送答案,而且同时并发这样的班级100个,固定答题板id在csv配置文件?问题在于答题板学生仅能回答一次
尝试如下方案:

  1. 使用setup线程组的方式,但是setup线程组仅执行一次而且执行结束后再执行其他线程组
  2. 线程组中按照顺序,教师发送答题板,学生ABC…依次针对该答题板进行答题,这样在jmeter中学生是依次对答题板进行答题,并不是真正对并发
  3. 通过计数器+if逻辑判断的方式,当count%50 == 0 时进行教师发送答题板操作,可以实现
  4. 通过jmeter线程id+if逻辑判断的方式,当线程id == 0时进行教师发送答题板操作,可以实现 3和4可以实现场景需求,但是需要注意的是,需要在if逻辑判断后增加集合点,这样所有的请求均等待if判断逻辑执行结束后再执行后续的逻辑

六、数据准备

数据准备主要是三个问题:

  1. 如何构造需要的数据
    测试数据由开发创建并提供对应的csv列表
  2. 如何将数据拆解成对应数量的文件
    目前使用事先写好和定制编写脚本可以快速事先
  3. 如何将相同名称不同内容的文件放到不同的肉鸡
    蓝鲸智云处理文件下发

七、压测调优

调优过程中发现的部分性能问题如下:

  1. SLB跑满导致QPS上不去
  2. coredns实例数太少,dns解析失败
  3. node层长链接导致响应时长过长
  4. nginx实例不足,接口请求出现少量502 Bad Gateway
  5. 每次获取信息都触发获取统计计数,并发请求时存在大量db更新,容易形成锁,需要修改成缓存异步方案 等等问题


推荐阅读
  • 收割机|篇幅_国内最牛逼的笔记,不接受反驳!!
    收割机|篇幅_国内最牛逼的笔记,不接受反驳!! ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • 本文提供了一套实用的方法论,旨在帮助开发者构建能够应对高并发请求且易于扩展的Web服务。内容涵盖了服务器架构、数据库管理、缓存策略以及异步处理等多个方面。 ... [详细]
  • 一面问题:MySQLRedisKafka线程算法mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景&# ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 深入解析MySQL查询优化:特定类型查询的高级策略
    本文详细探讨了MySQL中特定类型查询的优化方法,包括COUNT()查询、关联查询、LIMIT分页及UNION查询的优化技巧,旨在提高数据库查询效率。 ... [详细]
  • 全能终端工具推荐:高效、免费、易用
    介绍一款备受好评的全能型终端工具——MobaXterm,它不仅功能强大,而且完全免费,适合各类用户使用。 ... [详细]
  • SpringCloud电商平台开发指南:实战案例解析
    本文详细介绍了基于SpringCloud构建的电商平台项目,涵盖了从技术选型到项目部署的全流程,旨在帮助开发者快速掌握电商平台的开发技巧。 ... [详细]
  • 本文探讨了随着并发需求的增长,MySQL数据库架构如何从简单的单一实例发展到复杂的分布式系统,以及每一步演进背后的原理和技术解决方案。 ... [详细]
  • 本文深入探讨了Redis中的两种主要持久化方式——RDB(Redis Database)和AOF(Append Only File),并详细解析了两者的实现机制、优缺点以及在实际应用中的选择策略。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 免费获取:全面更新的Linux集群视频教程及配套资源
    本资源包含最新的Linux集群视频教程、详细的教学资料、实用的学习课件、完整的源代码及多种软件开发工具。百度网盘链接:https://pan.baidu.com/s/1roYoSM0jHqa3PrCfaaaqUQ,提取码:41py。关注我们的公众号,获取更多更新的技术教程。 ... [详细]
  • 本文探讨了在支付项目开发中使用SS5 Socket Server实现内部网络访问外部网络的技术方案。详细介绍了SS5的安装、配置及性能测试过程,旨在为面临相同需求的技术人员提供参考。 ... [详细]
author-avatar
北极光的悲伤
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有