性能测试:系统架构性能优化思路

今天谈下业务系统性能问题分析诊断和性能优化方面的内容。这篇文章重点还是谈已经上线的业务系统后续出现性能问题后的问题诊断和优化重点。

系统性能问题分析流程

图片

我们首先来分析下如果一个业务系统上线前没有性能问题,而在上线后出现了比较严重的性能问题,那么实际上潜在的场景主要来自于以下几个方面。

业务出现大并发的访问,导致出现性能瓶颈
上线后的系统数据库数据日积月累,数据量增加后出现性能瓶颈
其它关键环境改变,比如我们常说的网络带宽影响
正是由于这个原因,当我们发现性能问题的时候,首先就需要判断是单用户非并发状态下本身就有性能问题,还是说在并发状态才存在性能问题。对于单用户性能问题往往比较容易测试和验证,对于并发性能问题我们可以在测试环境进行加压测试和验证,以判断并发下的性能。

如果是单用户本身就存在性能问题,那么大部分问题都出在程序代码和SQL需要进一步优化上面。如果是并发性能问题,我们就需要进一步分析数据库和中间件本身的状态,看是否需要对中间件进行性能调优。

在加压测试过程中,我们还需要对CPU,内存和JVM进行监控,观察是否存在类似内存泄漏无法释放等情况,即并发下性能问题本身也可能是代码本身原因导致性能异常。

性能问题影响因素分析

图片

对于性能问题影响因素,简单来说包括了硬件环境,软件运行环境和软件程序三个方面的主要内容。下面分别再展开说明下。

硬件环境

硬件环境就是我们常说的计算,存储和网络资源。

对于服务器的计算能力,一般来说厂家都会提供TPMC参数作为一个参考数据,但是我们实际看到相同TPMC能力下的X86服务器能力仍然低于小型机的能力。

除了服务器的计算能力参数,另外一个重点就是我们说的存储设备,影响到存储的重点又是IO读写性能问题。有时候我们监控发现CPU和内存居高不下,而真正的瓶颈通过分析反而发现是由于IO瓶颈导致,由于读写性能跟不上,导致大量数据无法快速持久化并释放内存资源。

图片

比如在Linux环境下,本身也提供了性能监控工具方便进行性能分析。比如常用的iostat,ps,sar,top,vmstat等,这些工具可以对CPU,内存,JVM,磁盘IO等进行性能监控和分析,以发现真正的性能问题在哪里。

比如我们常说的内存使用率持续告警,你就必须发现是高并发调用导致,还是JVM内存泄漏导致,还是本身由于磁盘IO瓶颈导致。

对于CPU,内存,磁盘IO性能监控和分析的一个思路可以参考:

图片

运行环境-数据库和应用中间件

数据库和应用中间件性能调优是另外一个经常出现性能问题的地方。

数据库性能调优

拿Oracle数据库来说,影响数据库性能的因素包括:系统、数据库、网络。数据库的优化包括:优化数据库磁盘I/O、优化回滚段、优化Rrdo日志、优化系统全局区、优化数据库对象。

图片

要调整首先就需要对数据库性能进行监控

我们可以在init.ora参数文件中设置TIMED_STATISTICS=TRUE 和在你的会话层设置ALTER SESSION SET STATISTICS=TRUE 。运行svrmgrl 用 connect internal 注册,在你的应用系统正常活动期间,运行utlbstat.sql 开始统计系统活动,达到一定的时间后,执行utlestat.sql 停止统计。统计结果将产生在report.txt 文件中。

数据库性能优化应该是一个持续性的工作,一个方面是本身的性能和参数巡检,另外一个方面就是DBA也会经常提取最占用内存的低效SQL语句给开发人员进一步分析,同时也会从数据库本身的以下告警KPI指标中发现问题。

比如我们可能会发现Oracle数据库出现内存使用率高的告警,而通过检查会发现是产生了大量的Redo日志导致,那么我们就需要从程序上进一步分析为何会产生如此多的回滚。

应用中间件性能分析和调优

应用中间件容器即我们常说的Weblogic, Tomcat等应用中间件容器或Web容器。应用中间件调优一个方面是本身的配置参数优化设置,一个方面就是JVM内存启动参数调优。

对于应用中间件本身的参数设置,主要包括了JVM启动参数设置,线程池设置,连接数的最小最大值设置等。如果是集群环境,还涉及到集群相关的配置调优。

对于JVM启动参数调优,往往也是应用中间件调优的一个关键点,但是一般JVM参数调优会结合应用程序一起进行分析。

图片

比如我们常见的JVM堆内存溢出,如果程序代码没有内存泄漏问题的话,我就需要考虑调整JVM启动时候堆内存设置。在32位操作系统下只能够设置到4G,但是在64位操作系统下已经可以设置到8G甚至更大的值。
其中JVM启动的主要控制参数说明如下:

-Xmx  #设置最大堆空间
-Xms  #设置最小堆空间
-XX:MaxNewSize #设置最大新生代空间
-XX:NewSize    #设置最小新生代空间
-XX:MaxPermSize  #设置最大永久代空间(注:新内存模型已经替换为Metaspace)
-XX:PermSize     #设置最小永久代空间(注:新内存模型已经替换为Metaspace)
-Xss   #设置每个线程的堆栈大小

那么这些值究竟设置多大合适,具体来讲:

在这里插入图片描述

Java整个堆大小设置,Xmx 和 Xms设置为老年代存活对象的3-4倍,即FullGC之后的老年代内存占用的3-4倍。永久代 PermSize和MaxPermSize设置为老年代存活对象的1.2-1.5倍。

年轻代Xmn的设置为老年代存活对象的1-1.5倍。

老年代的内存大小设置为老年代存活对象的2-3倍。

注意在新的JVM内存模型下已经没有PermSize而是变化为Metaspace,因此需要考虑Heap内存和Metaspace大小的配比,同时还需要考虑相关的垃圾回收机制是采用哪种类型等。

对于JVM内存溢出问题,我前面写过一篇专门的分析文章可以参考。

从表象到根源-一个软件系统JVM内存溢出问题分析解决全过程

在这里插入图片描述

软件程序性能问题分析

在这里首先要强调的一点就是,当我们发现性能问题后首先想到的就是扩展资源,但是大部分的性能问题本身并不是资源能力不够导致,而是我们程序实现上出现明显缺陷。

比如我们经常看到的大量循环创建连接,资源使用了不释放,SQL语句低效执行等。

为了解决这些性能问题,最好的方法仍然是在事前控制。其中包括了事前的代码静态检查工具的使用,也包括了开发团队对代码进行的Code Review来发现性能问题。

所有已知的问题都必须形成开发团队的开发规范要求,避免重复再犯。

业务系统性能问题扩展思考
对于业务系统的性能优化,除了上面谈到的标准分析流程和分析要素外,再谈下其它一些性能问题引发的关键思考。

上线前的性能测试是否有用?

有时候大家可能觉得奇怪,为何我们系统上线前都做了性能测试,为何上线后还是会出现系统性能问题。那么我们可以考虑下实际上我们上线前性能测试可能存在的一些无法真实模拟生产环境的地方,具体为:

硬件能否完全模拟真实环境?最好的性能测试往往是直接在搭建完成的生产环境进行。

数据量能否模拟实际场景?真实场景往往是多个业务表都已经存在大数据量的积累而非空表。

并发能否模拟真实场景?一个是需要录制复合业务场景,一个是需要多台压测机。

而实际上我们在做性能测试的时候以上几个点都很难真正做到,因此要想完全模拟出生产真实环境是相当困难的,这也导致了很多性能问题是在真正上线后才发现。

系统本身水平弹性扩展是否完全解决性能问题?

第二个点也是我们经常谈的比较多的点,就是我们的业务系统在进行架构设计的时候,特别是面对非功能性需求,我们都会谈到系统本身的数据库,中间件都采用了集群技术,能够做到弹性水平扩展。那么这种弹性水平扩展能力是否又真正解决了性能问题?

实际上我们看到对于数据库往往很难真正做到无限的弹性水平扩展,即使对于Oracle RAC集群往往也是最多扩展到单点的2到3倍性能。对于应用集群往往可以做到弹性水平扩展,当前技术也比较成熟。

当中间件能够做到完全弹性扩展的时候,实际上仍然可能存在性能问题,即随着我们系统的运行和业务数据量的不断积累增值。实际上你可以看到往往非并发状态下的单用户访问本身就很慢,而不是说并发上来后慢。因此也是我们常说的要给点,即:

单点访问性能正常的时候可以扩展集群来应对大并发状态下的同时访问
单点访问本身性能就有问题的时候,要优先优化单节点访问性能

业务系统性能诊断的分类

对于业务系统性能诊断,如果从静态角度我们可以考虑从以下三个方面进行分类

操作系统和存储层面
中间件层面(包括了数据库,应用服务器中间件)
软件层面(包括了数据库SQL和存储过程,逻辑层,前端展现层等)
那么一个业务系统应用功能出现问题了,我们当然也可以从动态层面来看实际一个应用请求从调用开始究竟经过了哪些代码和硬件基础设施,通过分段方法来定位和查询问题。

比如我们常见的就是一个查询功能如果出现问题了,首先就是找到这个查询功能对应的SQL语句在后台查询是否很慢,如果这个SQL本身就慢,那么就要优化优化SQL语句。如果SQL本身快但是查询慢,那就要看下是否是前端性能问题或者集群问题等。

软件代码的问题往往是最不能忽视的一个性能问题点

