怎么做性能测试--响应时间

做性能测试先要懂性能,响应时间(response time)作为性能测试过程中两大重要指标之一是我们必须关注的。

从用户角度来说,用户最讨厌等待。在大量的处理环境中,超过3秒以上的响应时间将会严重影响工作效率。然而最终用户的感受不仅仅是绝对时间问题,他们对于响应时间的期望是参照以往的经验,而这种期望是相对于他们使用该应用的基准性能。如果使用该应用的当前感受和以往的经验有很大的差别时,抱怨以及需要支持的电话就会成倍地增加。响应时间对于用户来说既有客观成分,也有主观成分。


例(1):对于小说网站来说,页面的主要功能是向用户提供可阅读的内容,那么用户很可能会将“小说内容”这个时间作为自己感受到的响应时间;

例(2):对于报税系统来说,页面的主要功能是提供给用户申报纳税的页面,那么用户只有用户打开申报页面,申报纳税成功后,才会觉得页面响应完成。

对于例(1)而言,小说内容完全可以分段加载,先加载500字内容,等待之前500字加载完成之后,再加载之后的内容,当看完一定内容,用户做鼠标滚动或翻页操作时再加载之后的内容。

对于例(2)而言,申报纳税需要等待,服务器处理、数据库处理、外部系统通信、浏览器前端加载等整个流程处理结束之后,才能算作响应成功。

对于例(1)可以将响应时间理解为“应用系统从请求发出开始到客户端收到响应所消耗的时间”。而对于例(2)而言响应时间定义为“应用系统从请求发出开始到客户端接收到最后一个字节数据所消耗的时间”。造成这种差异的原因是可以采用一些技巧在数据尚未完全接收完成时进行呈现来减少用户感受到的响应时间。

