[性能调优]:记录最近一次性能测试项目测试过程

 测试的系统是新上线的系统,为中心系统,对接各类外围系统,预计会员数据在百万级别,此处以“注册”“登录”两个接口举例说明在性能测试过程中碰到的问题,以及解决问题的过程。

一,举例的两个接口很简单,为公司系统的手机注册和登录交易:

注册流程为:

  1,客户端申请手机验证码

  2,服务器生成短信验证码后调用短信平台发送短信

  3,收取短信,提交注册请求

  4,服务器验证请求

说明两点情况:

1‘,客户端发送给服务器端的信息,先在本地通过三重加密(将json字符串用DES算法加密,加密后用base64编码,发送请求时参数需要UrlEncoder编码) ----------关于加密问题,另起一篇文章讲述;

2’  此处程序版本为性能测试做了点调整,服务器端,只生成验证码后返回给请求客户端,不调用短信息平台发送验证码。

二、脚本开发过程中遇到的问题

因采用loadrunner11进行的脚本开发,LR11只支持32位的jdk版本,且对jdk的版本兼容性不好,如果采用开发JAVA Vuer类型的脚本,调用封装好的jar包,测需要用同样版本的jdk;

尝试过在脚本中直接调用C语言程序的加密代码,但每次的加密过程都需要编译,耗时太长,无法测试;

本次脚本开发过程中,加密的程序是在本地运行,通过http协议访问localhost,通过这种方式,避免了lr不能调用64位jar包的尴尬;

三、压测及调优过程

因本次压测的系统还未上线,所以采用峰值压测方式,看看系统能处理的最大并发能力。

1,注册交易,刚开始采用100用户并发,总会有部分交易报错(10%左右),当采用20用户并发时候,不会报错,成功率为100%,

 问题原因:推测连接池参数有关;

 优化方式:修改连接池参数,解决这个问题;

2,初次压测注册交易,监控到数据库磁盘繁忙度和CPU使用率高,应用服务器CPU超阈值;

    问题原因:通过MYSQL监控,监控到其中一条SQL语句在50秒执行了43000次,而实际的请求事务数,不到7000笔

 

优化方式,;sql语句程序逻辑上的优化,减少查询次数

3,增加硬件资源后,发现cpu使用率最高为50%,响应时间随着并发数增加而增加,服务器的处理能力并未提升,监控后台日志发现发现提交注册请求超时,超8秒以上,后台日志发现注册完成后写数据库很慢,调整数据库连接数20变为100,速度由5秒变为1秒以内

调整前:

调整后:

4,调整数据库连接数后,,发现注册激活业态信息很慢,开发需要从注册的流程上进行优化

优化后结果:

平均时间由3秒多变为0.1秒内

 但是发现LR测出来的结果依然不满意,TPS和之前差不太多,服务器资源也负载不满,思来想去,考虑到可能是带宽的问题(限制了上传下载),

所以多增加一台负载机压测,发现带宽降低为一半,不是带宽的瓶颈

遂考虑是不是在服务器处理请求(输出第一条日志)前,已经开始等待了,试着调整线程池参数,再来一次,陆续发现其他的问题:

5,增加用户数之后,事物响应时间也随之成正比增加,TPS基本稳定在200左右;试着抓了一次资源信息,发现了一个磁盘的问题:

,

可以看到保存数据信息,导致磁盘写繁忙度达阈值,实际上是因为这个数据库服务器部署在虚拟机上,本省的磁盘读写速度就很慢,和环境组沟通后,重新申请了物理机,部署。调整后,看到磁盘读写能力大大提升了,如下图:

提升速度已经很明显了,果然发现TPS有一定幅度的提升,但还是没有达到目标,

6,后面的优化,实际上也没有发现什么问题:和开发沟通后,因为是注册保存数据较慢,考虑到redis内存存储信息,加快保存数据处理

采用redis存储之后,压测,好像依然没有改善,后面分析超时日志信息,发现问题在操作redis时计算分片的函数耗时较长

7,优化计算redis分片函数之后,性能直接提升到了1000了,

监控服务器数据,又发现一个问题:

数据库中间件Mycat第一台的网络负载压力较大,26M/秒,原因是负载均衡问题,配置问题,小问题,修改后验证。

至此,这次的测试算是达到目标了,测试任务完成了,

本次经验总结:

1,环境准备:因本次测试的指标目标较高,对个方面资源的性能要求较高,在CPU、内存、磁盘、网络,负载机,个方面准备需要提前;

例如负载机的问题,因为本次压测数据吞吐量较高,如果没有提前申请和服务器同一网段的负载机,后面进行压测历史的话,网络就会限制,在同一网段的负载机上压测,网络问题就基本可以忽略;

2,脚本开发:本次注册的脚本,发送请求信息,在客户端都有一个三重加密步骤:UrlEncoder.encode(Base64.encode(DES.encrypt(jsonStr, key)), "utf-8");

加密的jar包需要开发提前提供;

其次,注册需要发送手机验证码,在生产的版本,会对手机号格式校验,以及发送真是短信到手机上,这样在脚本中是跑不了的;

所以需要对程序版本进行一定的修改:1,不校验手机号格式,2,不真实发送手机短信,短信验证码包含在申请验证码的返回报文信息中;

3,压测调优过程:

1)200用户并发时,部分交易报系统错误,调整线程池参数,增加线程池连接数;

2)数据库慢查询监控,将耗时较长的sql语句挑出来优化;

3)数据库语句监控,例如监控到一次交易中,多次反复执行的sql语句,从代码的执行逻辑上优化,减少sql语句执行次数,较少代码开销

4)监控硬件资源,在硬件资源产生瓶颈之后,提升内存和CPU的资源;

5)增加用户并发数,提高服务器日志级别,将耗时较长的交易流水找出来,逐条分析日志,定位耗时较长的函数,发现保存用户注册信息较慢,优化数据库连接数参数;

6)原本为了方便,是用本地负载机做的压测,当网络传输数据量到达一定时,本地负载机的网络成了瓶颈,遂换到和测试环境同一网段的远程机上做压测;

7)继续压测,发现注册保存用户信息仍然较慢,监控到磁盘繁忙度较高,了解到测试环境数据库部署到的虚拟机上时,处理能力较差,遂申请更换物理服务器,提高磁盘读写能力;

8)到硬盘读写能力和网络能力提升之后,处理能力并无本质提升,开发考虑才有redis内存保存的方式,提高存储速度,压测后略微有提升;

9)监控后发现,在写redis内存块,处理速度较慢,分析为操作redis时计算分片的函数耗时较长

10)监控数据库中间件Mycat网络负载不均衡,参数设置问题;

 

 

以上。

 

posted @ 2018-04-20 09:36  fy-  阅读(303)  评论(0编辑  收藏  举报