如何对基于node.js 的websocket进行并发访问的性能测试

如何对基于node.js 的websocket进行并发访问的性能测试,第1张

步骤如下:

需要在本机安装Nodejs

多少需要一点Nodejs的基础知识

类似下面非常简单的代码,它创建了一个HTTP服务器并监听系统的80端口。

//node server example

//引入http模块

var http = require('http'),

//创建一个服务器

server = httpcreateServer(function(req, res) {

reswriteHead(200, {

'Content-Type': 'text/plain'

});

reswrite('hello world!');

resend();

});

//监听80端口

serverlisten(80);

consolelog('server started');

将其保存为一个js文件比如serverjs,然后从命令行运行node server或者node serverjs,服务器便可启动了。

此刻可以在浏览器地址栏输入localhost进行访问,也可以输入本机IP127001,都不用加端口,因为服务器监听的是默认的80端口。

当然,如果机子上面80端口被其他程序占用了,可以选择其他端口比如8080,这样访问的时候需要显示地加上端口号localhost:8080。

主要指当测试多用户并发访问同一个应用、模块、数据时是否产生隐藏的并发问题,如内存泄漏、线程锁、资源争用问题,几乎所有的性能测试都会涉及并发测试。

中文名

并发测试

概述 

主要指当测试多用户并发

概    念

测试目的并非为了获得性能指

用户数

想确定用户并发数;

目录

1 概念

2 确定并发用户数

概念

编辑

测试目的并非为了获得性能指标,而是为了发现并发引起的问题。 在具体的性能测试工作中,并发用户往往都是借助工具来模拟的,例如LoadRunner性能测试工具中叫做虚拟用户;因为实际情况中去实现同时多人并发的测试环境要求比较高而测试成本高、测试时间也是比较长。

确定并发用户数

编辑

想确定用户并发数;必须知道系统所承载的在线用户数;例如关注:用户的总量、用户平均在线数值、用户最高峰在线数值。

例如:公司OA系统账号或者总用户有2000人;最高峰在线500人;但是这500人并不是作为并发用户存在的概念。即并不表示服务器实际承载的压力;有可能40%关注的是首页新闻公告板之类(注意看新闻这个阶段是不能造成服务器的压力);20%用户在查询资料或者操作表格;20%用户在发呆;20%在页面之间跳转;在这种情况下,只有真正20%用户在对服务器造成实质的影响。

我们将这个查询、操作表格作为一个业务范畴来说;直接将这部分业务并发用户称为并发用户数:

1计算平均并发用户数:C=NL/T

2并发用户峰值数:C’ ≈ C+3根号C

公式(1)中,C是平均的并发用户数;n是login session的数量;L是login session的平均长度;T指考察的时间段长度。

公式(2)则给出了并发用户数峰值的计算方式中,其中,C’指并发用户数的峰值,C就是公式(1)中得到的平均的并发用户数。该公式的得出是假设用户的login session产生符合泊松分布而估算得到的。

假设有一个OA系统,该系统有3000个用户,(可以看注册信息)平均每天大约有400个用户要访问该系统,(日志文件查看)对一个典型用户来说,一天之内用户从登录到退出该系统的平均时间为4小时,在一天的时间内,用户只在8小时内使用该系统。

则根据公式(1)和公式(2),可以得到:

C = 4004/8 = 200

C’≈200+3根号200 = 242

但是一般的做法是把每天访问系统用户数的10%作为平均的并发用户数。最大的并发用户数乘上一个值,2或者3

假如说用户要求系统每秒最大可以处理100个登陆请求,10/25/50/75/100 个并发用户来执行登陆操作,然后观察系统在不同负载下的响应时间和每秒事务数。如果用户数在100的时候,响应时间还在允许范围呢,就要加大用户数,例如120 等 。个人理解这个用户数就是我们经常说的等价类和边界值法来设定。

当我们在谈论“并发”时

动辄要求系统支持成百上千并发的性能需求太多了,也许系统在实际中确实存在这样的需求,但能够较全面理解此需求的情况并不多。

