热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

性能测试体系测试分析及调优

1引言1.1编写目的本文通过编写性能测试分析及调优相关流程和方法,帮助性能测试人员很快的进行性能测试瓶颈定位及调优。系统的性能是由很多因素决定的,本文不可能将每种瓶颈和调优说的非常

1 引言

1.1 编写目的

本文通过编写性能测试分析及调优相关流程和方法,帮助性能测试人员很快的进行性能测试瓶颈定位及调优。

系统的性能是由很多因素决定的,本文不可能将每种瓶颈和调优说的非常清楚,但是可以指导怎么去分析系统的性能。

1.2 适用对象和范围

适用于使用性能测试进行性能测试项目性能分析及调优依据。

预期读者为测试管理人员、测试实施人员、技术支持人员、项目质量管理人员、项目管理人员等系统技术质量相关人员。

2 性能分析

 

2.1 前提

性能分析的前提是不仅需要性能测试人员有相关的技术知识(例如:操作系统、中间件、数据库、开发等),而且还需要丰富的性能测试监控(请参照:性能测试监控)。

2.2 流程

关键指标是否满足要求,如果不满足,需要确定是哪个地方有问题,一般情况下,服务器端问题可能性比较大,也有可能是客户端问题(这种情况非常小)。

对于服务器端问题,需要定位的是硬件相关指标,例如CPU,Memory, Disk I/O, Network I/O, 如果是某个硬件指标有问题,需要深入的进行分析。

如果硬件指标都没有问题,需要查看中间件相关指标,例如:线程池、连接池、GC等,如果是这些指标问题,需要深入的 分析。

如果中间件相关指标没问题,需要查看数据库相关指标,例如:慢查SQL,命中率,锁、参数设置。

如果以上指标都正常,应用程序的算法、缓冲、缓存、同步或异步可能有问题,需要具体深入的分析。

具体如下图所示:

2.3 可能瓶颈点

 

2.3.1 硬件上的性能瓶颈

一般指的是CPU、内存、磁盘I/O 方面的问题,分为服务器硬件瓶颈、网络瓶颈(对局域网可以不考虑)、服务器操作系统瓶颈(参数配置)、中间件瓶颈(参数配置、数据库、web服务器等)、应用瓶颈(SQL 语句、数据库设计、业务逻辑、算法等)。

2.3.2 中间件上的性能瓶颈

一般指的是应用服务器、web 服务器等应用软件,还包括数据库系统。

例如:中间件weblogic 平台上配置的JDBC连接池的参数设置不合理,造成的瓶颈。

2.3.3 应用程序上的性能瓶颈

一般指的是开发人员新开发出来的应用程序。

例如,程序架构规划不合理,程序本身设计有问题(串行处理、请求的处理线程不够、无缓冲、无缓存、生产者和消费者不协调等),造成系统在大量用户方位时性能低下而造成的瓶颈。

2.3.4 操作系统上的性能瓶颈

一般指的是windows、UNIX、Linux等操作系统。

例如,在进行性能测试,出现物理内存不足时,虚拟内存设置也不合理,虚拟内存的交换效率就会大大降低,从而导致行为的响应时间大大增加,这时认为操作系统上出现性能瓶颈。

2.3.5 网络设备上的性能瓶颈

一般指的是防火墙、动态负载均衡器、交换机等设备。

例如,在动态负载均衡器上设置了动态分发负载的机制,当发现某个应用服务器上的硬件资源已经到达极限时,动态负载均衡器将后续的交易请求发送到其他负载较轻的应用服务器上。在测试时发现,动态负载均衡器没有起到相应的作用,这时可以认为网络瓶颈。

2.4 方法

 

2.4.1 CPU

CPU资源利用率很高的话,需要看CPU消耗User,Sys,Wait那种状态下。

如果CPU User非常高,需要查看消耗在哪个进程,可以用top(linux)命令看出,接着用top –H –p 看哪个线程消耗资源高,如果是java应用,就可以用jstack看出此线程正在执行的堆栈,看资源消耗在哪个方法上,查看源代码就知道问题所在;如果是c++应用,可以用gprof性能工具进行分析。