下图为Web应用的页面响应时间简要构成。从图中可以看到,页面的服务端响应时间可被分解为网络传输时间(N1+N2+N3+N4)、应用处理时间(T1+T3)、数据库处理时间(T2)和前端浏览器加载时间(T4)。之所以要如此细分响应时间,主要目的是能够更准确地定位性能瓶颈。

  • N1&N4



        这个阶段用户点击页面,利用Http协议建立连接,做get请求或post请求。http连接实际上就是TCP连接和一些使用连接的规则。TCP连接是因特网上的可靠连接。(详细TCP协议知识,详见《TCP 的那些事儿(上)》http://coolshell.cn/articles/11564.html、《TCP 的那些事儿(下)》http://coolshell.cn/articles/11609.html

TCP为Http提供了一条可靠的比特传输管道。从TCP连接一端填入的字节会从另一端以原有的顺序、正确地传送出来。

  • N2&N4

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

        简单地说,JDBC可做三件事:与数据库建立连接、发送操作数据库的语句并处理结果。

数据库建立连接一般通过连接池管理连接,当连接池中某条查询语句执行完成,连接池所获取的连接不会立即释放,而会等待下次查询调用连接。因为建立连接也是极为耗时的操作。

  • T1&T3

java servlet作为线程安全的服务器程序(注:这里所说的线程安全并不能保证开发人员所做的业务代码也是线程安全的),几乎所有的java web程序都是以此为基础发展而来。(当然你也可以自己用java实现一套cgi,至于什么是cgi,详见http://baike.baidu.com/subview/32614/12037322.htm?fr=aladdin

    servlet生命周期

  1. 客户端请求该servlet
  2. 加载servlet类到内存
  3. 实例化、初始化该servlet
  4. init()初始化参数
  5. service()(doGet()或者doPost())
  6. destroy()

加载和实例化Servlet。这项操作一般是动态执行的,在weblogic这类中间件中能够配置servlet并发线程数,同时能监控servlet并发线程数。Server通常会提供一个管理的选项,用于在Server启动时强制装载和初始化特定的Servlet。

Server创建一个Servlet的实例

第一个客户端的请求到达Server

Server调用Servlet的init()方法(可配置为Server创建servlet实例时调用,在web.xml中<servlet>标签下配置<load-on-startup>标签,配置的值为整型,值越小servlet的启动优先级越高)

一个客户端的请求到达Server

Server创建一个请求对象,处理客户端请求

Server创建一个响应对象,响应客户端请求

Server激活Servlet的service()方法,传递请求和响应对象作为参数

service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息

service()方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如doGet()或doPost()或程序员自己开发的新的方法。

对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用init()方法。一般Servlet只初始化一次(只有一个对象),当Server不再需要Servlet时(一般当Server关闭时),Server调用Servlet的Destroy()方法。

  • T2

在执行和获取结果前,数据库系统对此sql将进行几个步骤的处理过程:

当发布一条SQL或PL/SQL命令时,Oracle会自动寻找该命令是否存在于共享池中来决定对当前的语句使用硬解析或软解析。

通常情况下,SQL语句的执行过程如下:

  1. SQL代码的语法(语法的正确性)及语义检查(对象的存在性与权限)。
  2. 将SQL代码的文本进行哈希得到哈希值。
  3. 如果共享池中存在相同的哈希值,则对这个命令进一步判断是否进行软解析,否则到5步骤。
  4. 对于存在相同哈希值的新命令行,其文本将与已存在的命令行的文本逐个进行比较。这些比较包括大小写,字符串是否一致,空格,注释 等,如果一致,则对其进行软解析,转到步骤6。否则到4步骤。红色字体描述有误应该转到步骤5
  5. 硬解析,生成执行计划。
  6. 执行SQL代码,返回结果。

软解析在缓冲区里找到相同或相似的SQL语句,可以直接利用,不用重新进行分析生成执行计划了。硬解析则相反,即整个SQL语句的执行需要完完全全的解析,生成执行计划。而硬解析,生成执行计划需要耗用CPU资源,以及SGA资源。在此不得不提的是对库缓存中闩的使用。闩(latch)是锁的细化,可以理解为是一种轻量级的串行化设备。当进程申请到闩后,则这些闩用于保护共享内存的数在同一时刻不会被两个以上的进程修改。在硬解析时,需要申请闩的使用,而闩的数量在有限的情况下需要等待。大量的闩的使用由此造成需要使用闩的进程排队越频繁,性能则逾低下。

数据库利用内部的hash算法来取得该sql的hash值,然后在library cache里查找是否存在该hash值。假设存在,则将此sql与 cache中的进行比较。假设“相同”,就将利用已有的解析树与执行计划,而省略了优化器的相关工作。这也就是软解析的过程。 (关于执行计划,详见http://www.cnblogs.com/snifferhu/p/3461982.html)

  • T4

前端页面大致包含html、图片、css、js、flash等元素,对于各种元素因为浏览器版本的不同而导致加载顺序不同。对于前端页面加载这块研究并不是很深入,推荐看《Javascript 装载和执行》http://coolshell.cn/articles/9749.html

        总结

在此大致描述了响应时间的概念,以及响应时间的组成,读懂了响应时间,才是性能测试的开始。

时间: 2024-12-19 00:36:30

怎么做性能测试--响应时间的相关文章

如何做性能测试

偶然间看到了阿里中间件Dubbo的性能测试报告,我觉得这份性能测试报告让人觉得做这性能测试的人根本不懂性能测试,我觉得这份报告会把大众带沟里去,所以,想写这篇文章,做一点科普. 首先,这份测试报告里的主要问题如下: 1)用的全是平均值.老实说,平均值是非常不靠谱的. 2)响应时间没有和吞吐量TPS/QPS挂钩.而只是测试了低速率的情况,这是完全错误的. 3)响应时间和吞吐量没有和成功率挂钩. 为什么平均值不靠谱 关于平均值为什么不靠谱,我相信大家读新闻的时候经常可以看到,平均工资,平均房价,平均

看《做性能测试需要知道些什么》