对于并发,我过去接触了几种理解,在接触的第一种理解中,“并发”是由loadrunner中获取,即脚本中所有或部分vuser执行至集合点函数时进行停留,等待触发条件发生以后,同时执行集合点函数后的请求操作的这一个过程,为“并发”(这一个请求操作一般存在多个http请求),可惜这种“并发”是无法直接用于衡量系统性能的。而在接触的第二种理解中,“并发”的理解是相对于服务器某一个时间区间内接收的请求数,也就是每秒的点击率(loadrunner考虑到这点,也就是analysis里面的hits/s),为“并发”,这种“并发”是可以用于对系统性能状况进行量化的,但是这种测试思想只是比较片面的从性能指标的角度去衡量系统性能,不能体现出系统性能带给用户何种性能体验(这也是不少开源性能测试工具的问题)。

前一种“并发”的理解普遍获得了loadrunner初级用户的认可,后一种“并发”的理解普遍获得系统运维、开发人员的认可,在沟通中为了方便区别开来,在两种角色里面,当大家意识到并发的理解存在差异时,大家把前一种被称为“狭义上的并发”,而后一种被称为“广义上的并发”。后来,又从淘宝团队里面了解了一种定义,貌似淘宝QA把“并发”定义为一个完整的事务请求数量过程(loadrunner也考虑到这点,也就是analysis里面的Transactions per Second)。一直以来,还有一种技术范围以外对“并发”的粗略的理解被第三方测试拿来用了,那就是用户在线数中的某个百分比即并发数。

如果一个团队里面对“并发”的理解有这么多种,那么当我们在讨论性能需求的“支持并发数”时,我们究竟在讨论什么呢?

个人认为,有一部分的原因是由于loadrunner是惠普saas(软件即服务的解决方案)的一部分,所以并不是一个纯粹技术人员使用的测试工具,它同时也是一个业务人员可以相对轻易掌握的性能测试工具,因此loadrunner内很多名词解释也不能单纯从技术人员的角度从字面意义上理解。

通常来说,面对同样100笔业务交易量,普遍会认为100vuser对服务器产生的负载会比50vuser要高,但是在性能脚本能够在较快的响应时间中完成时,由于50vuser执行过程中每一个vuser都需要发生两次迭代,导致了性能场景中vuser在脚本action部分停留的时间更长,因此反而能够得到比100vuser的更高的vuser在线数,更高在线数带来的也就是更大的负载,也就是说:

同等业务量的情况下,50 线程所产生的负载完全有可能比100 线程所产生的负载要高。

为了避免发生这种问题,“并发(集合点)”的真正作用就体现出来了,通过集合点函数控制了vuser的行为相对一致,降低了初始化过程和事务前后文请求产生的时间差影响。测试工具中并发存在的真正意义也就在这里,对集合点所理解的“并发”,和现场实际用户里面同时触发的请求关系不是太大。

分析“并发”需求时的一些典型:

a) 某个业务系统里面有10000用户,但是能够访问这个系统的终端数只有1000个、或者所需测试的业务每个月上限是1000笔,那么最高在线用户数就不可能超过1000、业务量也不可能超过1000。所以,有些时候在分析性能需求的时候,去统计一个业务系统的用户数还不如去统计能够访问这个系统的终端数、甚至业务量靠谱。

b) 某个业务系统里面,各个业务模块都不一样,那么就是说完成一笔业务交易,所产生的请求数也是不一样的,例如表单新增,有的需要填写20个字段,有的只需要填写5个字段,各个表单都不一样,那么为了更接近的去模拟用户现场负载,请求数都不一样的各种业务混在一起,并发数又应该是多少呢?

为了解决这些问题,需要首先考虑“并发”的粒度,以真实的业务场景为例:

a) 把粒度控制在用户上来看,假定所有用户访问一次系统平均耗时500秒,一个业务峰值会有800用户在线,则800/500=16。理论上,系统的性能需求是每秒要成功处理16个用户的请求;

b) 把粒度控制在事务上来看,假定所有用户执行一次完整的、成功的业务操作平均需要500秒,一个业务峰值有2000笔所关注的业务需要去执行,则2000/500=4。理论上,系统的性能需求是每秒要成功处理4笔业务交易;