对于业务系统性能问题,我们经常想到的就是要扩展数据库的硬件性能,比如扩展CPU和内存,扩展集群,但是实际上可以看到很多应用的性能问题并不是硬件性能导致的,而是由于软件代码性能引起的。对于软件代码常见的性能问题我在以往的博客文章里面也谈过到,比较典型的包括了。

循环中初始化大的结构对象,数据库连接等
资源不释放导致的内存泄露等
没有基于场景需求来适度通过缓存等方式提升性能
长周期事务处理耗费资源
处理某一个业务场景或问题的时候,没有选择最优的数据结构或算法
以上都是常见的一些软件代码性能问题点,而这些往往需要通过我们进行Code Review或代码评审的方式才能够发现出来。因此如果要做全面的性能优化,对于软件代码的性能问题排查是必须的。

通过IT资源监控或APM应用工具来发现性能问题

图片

对于性能问题的发现一般有两条路径,一个就是通过我们IT资源的监控,APM的性能监控和预警来提前发现性能问题,一个是通过业务用户在使用过程中的反馈来发现性能问题。

APM应用性能管理主要指对企业的关键业务应用进行监测、优化,提高企业应用的可靠性和质量,保证用户得到良好的服务,降低IT总拥有成本(TCO)。

资源池-》应用层-》业务层

这个可以理解为APM的一个关键点,原有的网管类监控软件更多的是资源和操作系统层面,包括计算和存储资源的使用和利用率情况,网络本身的性能情况等。但是当要分析所有的资源层问题如何对应到具体的应用,对应到具体的业务功能的时候很难。

传统模式下,当出现CPU或内存满负荷的时候,如果要查找到具体是哪个应用,哪个进程或者具体哪个业务功能,哪个sql语句导致的往往并不是容易的事情。在实际的性能问题优化中往往也需要做大量的日志分析和问题定位,最终才可能找到问题点。

比如在我们最近的项目实施中,结合APM和服务链监控,我们可以快速的发现究竟是哪个服务调用出现了性能问题,或者快速的定位出哪个SQL语句有验证的性能问题。这个都可以帮助我们快速的进行性能问题分析和诊断。

资源上承载的是应用,应用本身又包括了数据库和应用中间件容器,同时也包括了前端;在应用之上则是对应到具体的业务功能。因此APM一个核心就是要将资源-》应用-》功能之间进行整合分析和衔接。

而随着DevOps和自动化运维的思路推进,我们更加希望是通过APM等工具主动监控来发现性能问题,对于APM工具最大的好处就是可以进行服务全链路的性能分析,方便我们发现性能问题究竟发生在哪里。比如我们提交一个表单很慢,通过APM分析我们很容易发现究竟是调用哪个业务服务慢,或者是处理哪个SQL语句慢。这样可以极大的提升我们性能问题分析诊断的效率。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sonar对webgoat进行静态扫描

安装sonar并配置 docker安装sonarqube,sonarQube静态代码扫描 - Joson6350 - 博客园 (cnblogs.com) 对webgoat进行sonar扫描 扫描结果 bugs Change this condition so that it does not always evaluate to "false" 意思是这里的else if语句不会执行…

如何训练专属的OCR文字识别模型

1. 背景 在10月24日程序员节,公司决定向每位技术人员发放购物实体卡以示庆祝。然而,手动输入实体卡上的一大串卡密可能是一项繁琐且不那么智能的任务;同时,线上用户在绑定购物卡的时候,同样也是需要手动输入。 基于以…

城市易涝点监测,内涝积水监测仪的作用

近些年城市内涝问题格外突出,市民心中总在担心是不是哪一天自己的家园因为内涝,从而短时间内无法正常生活。并且内涝过后的淤泥可能堆积到路边或者居民住宅区等地,这会影响城市生态环境和公共卫生。 内涝积水监测仪为解决城市内涝问题提供了更…

专业远程控制如何塑造安全体系?向日葵“全流程安全闭环”解析

安全是远程控制的重中之重,作为国民级远程控制品牌,向日葵远程控制就极为注重安全远控服务的塑造。近期向日葵发布了以安全和核心的新版“向日葵15”以及同步发布《贝锐向日葵远控安全标准白皮书》(下简称《白皮书》),…

Redis性能压测、监控工具及优化方案

Redis是一款高性能的开源缓存数据库,但是在实际应用中,我们需要对Redis进行性能压测、监控以及优化,以确保其稳定性和高可用性。本文将介绍Redis性能压测、监控工具及优化方案。 01 Redis性能压测 常用的Redis性能压测工具有: …

git的实验:cherry-pick,github对比代码的两种方式

