Web网站性能压测实践 | 数据平台

news2024/11/25 11:42:10

一、 为什么要做压测?

首先解释下为什么要做性能压测:根据 Amazon 统计,每慢 100 毫秒,交易额下降 1%。这个统计数据为大家敲响了警钟,也客观说明了性能压测对于企业应用的重要性。从具体的OKR上讲,我们希望能将单机 QPS 提升至 600 ,使得目前线上机器并发能力提升 1 倍。

那么问题来了: 什么是QPS?目前服务器单机QPS是多少?如何才能将单机的QPS提升到600?如何找出系统的瓶颈?

要解决上述问题,就要利用我们本文要讲的压测,如果你还不了解压测,不妨仔细阅读本文

二、 什么是压力测试?

1. 基本概念

一般来说「性能测试」包括压力测试、负载测试、容量测试三种主要测试类型

b4026ebd6b71053e45689f6082de88e6.png

这里我们主要聚焦压力测试,压力测试是通过不断向被测系统施加压力,测试系统在压力情况下的性能表现。主要考察当前软硬件环境下系统所能承受的最大负荷并帮助开发人员找出系统瓶颈所在。我们可以模拟巨大的流量请求以查看应用程序在峰值使用情况以及服务器状况。

2. 核心指标

核心指标:TPS、QPS、RT、系统CPU利用率、系统内存等

80af0a1133e15e580807a2b6b089f1ab.png 

3. 压测工具

工欲善其事,必先利其器。压测工具有很多,大家可以自行去了解,这里就主要说说我们本次压测使用的工具:wrk。

wrk是一款针对Http协议的基准测试工具,它能够在单机多核 CPU的条件下,使用系统自带的高性能 I/O机制,如 Epoll,Kqueue等,通过多线程和事件模式,对目标机器产生大量的负载。

安装wrk

a55b0dda46941bb3824c65f50ba36636.png

 使用./wrk命令启动

e4b189dc49685829c92b9d1ac3c7f552.png

参数说明:

-c:HTTP连接数,每一个线程处理N = 连接数/线程数

-d:持续时间,3s,3m,3h

-t:总的线程数

-s:脚本,可以是Lua 脚本

-H:增加HTTP header,例如:User-Agent: iphone

-latency:输出时间统计的细节

-timeout:超时时间

三、压测实践

初次接触压测时,探索基线耗费了我们不少时间,这里着重介绍一下我们探索系统基线测试的过程,下图是探索基线的压测流程:

151191fc2455697cf9b86eeba1aa327f.png

1. 压测目标

这一步骤,主要任务是要明确压测目标、压测内容,以下是我们的压测目标。

现状:线上压测数据单机QPS 300,机器 4C8G,机器硬件由 4C8G 升级为 8C16G

优化目标:单机QPS 300提升至 600 ,机器数量不变,并发能力提升 1 倍

压测目标:进行基准测试,通过压测确定系统基线,为后续分析优化提供参考

2、压测准备

一般线上压测要尽可能避开流量高峰期,大多是在凌晨进行线上压测,且压测的过程很有可能将服务压挂,我们不可能直接在线上进行压测,因此需要搭建一套供压测使用的仿真环境

为了保障正确定位系统基线,准确定位线上系统瓶颈,对仿真环境提出了很高的要求,有条件的要保证仿真和线上配置一致。次之也要和线上成比例,方便后续分析评估计算。

以我们本次压测项目为例(Nuxt+Vue+SSR搭建的web网站),在这一步骤我要做以下准备:

  • 准备一套压测环境:搭建压测环境你可能需要申请域名、申请Jenkins构建权限、申请堡垒机权限等

  • 调研并选择压测工具

  • 确定压测参数、准备压测脚本

3、 执行压测--基线测试

基线测试是对整个压测流程的探索阶段,系统性能问题,其排查思路更为复杂一些,耗费了我们不少时间,也踩了一些坑,下面详细梳理了基线测试历程:

(1) 使用内部的压测工具压测第一组数据, 压测参数:4T400C,压测3分钟,压测过程中监控压测数据、CPU、内存、负载等,检测到cpu达到120%左右 ,master分支单机QPS均值611,超过目标QPS值 600(优化目标QPS值达到600),难道master分支已经达到了优化目标?