如果CPU Sys非常高,可以用strace(linux)看系统调用的资源消耗及时间。

如果CPU Wait非常高,考虑磁盘读写了,可以通过减少日志输出、异步或换速度快的硬盘。

2.4.2 Memory

操作系统未了最大化利用内存,一般都设置大量的cache,因此,内存利用率高达99%并不是问题,内存的问题主要看某个进程占用的内存是否非常大以及是否有大量的swap(虚拟内存交换)。

2.4.3 磁盘I/O

磁盘I/O一个最显著的指标是繁忙率,可以通过减少日志输出、异步或换速度快的硬盘。

2.4.4 网络I/O

网络I/O主要考虑传输内容大小,不能超过硬件网络传输的最大值70%,可以通过压缩、减少内容大小、在本地设置缓存以及分多次传输等。

2.4.5 内核参数

内核参数一般都有默认值,这些内核参数默认值对于一般系统没问题,但是对于压力测试来说,可能运行的参数将会超过内核参数,导致系统出现问题,可以用sysctl来查看及修改。

2.4.6 JVM

jvm主要分析GC/FULL GC是否频繁,以及垃圾回收的时间,可以用jstat命令来查看,对于每个代大小以及GC频繁,通过jmap将内存dump,再借助工具HeapAnalyzer来分析哪地方占用的内存较高以及是否有内存泄漏可能。

2.4.7 线程池

如果线程不够用,可以通过参数调整,增加线程;对于线程池中的线程设置比较大的情况,还是不够用可能的原因是:某个线程被阻塞来不及释放,可能在等锁、方法耗时较长、数据库等待时间很长等原因导致,需要进一步分析才能定位。

2.4.8 JDBC连接池

连接池不够用的情况下,可以通过参数进行调整增加;但是对于数据库本身处理很慢的情况下,调整没有多大的效果,需要查看数据库方面以及因代码导致连接未释放的原因。

2.4.9 SQL

SQL效率低下也是导致性能差的一个非常重要的原因,可以通过查看执行计划看SQL慢在哪里,一般情况,SQL效率低下原因主要有:






















































































































































































类别子类表达式或描述原因
索引未建索引 产生全表扫描
 未利用索引substring(card_no,1,4)=′5378′产生全表扫描
  amount/30<1000产生全表扫描
  convert(char(10),date,112)=′19991201′产生全表扫描
  where salary<>3000产生全表扫描
  name like ‘%张’产生全表扫描
  first_name + last_name =’beill cliton’产生全表扫描
  id_no in(′0′,′1′)产生全表扫描
  select id from t where num=@num有参数也会产生全表扫描
 使用效能低的索引oder by 非聚族索引索引性能低
  username=’张三’ and age>20字符串索引低于整形索引
  表中列与空NULL值索引性能低
  尽量不要使用IS NULL或IS NOT NULL索引性能低
数据量所有数据量select *很多列产生大量数据
  select id,name表中有几百万行,产生大量数据
 嵌套查询先不过滤数据,后过滤数据产生大量无用的数据
 关联查询多表进行关联查询,先过滤掉小部分数据,在过滤大部分数据大量关联操作
 大数据量插入一次次插入产生大量日志,消耗资源
锁等待update account set banlance=100 where id=10产生表级锁,将会锁住整个表
 死锁A:update a;update b;B:update b;update a;将会产生死锁
 游标Cursor Open cursor,fetch;close cursor性能很低
 临时表create tmp table 创建临时表产生大量日志
 drop table删除临时表需要显示删除,避免系统表长时间锁定
其他exist 代替 INselect num from a where num in(select num from b)in会逐个判断,exist有一条就结束
 exist 代替select count(*)判断记录是否存在count(*)将累加计算,exist有就结束
 between 代替 INID in(1,2,3)IN逐个判断,between是范围判断
 left outer join 代替Not INselect ID from a where ID not in(select b.Mainid from b)NOT IN逐个判断,效率非常低
 union all 代替unionselect ID from a union select id from b union删除重复的行,可能会在磁盘进行排序而union all只是简单的将结果并在一起
 常用SQL尽量用绑定变量方法insert into A(ID) values(1)直接写SQL每次都要编译,用绑定变量的方法只编译一次,下次就可以用了

