一周资讯 | 每一个公司都有一个得罪不起的性能僧

来源:互联网 发布:php 正则获取href 编辑:程序博客网 时间:2024/06/11 05:23

作为一个仍在经验积累初期的性能测试小白,做过的项目屈指可数,每次做一个测试任务,都是边做边摸索边学习的过程。这次是为某项目测了一些重要的接口,服务框架用的是spring boot,数据库是mongodbmysql,框架数据库均是第一次遇到。此次测试的目的是在达到测试指标时,接口能承载的最大并发数,对性能差的接口进行优化。测试的指标是响应时间≤100ms(本文提到的响应时间均为90%响应时间),tps在基准测试下≥10CPU使用≤80%,内存使用≤75%


其中一个任务管理页面查询的接口,基准测试通过,并发用户50路压测下,响应时间109msTPS989.9




由于这个任务管理页面查询接口调用了另外四个查询接口,为了定位到消耗时间的具体环节,让开发人员在接口网关脚本中做处理,压测时通过网关日志打印出每个接口调用时花费的时间,可以看到绝大部分响应时间都花在t4上。



t4这个接口会对mongodb数据库进行查询,但是此collection中仅有2000条数据,对mongodb来说数据量并不大,从响应时间来看接口性能较差,不优化的话会影响系统性能测试,因此直接对这个接口进行测试,查找响应时间较高的原因。



20路并发下,t4接口的响应时间已达到111ms。此接口逻辑并不复杂,仅是一个简单的mongodb查询,数据量也不大,为什么这么慢呢?查看mongodb这个collection并未建索引,另查询mongodb慢日志中有一个group查询语句最慢时已有136ms


通过代码查看该mongo原查询语句实现方法如下所示:



在日志中同样给出提示,这个分组查询的命令已经被弃用了,并给出了mongo官网地址:2017-12-02T13:37:10.711+0800W COMMAND  [conn747] The group command isdeprecated. See http://dochub.mongodb.org/core/group-command-deprecation



查询一些资料得知db.collection.group()使用JavaScript,受到许多性能限制,因此官网建议采用db.collection.aggregate()或者 db.collection.mapReduce()替换group查询。找到原因和解决方法后,建议开发使用db.collection.mapReduce()替换原来的group查询,优化后的查询语句如下:



另外,考虑到生产环境中这个collection下的数据量会较大,建议开发增加索引。在建索引和优化了group查询语句后再次对t4接口进行50路并发的压测,由下面测试结果可见,响应时间从原来的111ms下降到12mstps较优化前也提升了5倍多。



优化了t4接口之后,再对原任务管理页面查询的接口进行测试,100路并发下,响应时间=68mstps=2034.8/s,与优化前50路并发测试结果相比,优化效果明显。



借助mongodb自带的监控工具、慢日志分析和开发人员的协助,这次问题定位还是比较顺利的。通过优化前后测试结果对比可见,仅仅修改一个查询方法就让接口响应速度提升将近10倍。



阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 食戬 食指 戒指戴食指 戒指带食指 食指戒指 食指发麻 无名指食指 食指带戒指 食指无名指 食指大动 食指是哪个 食指是哪 哪个是食指 食指图片 食指英语 食指英文 那个是食指 食指的诗 食指和中指 食指带戒指什么意思 无名指比食指长 右手食指戴戒指 戒指带食指什么意思 食指关节痛怎么回事 相信未来食指 男生左手食指戴戒指 左手食指痛警惕四种病 右手食指发麻警惕四种病 戒指戴食指什么意思 食指比无名指长 食指戒指代表什么 戒指戴在食指 女生食指戒指 女生右手食指戴戒指什么意思 左手食指有疤代表什么 戒指戴食指含义 女生食指戴戒指 女生食指带戒指 食指和无名指一样长 食指无名指一样长 戒指戴左手食指