c) 把粒度控制在请求上来看,假定所有用户执行一次完整的、不管成功或者失败的HTTP请求操作平均需要008秒,一个业务峰值有28000个请求需要去完成,则28000/008=350000。理论上,系统的性能需求是每秒要成功处理350000个请求。

实际一点的案例看看

在下面的图表中,横轴表示了某业务系统中上午9:00至12:00的一个区间,假定期间只有A、B、C访问了该业务系统。如果用户的访问过程中发送一个请求,则在请求发生的时间中标识一个点,由图可见:

A用户的行为:早上9:00访问了业务系统,并发生了一连串的请求(多个点已经连成一条直线),再然后没有再连续的发生请求(没有再出现黑线),而是有规律的间歇请求,我们暂且猜想用户A这个时候在浏览系统中的业务数据,这确实也符合浏览行为,空白阶段可以理解为在线的浏览,并不会对服务器产生负载;

B用户的行为:早上9:00访问了业务系统,并在临近12:00访问了业务系统,发送了一连串的请求,我们猜想该用户在执行了一些业务操作,浏览所占的比例比较低;

C用户的行为:仅仅在10:30左右访问了业务系统,执行了一连串业务操作以后没有再访问系统。

那么在这里案例里面,我们已知:3用户在线。问题:并发用户最高该是多少?答案其实显而易见,并发只有2个用户,因为用户C执行的业务操作的同时只有A也在执行业务操作,B完全是不在线。

还会有人认为100用户在线就应该上100个vuser/线程么?

问题一:性能测试应该做哪些准备 环境搭建:这个根据实际规划,我在企业内做过的性能测试搭建的环境都是和用户上线使用的实际环境一样的。

数据准备:个人感觉是整个工作里第二耗时的,需要真实模拟用户数据,这个不是单单的创建几个帐号就完事的,每个用户基本都会有不太一样的配置,实际操作的时候部署数据的脚本都写到手软。

脚本编译:选择性能工具编译性能脚本,你需要跑什么业务流程就编译什么样的脚本。

脚本执行:用规划好的用户数执行脚本,这个一般持续很长时间,时间太短不足以暴露服务器等的性能瓶颈,性能测试中最耗时的就是这个步骤。

收集日志:在执行脚本完成后收集到的能客观反应系统性能的日志、报表文件,比如LR的报告、数据库的AWR日志等等。

分析结果:分析收集到的日志、报表,找出性能瓶颈或是得出性能指标结果。这个一般需要对数据库或者底层非常了解的专业人士来分析,一般测试人员只需要提供收集到的报告就差不多了。

生成报告:将上面所有的性能测试活动整理总结,输出测试报告。

问题二:如何做好性能测试? 你好,首先很欣赏你的这种态度。我在TestBird 招聘新人的时候,也有很多小朋友觉得自己有多了解工具运用,有多熟练步骤过程,自我感觉很不错。

其实,我却想说,性能测试的重点不在性能测试工具的学习上。

当然,你也通过分析系统的压力点、LR录制脚本,设置用户,做压力,分析结果,整理测试报告。完成了性能测试的整个过程。那么我说这个性能测试报告是有效的,但它不一定是有用的。

为什么呢?因为在性能测试报告中,在你所在的环境中,你是测出了这样的效果。并未掺假,全部真实的记录。

为什么说它不一定是有用的,你了解系统架构么?知道数据库、中间件、前端程序的运行方式和处理机制么?了解网络协议么?了解操作系统么?熟悉开发系统的语言么,如java JVM的内在机理知道么?这些都是系统运行的一部分,都在影响着系统的性能。如果不了解这些,你如何做出有价值的有参考意义的性能测试。

所以,学会这些性能测试工具很好,但是这仅仅是第一步。性能结果只是一些数据而已,知道你在做什么,为什么要做这些,做完后能给出有价值的东西,才是后面要慢慢修炼的。