某个commit,比如 c1,,最早是在a分支做的,当被cherry-pick到b分之后,还是一样的revision吗? 实验1:c1被cherry-pick到别的分支后,revision不变对吗?(答案是变…

在矩池云使用安装AgentTuning

AgentTuning 是清华大学和智谱AI共同推出的 AI Agent方案。 AgentTuning可以令LLM具备更强大的泛化能力,而且同时保持其通用语言能力,项目中包含的AgentInstruct 数据集和 AgentLM 模型均已开源。 项目地址:https://github.com/THUDM/Agent…

免费图书教材配套资料:Spark大数据技术与应用(第2版)

《Spark大数据技术与应用(第2版)》课程内容全面介绍了Spark大数据技术的相关知识,内容包含包括Spark概述、Scala基础、Spark编程、Spark编程进阶、Spark SQL结构化数据文件处理、Spark Streaming实时计算框架、Spark GraphX图计算框架、Spark…

OSG文字-HUD显示汉字示例(3)

显示文字是一种非常实用的技术&#xff0c;可以用来把一些重要的文字始终显示在屏幕上。HUD的全称是HeadsUpDisplay&#xff0c;即抬头显示&#xff0c;这种技术最早应用在军事战斗机上。 创建HUD显示的基本步骤如下: <1> 创建一个osg::Camera对象&#xff0c;设置视图、…

接口自动化中cookies的处理技术

一&#xff0c;理论知识 为什么有cookie和session&#xff1f; 因为http协议是一种无状态的协议&#xff0c;即每次服务端接受到客户端的请求时都时一个全新的请求&#xff0c;服务器并不知道客户端的请求记录&#xff0c;session和cookie主要目的就是弥补http的无状态特性 …

shell脚本之循环语句(for、while、untli)

循环语句&#xff1a; 一定要有跳出循环条件 循环条件&#xff1a; 1.已知循环的次数&#xff08;新来十个人&#xff0c;就要新建十个账号 2.未知循环的次数&#xff0c;但是要有跳出循环条件&#xff08;对象生气&#xff0c;要道歉到原谅为止&#xff09; for&#xff…

AI的未来!Salesforce发布2024年全球科技的重要预测

Salesforce领导者处于影响企业的最新趋势、技术和挑战的前线&#xff0c;通过市场分析、客户对话等方面带来专业知识和洞察力。毫无疑问&#xff0c;人工智能是本年度的最热话题&#xff0c;Salesforce关于技术和人工智能的预测值得关注。 生成式AI改变商业未来的方式 01 生…

Centos7安装Cesi(Supervisor集中管理工具)

Background CeSi 是 Supervisor 官方推荐的集中化管理 Supervisor 实例的 Web UI&#xff0c;该工具是用 Python 编写&#xff0c;基于 Flask Web 框架 。Superviosr 自带的 Web UI 不支持跨机器管理Supervisor 进程&#xff0c;功能比较简单&#xff0c;通过 CeSi 可以集中管理…

Android修行手册-POI操作Excel文档

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

利用QRCode.js生成动态二维码页面

文章目录 QRCode.js简介HTML结构JavaScript生成动态二维码拓展功能1. 联系信息二维码2. Wi-Fi网络信息二维码 总结 &#x1f389;利用QRCode.js生成动态二维码页面 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏…

前端数组方法汇总集锦

前言 数组主要使用场景有&#xff1a; 存储和处理数据&#xff1a;数组是一种有序的数据结构&#xff0c;可以用来存储和处理多个相关的数据。在前端开发中&#xff0c;我们经常使用数组来存储和处理列表、表格、选项等数据。 循环和遍历&#xff1a;数组提供了循环和遍历的功能…

循环队列详解!!c 语言版本(两种方法)双向链表和数组法!!

目录 1.什么是循环队列 2.循环队列的实现&#xff08;两种方法&#xff09; 第一种方法 数组法 1.源代码 2.源代码详解&#xff01;&#xff01; 1.创造队列空间和struct变量 2.队列判空 3.队列判满&#xff08;重点&#xff09; 4.队列的元素插入 5.队列的元素删除 …

网络工程师-HCIA网课视频学习(更换策略,这个网课质量不行)

这里是速成的&#xff0c;只积累下&#xff0c;自己未曾学习到的东西。通过书本补充知识点。 视频&#xff1a;hcia17-链路聚合_哔哩哔哩_bilibili hcia16-路由高级特性&#xff1a; hcia17-链路聚合&#xff1a; 由于如果根据视频来学习的话&#xff0c;感觉视频的总结并不…

MySQL数据库常见错误及解决方案

“时记数据安全,共享优质资源”,数据库安全是指数据库数据的完整、真实、可靠和可用性。数据库也是一种软件系统,与其他软件系统一样也需要保护,需要采取一定的技术和一定的安全管理策略,保证数据库中的数据不被泄漏、不被破坏、不被修改或删除。本文列举MySQL数据库常见错…

VulnHub DC-9

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…