软件性能测试的本质

为什么80%的码农都做不了架构师?>>>   hot3.png

  淘宝网每年的双11活动都是对其服务器性能的挑战。因为在这一天所有商品半价,购物的用户量剧增。做为淘宝网的高层更多的关心在线用户数,用户交易量,总交易金额等,做为一名技术人员,我们可能更关心当天系统的吞吐量、每秒钟点击率以及系统资源的消耗情况等,对!这就是系统的性能。那么性能的本质是什么呢?我试抓住一些点来解释。
   基于用户体验的性能测试
   但对于一个用户来说,他可以不关心上面这些(系统的性能参数),大约有一部分的消费者会因为网站过于技术化或者性能问题而选择了离开。换言之,如果你的网站速度太慢客户就会离去。这是所有的互联网用户都熟知的道理。这时你的第一想法不是“哎呀,不知道站点的吞吐量怎样”,而是“简直太慢了!我可没有时间在这里等,到别处去吧”。现在想想,人们离开你的站点是否因为性能问题?所以,在做性能测试的时候除关注吞吐量、点击率这些参数外,我们更需要站在用户的角度来测试实际的性能感受。如果你经过测试声称网站可以承受更多的用户同时访问,但实际的用户体验性非常差,那么做你的性能测试又有什么意义呢? 
   现在市场上有大量的书讨论如何设计良好的性能,还有更多的书把重点放在如何使得站点更加直观、生动和易于炒作上。关于速度的好处也讨论过,但如何真正并优化系统来提高用户体验呢?那就是直接的用户体验测试了。有两点方法可以做一这点。一是可以把站点直接投入到能够进行数据采集和系统调优的生产环境中,并祈祷你的网站不会太慢或崩溃。另一个种明智的选择是模拟真实的用户活动,进行重复的测试和调优,最后再投入到生产环境。 
   “明确”的性能需求 
   当测试人员进行性能测试工作时,真正让他们感到困难的不是测试工具如何使用,也不是如何对测试数据进行分析与系统调优(对于一个经验丰富有性能工程师来说,这真的不难)。让他们感到困惑的是如何得到准确的量化的需求,比如: 
   A.网站可以支撑多少在线用户数 
   B.网站可以支持多少用户同时交易 
   C.电子邮件系统每秒种可以处理多少封邮件 
   D.可以支持多少人同时浏览网页 
   类似于这样的数据会出现客户对系统的性能需求中,好吧,有了这些需求,我就开始性能工作了,这些需求真的很明确么? 
   我们来看下面的例子,一个购买汽车的用户想知道: 
   这辆汽车开100公里的耗油是多少升。(对,就是他坐在里面试驾的那辆车) 
   如果你是一个严谨的汽车销售,不会马上会说这辆车每公里的耗油是多少。而是在大脑中快速的列出的汽车驾驶环境: 
   1、车上坐几个人? 
   2、车上带多重的物品? 
   3、路况如何,是高速还是拥挤的市区? 
   4、天气如何,温度如何,要开空调码? 
   5、驾驶时间是白天还是晚上(如果是晚上要开车灯)? 
   6、驾驶习惯是怎样的? 
   你唯一能做的就是继续向客户确认更明确的需求,很多时候其实客户也无法给出精确的需求。这个时候你就要多参考常规的情况下,参考同类产品,或尽量引导用户去明确具体的需求,尽量与客户达到统一的共识。 
   “假设”的测试环境 
   现在是不是觉得性能测试有太多的前置条件,它们或大或小的影响着测试的结果。 
   关于这些前置条件,或者我们称之为假设(assumption),我把一些做法归纳为三个阶段。 
   一:做了假设却不知道自己做了假设
   比如前面提到的那个耗油的问题,有人的做法是我就开100公里看看,得出来是多少就是多少,比如9L。然后就告诉别人这个车的100公里耗油是9L。 
   问题是这样的结果对你是OK,因为你有切身的的体验,知道遇到的状况,可是测试的报告是要给别人,甚至你都无法直接面对或者沟通的人参考。这就会很容易误导别人,即便这不是你的本意,而且你自已也确定你是真实的记录了结果。这里的问题在于你并不清楚自己所做的假设,因为我们一直在做这样的假设。 
   二:做过多的假设
   “当路面平坦,无任何红绿灯,风速5km/h只有一名70kg的乘客,时速稳定在70km/h,良好驾驶习惯,....的情况下,耗油是7.1L/100km。” 
   这样可能很严谨,但是对你的报告的读者而言,这样的数据有多大意义,因为他们没有你这么幸运,有这么良好的环境。 
   三:做必要和合理的假设
   生活有时候是需要一些妥协和折衷,如果这些折衷是必要的和合理的。因为跳出来看,我们的测试需要提供有价值的信息,所以为了这样有价值的信息,做出必要和合理的假设是可以接受的。 
   好吧,也许这不是你想要的答案,但它是我目前给自己的解释和安慰。 
   性能测试环境需要在严格独立监控下管理,尽量保持与真实生产环境的一致性能。 
   “精确”的测试数据
   对于一个严谨的测试员,我们的测试结果的描述也相当精确,如:用户每个用户的访问时间为2.8729秒,10分钟系统处理请求8634个。我以前一直认为,只要我把测试环境描述的很详细,我的测试结果就是精确的。 
   实际上功能测试很容易得到测试结果,而性能测试很难得到精确的量化结果,我买了一辆汽车,开车去上班,去时车的各个功能非常正常,回来的时候车的功能也非常正常。我们通过功能测试很容易得出,这个车的功能没有问题。 
   那么性能测试呢?再来看耗油情况,我去时上耗油3.29升,回来时耗油3.42升,同样的一条路,同样的人开同样的车,那么是不一样的耗油结果?如果我再试一遍,可能情况还会有变化。所以,我们很难得到精确的数据,但是这丝毫不影响我们测试结果的参考价值。 
   “宏观/围观”的性能测试
   这也是一个有趣的对立。在做性能测试,特别是整个产品的性能测试的时候,我们看到的是产品的核心功能和主要的大的功能模块,比如数据库、web服务器、核心的daemon等等。在脑海里,我们有一个架构图,哪怕你没有把它画出来。所以有时候,我们会想,性能测试对于产品的视角是宏观的,看大的组件,而不是具体的细节的东西。果真是如此吗?看看下面的例子: 
   1.把daemon的log级别改为debug(log_level从2改到5)之后,性能下降了差不多一半。 
   2.关掉一个cache选项 
   3.打开keepalive选项 
   4.打开DNS反向查询 
   ..... 
   上面都是些细枝末节的设置,一个配置项而已,藏在DB的某张表或者某个ini里面。但是改变之后,得到的性能结果可能大不相同。这些都是否改变了我们以往的看法。 
   Scott Barber(性能测试方面的专家)在他的一篇文章里讨论了这个话题。 
   “Macro-and Micro-tests,macro strategies and micro-plans,macro-level application usage and micro-level usage implementation details,macro-level result summaries for executives and micro-level test results for developers...it sounds like a day in the life of a performance tester to me.” 
   摘自他为Software Test &Performance杂志写的一个系列文章,叫做Peak Performance,其中的2006年9月的一期,文章名是Macro to Micro And Back Again Macro to Micro And Back Again,嗯,很好的诠释。
   亚里士多德说世上的道理不是被讲一遍两遍而是成千上万遍,是的,因为Weinberg也讲了一遍,就在上面提到的那本书里面。请原谅我再次引用他的话,粉丝嘛。“Although it's necessary to have an overview of the problem,the big picture often turns on one critical detail.” 
   critical detail,对,就是这个term。其实不光是这里说的测试,工作和生活中的很多事情都是一样,不是要不要关心细节,而是它是否critical。 
   那么,怎么区分一个细节是不是critical或者怎样找到critical的detail呢? 
   嗯...,这是个好问题,不过不好意思这个不是这里要讨论的范畴。 
   所以,你还认为性能测试只是学习如何使用性能工具么?它需要一个长期的个技术的积累,我们的路还很长。也许,我讲的不够本质,但性能测试这个领域,看到太多的新手在整天问工具的使用,学会了工具的使用就大言“我会(精通)性能测试!”。太多的公司叫新手的做性能测试,环境神马的也不提供,你找个工具对软件加压一下吧!哎~!这未免是太贬低“软件性能测试”了。