问题三:移动客户端的性能测试如何做? 。就当练习了。。大家看了不要喷我。。现在很多测试人员做移动端测试,可能主要还是关注功能和自动化测试。性能测试可能大多是按照每个人的体验来做报告,是不是比较快,或者比较慢。当然也不乏有很多的测试人员会回复我说,性能测试都是服务器的,移动端根本就不需要性能测试。我实在觉得可笑。 不过我毕竟一直在创业公司,而且就我一个人,所以了解可能有限,我这里就说下我之前碰见的,所知道的,目的只是抛砖引玉。 另外,我这里也不去说什么MAT,instruments了,这种固有查找内存的工具大家自己google吧。 客户端的性能从系统层面,电量消耗,网络流量,内存泄漏等都是被关注,或者说用户最最关注的点。 实例一,3rd 应用的性能测试。应用本身的响应时间可以通过call 应用intent来查看,设备纯环境,设备低内存等各种情况下进行同样此数的call,进行对比。或者与同行业同性质的应用进行对比测试。我相信很快就能够有结论了。除了应用本身,还需要对于应用本身某些特别的功能进行响应测试。比如测试一个list,测试的方法为onkeydown之后查看这个listindex(0)是否高亮,是否正常的界面跳转了,那么分别进行计时(精确ms)。同样的,我们在空list以及有几百条list的情况进行这样的case test,那么就会有一个性能的结果出来。 实例二,假设你测试微薄客户端,那么你肯定是需要进行一个list上下滑动的性能测试。我们需要使用脚本语言shell或者python去call server api来仿造数据反馈到移动设备上,否则你不可能自己手动去发几百条weibo然后再测试。测试的时候需要关注两个问题,一个是list在各种情况下是否滑动流畅,一个是当list中有很多的的时候load的速度也是一个很大的测试点。这个load可以直接检查imageview什么时候load出来pic,什么时候显示在界面上,计算时间。这里其实很多应用是webview,或者数据是存在服务器端的,这个时候无论是平时的测试还是压力,还是性能,数据的修改,其实还是多使用脚本ping api比较好,能够很好的去辅助达到性能测试的效果。 实例三,比如要测试一个优酷的视频软件,那么视频的播放的时候,首先保证网络的情况下,各种分辨率各种码率的视频接入时间是需要关注。然后在播放,也就是和网络不停的通信的同时,那么需要通过tcp dump和wireshark工具来检查网络访问是否正确,视频的卡顿,视频的花屏等除了硬件兼容之外,可以通过抓包来判断其性能。如果丢包率高那么自然视频卡,体验不好,性能也就不会好。 其实以上只是一些很基础,现在很多公司也已经在这个基础上改良测试了。不过也是一些思路,让更多的企业和测试关注移动客户端的性能。不要一提到性能脑中只有LR等这些Server测试。

问题四:为什么要进行性能测试 原因有三:

川 开发者的水平各有不同,有的写出来的东西性能高,有的低,所以需要统一测试一下。

2 编程工具本身也有性能问题,用这样的工具开发出来的软件也要确认一下是否达到了需求所要求的性能指标,比如响应时间应该控制在多少秒以内。

3 性能测试,强度测试都是为了测试系统的稳定性,稳定性好,软件的质量就好,买的钱就多。

问题五:如何进行Web服务的性能测试 贴一篇我们内部的文章:

随着浏览器功能的不断完善,用户量不断的攀升,涉及到web服务的功能在不断的增加,对于我们测试来说,我们不仅要保证服务端功能的正确性,也要验证服务端程序的性能是否符合要求。那么性能测试都要做些什么呢?我们该怎样进行性能测试呢?

性能测试一般会围绕以下这些问题而进行:

1 什么情况下需要做性能测试?

2 什么时候做性能测试?

3 做性能测试需要准备哪些内容?

4 什么样的性能指标是符合要求的?

5 性能测试需要收集的数据有哪些?

6 怎样收集这些数据?

7 如何分析收集到的数据?

8 如何给出性能测试报告?

性能测试的执行过程及要做的事儿主要包含以下内容:

1 测试评估阶段

在这个阶段,我们要评估被测的产品是否要进行性能测试,并且对目前的服务器环境进行粗估,服务的性能是否满足条件。

