下一个release准备国庆后就要go-live,所有的测试case都cover过了,但还未进行过压力测试,有点不放心,刚好过节期间家人都回家去了,假期终于可以抽点时间压测一把。
Apache AB测试工具 之前用过一些压力测试工具比如loadrunner, Jmeter,感觉都太重,想要使用不是软件需要注册就是使用起来很不得心应手,这次灵光一动,想到直接使用ab + oneapm进行测试,ab是apache http server自带的一个测试工具,可以对你的web站点进行压力测试,非常小,使用起来很简单。如果你已经安装了apache,那么在<apache>/bin目录就能找到ab,输入ap --help, 里面简单几个选项仔细读一下,很快就能上手进行测试。
Oneapm 这个就不用多说了,性能监控软件,如何使用参看下官网的guide,我分别在不同的平台上都试过接入oneapm,比如nodejs,ruby,php,java,使用起来挺简单方便的。
环境:内网测试服务器 语言:Ruby Framework:RoR 数据库:MongoDB
总共进行了两轮压测, 测试方式及结果 第一轮: 每秒大概30个并发, 单页面访问 第二轮:并发量每秒提升到100,分别访问4个主页面
使用ab进行测试的方式:
ab -n 1000 -c 30 <your url>
-n 是指总的request数量,-c是指同一时间并发量
以下是在添加了oneapm agent之后,使用apache ab压测结果。
首先是总体拓扑: 由于只是压测,就没有在测试环境部署相关的后台任务,也没做集群以及LA, 在我们的prod环境中,是有座cluster及Load balance。
总体概览:
30并发/s的平均响应时间在200ms左右,而一旦提升到100并发/s,响应时间瞬间飙升到800~900ms左右,对于一个目前pv还不算高的网站,还可以接受,但也还有提升空间。
web事务
数据库: MongoDB在单机压力测试下表现还可以,如果说整体上整个站点要在优化性能的话,主要就是在framework上。
RubyVM 这个对于实时监控挺有用,但是这个仅仅是适用vm以及ruby gc的一些统计,如果能加入对ruby container的监控就更好了,因为我遇到过很多次,web缓慢或者瘫痪的时候,几次都是因为ruby container内存溢出,导致宕机。但是对这块的监控就比在ruby或者ror中加探针要复杂很多了。
页面总览 页面加载详情
我觉得这项功能挺有用的,能知道用用户在使用网站的时候的加载进度,使用情况,当然这个很大程度也依赖于用户自身的网络情况,这个功能是不是准确就没验证过了。
用户分布 其他一些功能,如用户分布就跟GA很类似了,但GA更详尽一些,包括session时间,用户在页面上停留时间,地域,甚至用户的年龄等,不知道google是怎么做出来的。但是oneapm这里有一个运营商,是电信,联通,还是移动,这个感觉眼前一亮,很符合我天朝国情,很多时候我们需要了解这个数据。
以上就是简单的通过使用Apache ab进行压力测试,以及配合使用oneapm来对压力测试的结果进行评估的实际操作过程。不需要再借助繁重的Load Runner或者Jmeter来进行压测,简单轻松搞定。
对于Oneapm, 使用的并不是十分深入,但就目前的使用经验, 有几点建议:
- proxy功能 oneapm中的所有agent在提交数据的时候是直接通过被monitor的服务器进行数据提交,那如果服务器并不能连接外网? 我的prod环境中的server就不能直接连接到外网,但是通过同一个vpc内的代理可以,我在安装使用oneapm的时候并没有看到有proxy的设置,也许有这种问题的,不只我一个,这种情况web的一些trace数据时不可能提交大oneapm。
- 这些所有的trace数据能保留多久 我看到上面最大能存3天,那之前的数据都被删除了吗?我想对一个站点的monitor不仅仅是关注这3天的数据,当然也不可能为所有用户保存所有的数据,但是可以考虑将用户的数据做聚合,然后再做存储,这样数据量会小很多。
- Container的monitor 我看到oneapm有针对语言的数据trace探针,有针对服务器的monitor agent, 但我想还有另外一个东西也是用户比较concern的,那就是container,从java的tomcat,jetty,weblogic,到Ruby的puma, rainbow等等
另外好像也有bug,我试过对php进行monitor,php agent能正常的安装,但并不能正常的trace到我应用的相关数据,可能是我的apache并不是通过yum 安装,而是直接源文件安装的方式,我看了/var/log/oneampxxx.log里始终没有数据,不知道哪里出了问题。