本文选自:http://www.spasvo.com/news/html/20141217174341.html

转载于:https://my.oschina.net/spasvo/blog/357938

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

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

相关文章

AGILE

AGILE CMMI的理解在最佳实践的态度上非常类似自下而上的草根性,相比更侧重完善自身理论的CMMI更具实用性软件工程工具的作用理想和现实,艺术与工业期望与代价,灵活性,易用性CMMI实施为何没有软件工程工具的适用性评估?有没有建议换工具的?它与制造业以SAP这样的工具来做ERP实…

算法整理

1.冒泡排序 $arr array(5,2,6,2,3,1); for($i0;$i<count($arr);$i){ for($jcount($arr);$j>$i;$j--){ if($arr[$i]>$arr[$j-1]){ $b $arr[$i]; $arr[$i] $arr[$j-1]; $arr[$j-1] $b; } } } 2.快速排序&#xff0c; 取一个值&#xff0c;比他大的放一边&#xff0c…

无废话XML--XML约束(DTD)

基本术语一、序言Prolog&#xff1a;包括XML声明(XML Declaration)和文档类型声明(Document Type Declaration)。 二、良构(well-formed 规范的)&#xff1a;符合W3C定义的XML文档。 为什么XML需要验证&#xff1f; 对XML文件施加额外的约束&#xff0c;以便交流。举个…