说明一下,这里我们使用3台机器同时施压, 压测的一个主要目的就是将CPU压到极限,观察cpu极限的情况下QPS值,因此我们使用多台机器同时压测

(2) 分析代码发现压测页面有重定向(重定向到其他网站),部分压力转移到其他网站,压测数据不准确。排除重定向影响,保持参数不变,再次压测,压测结果显示:master分支单机QPS值607,依然超过目标值600

(3) 压测过程中了解到公司内部的压测工具 默认单线程,施压能能力有限,后续采用wrk 压测工具进行压测

(4) 依然对数据的准备性保持怀疑,再次排查发现:仿真环境服务器(24核)与线上服务器(4核)相差较大 ,导致仿真环境与线上环境 压测数据相差较大,不利于评估计算

下图仿真环境服务器(24核)情况截图:

4c6fba98974046ded9bb6140b66a78b0.png

(5) 为了更加真实的模拟线上环境,搭建一套仿真环境(服务器4核),仿真环境服务器截图如下:

be78cef7dc8714e1e1db7b8235b7293e.png

(6) 我们发现,压测过程中CPU使用率在120左右,也会造成QPS值偏大,更加合理的压测,应该是控制CPU使用率在100%左右

(7) 为了更加准备找到基线,我们保持压测参数同线上一致(服务器:4C8G,压测参数:16T1000C,压测3分钟),使用wrk压测工具分别在服务器端、本机进行压测,服务器端压测结果:QPS :337

c9081e98a1ba582b43b3c98befbd1c13.png

两人同时本机使用wrk压测:QPS:(89163+112449)/180 =1120 对比发现两组QPS:服务端337,本地:1120,数据相差太大

怀疑可能由于本机施压不够,导致本机压测QPS值过大,放弃本机压测,开始在服务器进行压测,保持压测参数不变(服务器:4C8G,压测参数:16T1000C,压测3分钟 ),压测结果如下,你会发现几乎90%的请求都超时了,超时严重,这个时候要逐步降低施压,直到基本不会超时

792a80e7f231dc409537ba820fb543fc.png

(8) 经过以上步骤,最后确定:压测服务器:4C8G,压测参数:4T200C,

分别压测nuxt空项目(对照组)、master分支(现状)、优化分支(优化组),分析三组数据得出基线

假设你得到一下数据:

ac7c5158e497aba2b01c333a031abefc.png

分析数据,得到以下三个重要指标:

  • nuxt 空项目 :QPS 1000 ,这是优化极限目标

  • master分支 :QPS 300,是优化的基线

  • 优化分支与master分支的QPS差值是100,优化的预计收益就是100 QPS

总结一些压测过程中注意观察的点:

  • 服务器资源监控cpu、内存、 I/O

  • 响应是否变慢

  • 是否有报错

  • 请求超时问题

  • 是否正常返回200状态码

  • 服务器是否正常响应

四、 分析瓶颈&性能优化

将分析系统瓶颈,并针对瓶颈进行优化的过程抽象为四个主要步骤:

简要流程如下图所示:

9f7bbe0f7119c1f595c620dddc189188.png

结合本次压测实战,来说说这4个步骤我们要做了些什么

1. 准备阶段:

在这一阶段主要任务是了解瓶颈的大概方向,对性能问题进行粗略评估。我们采用注释代码的方法法探测系统瓶颈,主要方法是,逐步注释影响系统性能的模块,记录注释后的压测结果,对比压测数据,分析影响QPS关键因素,这一步,我们粗略估算Vue-Router是提升QPS的瓶颈

2. 分析阶段:

主要任务是通过各种工具或手段,初步定位性能瓶颈点,明确优化目标,我们使用了Node性能分析工具node-clinic ,分析Node 方向,node-clinic火焰图如下:白色部分表示CPU密集计算,直接影响 QPS,判定这里是瓶颈

bd329ddd948a4eddaf728ad334bf96d1.png

3. 调优阶段:

主要任务是根据定位到的瓶颈点,进行应用性能调优,分析明确vue-router瓶颈之后,针对瓶颈,我们将系统使用nuxt自动生成路由,优化为自定义路由配置,同时我们对QPS有提升的其他优化点做了优化

  • 自定义路由配置

  • 首屏页面 使用服务端渲染(ssr)

  • 全局组件、样式、方法 的拆分

  • nuxt.config.js 移除 serverMiddleware 配置

4. 验证阶段:

让调优过的应用进行压测,与准备阶段的各项指标进行对比,观测其是否符合预期,如果瓶颈点没有消除或者性能指标不符合预期,则重复步骤2和3。

五、 迭代上线 &后续优化计划

当压力测试的结果符合了预期的调优目标,或者与基线数据相比,有很大的改善,则我们进行迭代开发上线。

性能优化是一个渐进、迭代的过程,上线后,需要对调优后的系统进行测试验证,保持环境一致,通过压测,对比优化上线前后性能的变化,是否符合预期结果

一个阶段的优化工作完成以后,最好是总结反思一下:

  • 本次优化是否达到了目标?

  • 系统的整体性能是否得到了改善?

  • 用户体验是否得到了提升?

  • 优化遗留问题如何解决?

  • 以及如何在接下来的开发工作中做的更好?

六、 反思总结:

  • 选择合适的性能优化工具,可以使得性能优化取得事半功倍的效果;

  • 压测过程中注意控制单一变量,每次改变一个变量,引入多个变量会给我们的观测、优化过程造成干扰

  • 压测结束之后,会将压测过程中的系统表现、监控数据等整理,进行压测复盘,分析当前系统瓶颈、后续改进修复计划及下一轮压测时间等,

  • 性能优化是一个渐进、迭代的过程,需要逐步、动态地持续进行

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

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

相关文章

常见排序算法-Python实现

python 排序 算法 1.二分法 ​ python 32行 #codingutf-8 def binary_search(input_array, value): """Your code goes here.""" length len(input_array) left 0 right length-1 if length 1: return 0 if value input_value[0] els…

Linux 多线程并发Socket服务端的实现( 11 ) -【Linux通信架构系列 】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everythi…

3秒快速打开 jupyter notebook

利用 bat 脚本,实现一键打开 minconda 特点: 1、可指定 python 环境 2、可指定 jupyter 目录 一、配置环境 minconda 可以搭建不同的 python 环境,所以我们需要找到 minconda 安装目录,把对应目录添加到电脑环境 PATH 中&#…

prepros.crack.7.8.5 by Xacker

您友好的 Web 开发伙伴 Prepros 编译您的文件,转译您的 JavaScript,重新加载您的浏览器,并使开发和测试您的网站变得非常容易,这样您就可以专注于使它们完美。 适用于 Windows、macOS 和 Linux 试用版包括所有 Prepros 功能。 编…

【数据结构】树状数组和线段树

树状数组和线段树 下文为自己的题解总结,参考其他题解写成,取其精华,做以笔记,如有描述不清楚或者错误麻烦指正,不胜感激,不喜勿喷! 树状数组 需求: 能够快速计算区间和保证在修改…

了解 MySQL 中 MVCC 的原理

点击上方↑“追梦 Java”关注,一起追梦! 要解决读一致性的问题,保证一个事务中前后两次读取数据结果一致,还有一种 MVCC 的方式,又叫多版本的并发控制(Multi Version Concurrency Control)。 MV…

Flink状态的理解

Flink是一个带状态的数据处理系统;系统在处理数据的过程中,各算子所记录的状态会随着数据的处理而不断变化; 1. 状态 所谓状态State,一般指一个具体的 Task 的状态,即线程处理过程中需要保存的历史数据或历史累计数据…

SpringBoot集成Redis的环境部署以及操作Redis

文章目录 Spring Boot 集成Redis1.环境配置 redis连接配置信息不写默认wei6379,数据库为02.操作Redis2.1 代码形式操作Redis2.2 使用注解方式操作Redis Spring Boot 集成Redis 1.环境配置 添加redis依赖 在老项目添加,可以在pom.xml文件直接添加&#…