看<做性能测试需要知道些什么>需理解最佳用户数和最大用户数开始性能测试前,需要知道:1.客户的要求 如系统同时满足**用户登录,平均每个用户登录时间不超过**秒2.目前系统的性能 求最大用户数和最佳用户数,系统分析并找到压力点3.系统瓶颈 分析可能对系统造成瓶颈的逻辑业务4.长时间压力下性能状况(强度测试)->内存溢出 测试环境1.硬件 服务器.CPU.内存2.软件 前端.中间件.服务器3.网络环境 寻找系统的压力点 做性能测试之后需要知道些什么->获取"有效的"

想做性能测试不知道怎么选顺手的工具?

原文链接:http://www.51testing.com/html/49/n-3721249.html 前言 当你想做性能测试的时候,你会选择什么样的测试工具呢?是会选择wrk?jmeter?locust?还是loadrunner呢? 今天,笔者将根据自己使用经验,针对jmeter.locust.wrk和loadrunner常用的性能测试工具进行简单介绍和对比.首先,四者基本对比图: 由于loadrunner为商业收费模式,对于公司级测试使用而言涉及到授权问题,因此,本文暂不对loadrunn

sysbench的安装和做性能测试

sysbench的安装和做性能测试 http://imysql.cn/node/312 sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况. 关于这个项目的详细介绍请看:http://sysbench.sourceforge.net. 它主要包括以下几种方式的测试: 1.cpu性能 2.磁盘io性能 3.调度程序性能 4.内存分配及传输速度 5.POSIX线程性能 6.数据库性能(OLTP基准测试) 目前sysbench主要支持 MyS

【转】在做性能测试之前需要知道什么

最近群里来了很多新朋友,大都是新做测试或准备做测试工作的,见好多新来上来就问关于LoadRunner的使用上的问题.对性能测试的理解也不是太清楚.公司说让他们对系统做个性能测试,他们听说LoadRunner是做性能测试的,在网上找了点了LoadRunner的使用说明就开始对系统下刀了.对于一些大公司的专业性能测试人员来说,这个很可笑,但这是种情况是存在的,我当初也到公司时也这么干的. 那时还真把性能测报告给整出来了,现在看来那报告没有任何意义.虽然,虽然对现在的我来说性能测试也只是只懂皮毛.但还

使用Student T&#39;test方法做性能测试

性能测试 日常工作中对比函数间的快慢时,最直接的方法就是根据timer:tc/1结果的时间来衡量,比如想知道lists:reverse/1与直接使用自己写的尾递归函数谁更快?最直接的方法就是 -module(test). -export([start/1]). start(Len) -> L = lists:seq(1, Len), Max = 1000, Time1 = benchmark(Max, fun() -> lists:reverse(L) end), Time2 = benchm

Jmeter工具做性能测试 常见的错误汇总

在Windows机器上用Jmeter做性能测试,汇总下我自身遇到的错误和解决方案 java.net.BindException: Address already in use: JVM_Bind 原因分析:压测服务器问题,由于并发太高,导致自身port不够用,需要调整机器的端口,可用netstat -ano看出来:去掉下面的/c查看详细端口占用 定位: netstat -ano | find "10.215.70.172:443" | find "ESTABLISHED&qu

【转帖】sysbench的安装和做性能测试

iMySQL | 老叶茶馆 sysbench的安装和做性能测试 http://imysql.cn/node/312 我仿照这个学的 但是 需要用更新的版本才可以. By yejr on 14 六月 2007 作/译者:叶金荣(imysql#imysql.com>),来源:http://imysql.com,欢迎转载. sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况.关于这个项目的详细介绍请看:http://sysbench.sour

性能测试-响应时间的百分比指标

先前看过一本书,说到了性能测试者的关键数学原理,充分说明了关于性能测试一些数据的统计和分析,最大力度的获取性能测试的真实指标.对此有也有些自己的感想,尤其是响应时间,和用户切身相关的性能指标,通过百分比指标的分析,性能结果的好坏一目了然. 首先,大家看一组响应时间的数据: 假设,我们执行某个任务,响应时间的需求指标上限为1秒,开发了两种方案:A.B,而且我们也做了相关的执行测试,分别收集了十组响应时间的性能数据.虽然,两组数据平均响应时间都一样,均为1秒,但本质上,差距还是很大的.List A方