首先要明确只要涉及到准备上线的服务端产品,就需要进行性能测试。其次如果产品需求中明确提到了性能指标,那也必须要做性能测试。

测试人员在进行性能测试前,需要根据当前的收集到的各种信息,预先做性能的评估,收集的内容主要包括带宽、请求包大小、并发用户数和当前web服务的带宽等

2 测试准备阶段

在这个阶段,我们要了解以下内容:

a 服务器的架构是什么样的,例如:web服务器是什么?是如何配置的?数据库用的是什么?服务用的是什么语言编写的?;

b 服务端功能的内部逻辑实现;

c 服务端与数据库是如何交互的,例如:数据库的表结构是什么样的?服务端功能是怎样操作数据库的?

d 服务端与客户端之间是如何进行交互的,即接口定义;

通过收集以上信息,测试人员整理出服务器端各模块之间的交互图,客户端与服务端之间的交互图以及服务端内部功能逻辑实现的流程图。

e 该服务上线后的用户量预估是多少,如果无法评估出用户量,那么可以通过设计测试执行的场景得出这个值;

f 上线要部署到多少台机器上,每台机器的负载均衡是如何设计的,每台机器的配置什么样的,网络环境是什么样的。

g 了解测试环境与线上环境的不同,例如网络环境、硬件配置等

h 制定测试执行的策略,是需要验证需求中的指标能否达到,还是评估系统的最大处理能力。

i 沟通上线的指标

通过收集以上信息,确定性能测试用例该如何设计,如何设计性能测试用例执行的场景,以及上线指标的评估。

3 测试设计阶段

根据测试人员通过之前整理的交互图和流程图,设计相应的性能测试用例。性能测试用例主要分为预期目标用户测试,用户并发测试,疲劳强度与大数量测试,网络性能测试,服务器性能测试,具体编写的测试用例要更具实际情况进行裁减。

用例编写的步骤大致分为:

a 通过脚本模拟单一用户是如何使用这个web服务的。这里模拟的可以是用户使用web服务的某一个动作或某几个动作,某一个功能或几个功能,也可以是使用web服务的整个过程。

b 根据客户端的实际情况和服务器端的策略,通过将脚本中可变的数据进行参数化,来模拟多个用户的操作。

c 验证参数化后脚本功能的正确性。

d 添加检查点

e 设计脚本执行的策略,如每个功能的执行次数,各个功能的执行顺序等

4 测试执行阶段

根据客户端的产品行为设计web服务的测试执行场景及测试执行的过程,即测试执行期间发生的事儿。通过监控程序收集web服务的性能数据和web服务所在系统的性能数据。

在测试执行过程中,还要不断的关注以下内容:

a web服务的连接速度如何?

b 每秒的点击数如何?

c Web服务能允许多少个用户同时在线?

d 如果超过了这>>

问题六:网站性能测试主要有哪几种方法 我知道的性能测试主要有:压力测试,负载测试,容量测试,发性能测试,兼容性测试(不同的操作系统和不同的浏览器)。测的时候应用在客户端的性能、应用在网络上的性能和应用在服务器端的性能都要进行测试的。

希望能帮到你。

问题七:怎么才能做性能测试工程师? 性能测试实际上确实需要些功底儿,但是也并不是非得一两年之后才去做。

我给你列几条性能测试工作中的建议,你可以自己温习一下,然后去面试,具体的经验需要实际的工作才能得到,然而你扎实的基础知识才识支撑你走下去的动力。

1,最直接也是最表面的建议,适用于面试:Loadrunner, HttpWatch, Dynatrace, TeamQuest, JMeter(可选), Wily(可选), HTML/HTTP, Webservice, Mainframe, DB 这些东西足够学很久很久的了,所以说需要几年的工夫,但是没必要每一样都学太深,了解即可,经验日后会积累到的。

2,相对比较深层的建议:性能测试最关键之处不是工具的选择,而是对整个性能参数的理解,所以比较贴近于概念,比如说什么是TPS, Response Time, Connection浮 per Second还有就是什么是CPU Utilization, FreeMem, Disk IO, Paging 工具也无非都是通过日积月累形成的客户端,所以抓到本质才是关键。