DAMO-YOLO 论文学习

1. 解决了什么问题? 工业界追求高性能、低延迟的目标检测算法,研究人员于是聚焦于单阶段目标检测,探索高效的网络结构和训练策略。YOLOv5/v6/v7、YOLOX 和 PP-YOLOE 在 COCO 数据集上实现了不错的精度-速度平衡,得到广泛应用&…

超标量处理器寄存器rename

1.相关性介绍 在CPU中,一段程序会被编译成一连串的汇编指令,指令与指令之间可能会具有相关性(dependency)。所谓相关性,即一条指令的执行会依赖于另一条指令的结果,相关性可以分为:① 数据相关性…

el-table树形表格实现复选框多选效果

2023.7.26今天我学习了如何使用树形表格的时候进行复选框的多选效果。 当我们使用树形结构表格需要进行多选功能操作的时候会发现点击全选的时候,只有一级表格数据会被选中,问题如图: 我们需要实现的是点击全选的不管是几级表格数据都可以被…

ElasticSearch之IK分词器安装以及使用介绍

文章目录 一、IK 分词器简介1. 支持细粒度分词:2. 支持多种分词模式:3. 支持自定义词典:4. 支持拼音分词:5. 易于集成和使用: 二、安装步骤1、下载 IK 分词器插件:2、安装 IK 分词器插件:3. 安装…

各种知名游戏的技术分析

介绍一个GitHub,里面包括了市面上的各种游戏的技术分析,包括渲染管线、工作流、技术文章等等,在做某个类型的游戏的时候,可以针对某个游戏去进行技术参考,特别实用。 GitHub - OTFCG/Awesome-Game-Analysis: a compre…

C++设计模式之模板方法、策略模式、观察者模式

面向对象设计模式是”好的面向对象设计“,所谓”好的面向对象设计“指的是可以满足”应对变化,提高复用“的设计。 现代软件设计的特征是”需求的频繁变化“。设计模式的要点是”寻求变化点,然后在变化点处应用设计模式,从而更好地…

力扣天天练--week3-LeetCode75

topic75-9-t443:压缩字符串 题目描述: 给你一个字符数组 chars ,请使用下述算法压缩: 从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 : 如果这一组长度为 1 ,则将字符追加到 s 中。 否则,需…

Spring Boot中整合MyBatis(基于xml方式基于注解实现方式)

一、前提准备 在Spring Boot中整合MyBatis时,你需要导入JDBC(不需要手动添加)和Druid的相关依赖。 JDBC依赖:在Spring Boot中整合MyBatis时,并不需要显式地添加JDBC的包依赖。这是因为,当你添加mybatis-sp…

会捷通云视讯 list 目录文件泄露漏洞

劳动永远是医治精神创伤的良药。 漏洞描述 会捷通云视讯某个文件 list参数 存在目录文件泄露漏洞,攻击者通过漏洞可以获取一些敏感信息 漏洞复现 构造payload访问漏洞url: /him/api/rest/V1.0/system/log/list?filePath../漏洞证明: 文…

Mendix 创客访谈录|综合业务展示大屏应用开发

本期创客 刘书智 西门子工业领域专家 我在西门子工厂自动化工程有限公司工作。一直从事SCADA产品的技术支持工作,已经过去17个年头了。赶上数字化发展的浪潮,不断学习各种IT技术,践行 IT与OT融合,希望借助自己的IT知识助力OT的发…

编程实战班--C语言和Python语言实现五子棋游戏的代码

文章目录 下面分别是C语言和Python语言实现五子棋游戏的代码:C语言实现Python语言实现总结 下面分别是C语言和Python语言实现五子棋游戏的代码: C语言实现 在使用C语言实现五子棋游戏时,可以使用SDL2图形库来实现图形界面和图形绘制等功能&…

华为华三思科 交换机基础配置一览

console密码修改 华为 user-interface console 0 authentication-mode password set authentication password cipher XXXXXXXXX华三 line aux 0 authentication-mode password set auth pass simple XXX思科 en configure terminal line console 0 password 123 login忘记…