3 调优

 

3.1 调优步骤

3.1.1 确定问题



  • 应用程序代码:在通常情况下,很多程序的性能问题都是写出来的,因此对于发现瓶颈的模块,应该首先检查一下代码。



  • 数据库配置:经常引起整个系统运行缓慢,一些诸如大型数据库都是需要DBA进行正确的参数调整才能投产的。



  • 操作系统配置:不合理就可能引起系统瓶颈。



  • 硬件设置:硬盘速度、内存大小等都是容易引起瓶颈的原因,因此这些都是分析的重点。 网络:网络负载过重导致网络冲突和网络延迟。



3.1.2 分析问题

当确定了问题之后,我们要明确这个问题影响的是响应时间吞吐量,还是其他问题?是多数用户还是少数用户遇到了问题?如果是少数用户,这几个用户与其它用户的操作有什么不用?系统资源监控的结果是否正常?CPU的使用是否到达极限?I/O 情况如何?问题是否集中在某一类模块中? 是客户端还是服务器出现问题? 系统硬件配置是否够用?实际负载是否超过了系统的负载能力? 是否未对系统进行优化? 通过这些分析及一些与系统相关的问题,可以对系统瓶颈有更深入的了解,进而分析出真正的原因。

3.1.3 确定调整目标和解决方案

高系统吞吐量,缩短响应时间,更好地支持并发。

3.1.4 测试解决方案

对通过解决方案调优后的系统进行基准测试。(基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试)。

3.1.5 分析调优结果

系统调优是否达到或者超出了预定目标?系统是整体性能得到了改善,还是以系统某部分性能来解决其他问题。调优是否可以结束了。 最后,如果达到了预期目标,调优工作就基本可以结束了。

3.2 调优注意事项



  • 在应用系统的设计开发过程中,应始终把性能放在考虑的范围内。



  • 确定清晰明确的性能目标是关键。



  • 必须保证调优后的程序运行正确。



  • 系统的性能更大程度上取决于良好的设计,调优技巧只是一个辅助手段。



  • 调优过程是迭代渐进的过程,每一次调优的结果都要反馈到后续的代码开发中去。



  • 性能调优不能以牺牲代码的可读性和可维护性为代价



             


推荐阅读
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
  • Nginx简介Nginx(enginex)是一个高性能的HTTP和反向代理服务器,也是一个IMAPPOP3SMTP代理服务器。Nginx是由IgorSysoev为 ... [详细]
  • helm V3版本
    1、引入(1)之前方式部署应用基本过程*编写yaml文件**deployment**Service**Ingress(负载均衡、 ... [详细]
  • 使用 Kubernetes 和 Istio 构建大规模集群带来的挑战和解决方案
    原文地址:https:blog.houzz.comchallenges-and-solutions-in-building-a-large-scale-cluster-with-k ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 云计算安全,主要面临哪些威胁?
    云计算是一种新的计算方式,它依托于互联网,以网络技术、分布式计算为基础,实现按需自服务、快速弹性构建、服务可测量等特点的新一代计算方式。然而,任何以互联网为基础的应用都存在着一定危 ... [详细]
  • 开发笔记:深度探索!Android之OkHttp网络架构源码解析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了深度探索!Android之OkHttp网络架构源码解析相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Lunix历史及如何学习
    1.Lunix是什么1.1Lunix是操作系统还是应用程序Lunix是一套操作系统,它提供了一个完整的操作系统当中最底层的硬件控制与资源管理的完整架构, ... [详细]
  • TLB 缓存延迟刷新漏洞 CVE201818281 解析 ... [详细]
  • 阿里p8用端午节3天假期整理出了Spring Cloud知识点大全,太全了
     前言:今天一觉起来,发现我们开工的日期又延迟了,虽然已经在家办公一个多礼拜了,但是由于家里的环境还是不能有很高的效率。于是干脆就对SpringCloud的一些知识点做了一些整理。 ... [详细]
  • 实战分析SpringBoot整合JSON,面试题附答案
    前言作为同时具备高性能、高可靠和高可扩 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
author-avatar
陈亮跑街向_114
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有