不在这里长篇大论了,呵呵,加油!

问题八:性能测试应该怎么做 需求分析 - 测试设计 - 测试执行 - 结果分析

问题九:APP如何做性能测试 目前市面上有很多家做安全加密的平台都有做安全检测,但是大部分需要付费,如果说只是个小项目的话花钱去做的话成本太高,也不建议去做

你可以了解下爱内测这个平台,专门做测试的,有安全检测、兼容测试、插件评估等,虽然这个平台也是付费的,但是他有免费的版本提供,个人觉得安全检测免费版本已经足够强大了,自动化生成测试报告,提供精准的检测数据

希望可以帮助到你

问题十:服务端怎么做性能测试 使用LR对数据库进行性能测试,实际上有多种办法,包括通过现有的数据库协议进行CS模式的先录制后执行的模式,以及通过socket方式向服务器发包方式的测试方式。这些是常规书籍上介绍的比较简单上手的测试方法,但是不具备通用性,受已有协议或socket编程方式的限制,所以需要更为通用的测试方法。

用Java user的协议进行所有数据库性能的测试工作:

Java user 不需要录制,把所有的操作通过java语言进行实现,通过lr调用java的class进行加压批量操作,这样可以不关心被测系统是哪个数据库,只要能够通过jdbc进行访问,就能实现性能测试。

一、测试环境准备

1 被测服务器准备,根据测试目的,搭建需要的数据库服务器,确保数据库能够正常访问,正常操作;

2 Java代码的准备,无论使用哪种IDE,只要能够编写访问数据库的class就可以,形式可以是j2se,也可以是j2ee,因为在操作时只使用class的部分方法,所以j2ee就可以了;

3 LR的脚本调试,把java的class导入到脚本调试模式,根据需要添加事务以及其他操作。

二、编写数据库访问

1 使用myeclipse,创建web project,创建如下图的包目录:

Java文件中包含各种访问数据库的方法。

需要注意的是,class中的方法必须是public static,否则LR中无法调用。由于创建的是j2ee程序,所以不用main函数,在web中就可以进行功能验证。

确认class中的方法编写完成,创建一个webjsp文件,如下:

导入class

声明类,并实例化,直接调用刚才编写的3个方法,因为这3个方法是直接对数据库进行操作,不需要实参,也没有返回值,所以直接实现即可。

此时启动web服务,在浏览器中输入jsp的地址,直接刷新页面,就可以调用这3个方法,如果正确,就会对相应的表进行操作,如果不正确,则需要修改相应的代码。

2 LR脚本准备:

LR脚本实际上就是对访问代码的调用,关键在于需要根据测试场景划分不同的脚本布局。

例如:在myEclipse里,我们只编写了一个class,其中包含三个方法,如果在执行性能测试时,这三个方法相互独立,互不干涉,则最简单的划分方法是,创建三个java user,每个java user中包含一个方法,做三份脚本,场景执行时分别进行调用。如果三个方法之间有相互关系,则需要根据实际情况,把有关联的方法放在一起,具体情况可按实际灵活分配。

因为已经将class文件进行编译发布了,所以可以在“java2postgres\WebRoot\WEB-INF\classes\\lr\test”目录中找到对应的class文件,

复制这个文件,找到LR的目录:HP\LoadRunner\classes\\lr\test\ 如果没有文件夹,按相同的内容创建。

在LR脚本中进行引包操作:

将需要执行的java类以及方法,放在action中,可根据实际测试情况和所需要验证的内容,具体调试代码。

在这里可以像编写普通LR脚本一样,添加事务或 点等内容。

由于是通过JDBC对数据库进行访问,因此要在java user中加载jdbc驱动。

运行时设置中,增加jdbc驱动,需要注意的是java user使用的本地jdk,需要至多16版>>

调载荷曲线在编写程序时是通过模拟和控制系统中的负载情况来实现的。调载荷曲线的目的是模拟实际使用场景中不同负载条件下的性能表现,以便评估系统的可靠性、稳定性和性能。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 如何对基于node.js 的websocket进行并发访问的性能测试

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情