c# 流,字节数组及字符串之间的转换

//1.流转换为字节数组&#xff0c;fileUpload为.net上传控件Stream stream fileUpload.FileContent;byte[] fileBuffer new byte[stream.Length];stream.Read(fileBuffer,0,(int)stream.Length);//2.字节数组转换为字符串string fileBody System.Text.Encoding.Default.GetS…

mysql周报内容范文_Mysql各种报表查询含实例,日报,周报,月报,时间差自动计算...

public List retrieve(IReport report) {List list new ArrayList();Map map new HashMap();// 设置结束日期if (null ! report.getEndTime()) {map.put(ReportMeta.PROP_ENDTIME, report.getEndTime());// 设置名称if (null ! report.getName()) {map.put(ReportMeta.PROP_N…

路由器01---k2刷Pandora

1.固件 固件(Firmware)就是写入EPROM&#xff08;可擦写可编程只读存储器&#xff09;或EEPROM(电可擦可编程只读存储器)中的程序。 对于独立可操作的电子产品&#xff0c;固件一般指它的操作系统&#xff08;“担任着一个数码产品最基础、最底层工作的软件才可以称之为固件”&…

windows mac 安装lua

mac从源码编译安装是最方便的&#xff0c;lua源码不足两万行&#xff0c;编译几秒钟的事。 打开terminal&#xff0c;依次输入以下命令&#xff1a; curl -R -O http://www.lua.org/ftp/lua-5.2.3.tar.gz tar zxf lua-5.2.3.tar.gz cd lua-5.2.3 make macosx test sudo make in…

python中squeeze函数_详解pytorch中squeeze()和unsqueeze()函数介绍

squeeze的用法主要就是对数据的维度进行压缩或者解压。先看torch.squeeze() 这个函数主要对数据的维度进行压缩&#xff0c;去掉维数为1的的维度&#xff0c;比如是一行或者一列这种&#xff0c;一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成(3)行。squeeze(a)就是…

新闻网大数据实时分析可视化系统项目——7、Kafka分布式集群部署

Kafka是由LinkedIn开发的一个分布式的消息系统&#xff0c;使用Scala编写&#xff0c;它以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark都支持与Kafka集成。 1.下载Kafka并安装 1&#xff09;下载Apache版本的Kafka。 …

关于Excel导入的问题记录

当Excel导入成为需要时&#xff0c;之前的导出Excel为html方式的方法就受阻了&#xff0c;于是&#xff0c;需要开始新的百度与google来解决问题。 前提为OLEDBExcel。 根据需求&#xff0c;多数是对于表的数据的导入。于是产生这么一个需求过程&#xff1a; 1。准备一个空的标…

vux 地图插件_基于vue的移动端组件vux的安装及使用

一、安装<1>. 在项目里安装vuxnpm install vux --save<2>. 安装vux-loader (这个vux文档似乎没介绍&#xff0c;当初没安装结果报了一堆错误)npm install vux-loader --save-dev<3>. 安装less-loader (这个是用以正确编译less源码&#xff0c;否则会出现 Ca…

代码优化

代码优化 并非所有的处理器级优化策略仅限于汇编。即使C这样的高级语言中&#xff0c;也由不少适用的规则。 减少上下文依赖 看如下程序&#xff1a; double list[100]; double sum 0; for (int i 0; i < 100; i) {sum list[i]; } 上面这段代码还可以优化吗&#xff1f;站…

3.3.10 动态SQL

十、动态SQL 根据条件的不同, SQL 语句也会随之动态的改变. MyBatis 中,提供了一组标签用于实现动态 SQL. 1. <if> 用于进行条件判断, test 属性用于指定判断条件. 为了拼接条件, 在 SQL 语句后强行添加 11 的恒成立条件. <select id"sel" resultType"…

无法载入 mysql 扩展

今天弄了一天&#xff0c;总算把win2003下的问题给解决了&#xff0c; LoadModule php5_module E:\server\php528\php5apache2_2.dll 可能有些朋友也知道&#xff0c;添加这句后&#xff0c;就不用把php.ini拷贝到系统目录&#xff1a; PHPIniDir E:\server\php528\php.ini 现在…

订阅mysql的二进制日志_MySQL二进制日志

一、二进制日志(The Binary Log)1、简介包含所有更新了的数据或者已经潜在更新了的数据(比如一条没有匹配任何行的delete语句)包含所有更新语句执行时间的信息不记录没有修改数据的语句例如select&#xff0c;show主要作用一&#xff1a;主从复制主要作用二&#xff1a;恢复数据…

AIX-vi操作-提示Unknown terminal type的问题解决方法

AIX-vi操作-提示Unknown terminal type的问题解决方法AIX Version 5.3$ vi /etc/profilelinux: Unknown terminal type[Hit return to continue] :q!I dont know what kind of terminal you are on - all I have is linux.[Using open mode]……临时办法&#xff0c;下次启动失…

javaEE jdbc编程步骤

版权声明&#xff1a;本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/qilixiang012/article/details/25925647 1.载入数据库驱动(jar文件) //须要下载一个数据库的jar包&#xff0c;并导入对应的JDBC项目中。创建路径&#xff01; Class.forName("co…

【备忘】XP欢迎页中隐藏用户名

HKEY_LOCAL_MACHINESoftware\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList 适用范围&#xff1a;Windows XP默认情况下&#xff0c;Windows XP会在登录界面中显示已经建立的用户账户名称。这样将方便恶意者猜测用户口令而进入系统&#xff0c;以下设…

centos镜像 from_【CentOS 7.1】使用163的镜像

CentOS 7.1.1503// backup[rootlocalhost yum.repos.d]# cd /etc/yum.repos.d/[rootlocalhost yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bakmv: overwrite ‘CentOS-Base.repo.bak‘? y[rootlocalhost yum.repos.d]#// wget[rootlocalhost yum.repos.d]# wget htt…

Java性能调优工具

2019独角兽企业重金招聘Python工程师标准>>> 1、JDK命令行工具 1.1、jps命令 jps用于列出Java的进程&#xff0c;jps可以增加参数&#xff0c;-m用于输出传递给Java进程的参数&#xff0c;…