论坛首页 编程语言技术论坛

我的开源项目:RoadRunner

浏览 9448 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-11-19   最后修改:2010-03-06
代码地址:http://code.google.com/p/roadrunner/

序:不知不觉版本号已经到3.3.1了,

以前一直没有对外宣传这个项目,只是自己在用,惟一一次对外声明过是在一篇发表在程序员杂志的那片文章中略带了一下,

那是由于正好用到它做一个简单的解决方案.

起初没有对外宣传是因为想自己多发现些bug,修正好后再公布出去.

后来bug也没了,但由于时间关系忘记宣传了,它也就一直默默的呆在google.code和gemcutter上.

现在拿出来给大家看看,大家有什么更好的设计或者点子,都可以告诉我,如果想法很不错,我们就把你的代码片段加进去:)

===========================分割线============================

最新Gem的请到Source中通过Google Code的SVN下载

也可以通过Gem直接安装:gem install RoadRunner --source http://gemcutter.org

LoadRunner?这个工具很多做过性能测试的朋友肯定都知道,里面有很多方便易用的方法,不过这些方法的实现不是重点,毕竟ruby的第三方库的各种实现非常的多,ruby开发者的热情都很高。

RoadRunner?实现的是LoadRunner?的框架,

既: init(){ } action(){ } end(){ }

init存放初始化、登陆等操作,action可以不断的迭代执行,从而产生持续不断的压力,end存放释放资源、退出等操作。

外加一个虽然简单但直观的报表,之后的版本除了不断的完善RR的报告,提高和LR的相似度之外,还会增加更多ruby特有的方法,丰富Rrhelper模块代码。

RoadRunner更方便的地方在于,它不仅仅可以通过日志来展示结果,还可以将结果存储到数据库中,大家可以看test目录中的pi_db.rb这个测试文件,之后就会很方便的通过读取数据库的测试记录,来绘制测试报表.

我觉得我在写数据库这块代码的时候,这个设计思路比较让自己满意,

这块的设计是这样的:
当你引用RoadRunner这个gem时,如果你还在生成RoadRunner类的同时,给RoadRunner.new方法一个block,
并且这个block里面是一个ActiveRecord的数据库连接,
而且这个数据库中没有scenarios,transactions,records这三张表,
则RoadRunner会自动创建这三张表,以及默认的字段
并且将测试的数据写入这三张表中.
但要注意,如果已经有了这三张表,但字段和RR的要求不同,那就会导致写数据异常,需要分库或者改名.

如果能够将它和我的倩女幽魂项目(http://gemcutter.org/gems/lpm,http://gemcutter.org/gems/lpmp)合并起来用,那还可以监控被测主机的系统资源使用情况.

倩女幽魂介绍:

http://code.google.com/p/lpm/

http://docs.google.com/View?id=dcnwrnvv_871dvvc64dw

http://charlescui.iteye.com/blog/506623

我喜欢LR,我更喜欢RR -

该gem的test目录下有测试文件,安装好该gem后,可以先阅读测试代码,之后就可以很快的入手了。

测试例子一,计算PI:
# 莱布尼兹公式计算圆周率
#rrpi.global[:deep]代表计算的深度
#深度越深,计算越精确,当然也越耗时

$:.unshift File.join(File.dirname(__FILE__),'..','lib')

require 'roadrunner'

rrpi=RoadRunner.new

rrpi.init do
  rrpi.global[:pi],rrpi.global[:deep]=0,100

  # users决定同时有多少并发用户一起执行action
  # iterations决定每个用户执行多少次
  rrpi.users,rrpi.iterations=10,1000
end

rrpi.action do

  # 新增加了iterationId和userId两个接口方法,
  # 可以通过iterationId获得当前action执行到第一次
  # 可以通过userId获得当前action执行用户的id
  # puts rrpi.iterationId
  # puts rrpi.userId
  1.upto(rrpi.global[:deep]){|x|rrpi.global[:pi]+=((-1)**(x+1)*1.0/(x*2-1))}
end

rrpi.ended do
  rrpi.global[:pi]*=4
  #rrpi.global={}
end

rrpi.run
rrpi.report


执行完毕后,控制台会输出报告,类似如下信息:

Performance Reports

user system total real

4.750000 0.016000 4.766000 ( 4.796000)

The Virtual User is 10.

Total Execute 1000 Action(s).

Total Cost 4.7960000038147 Second(s).

This Scenario's TPS : 208.507089075189.

The longest action cost 0.0160000324249268 seconds.

User defined params as below:

{:deep=>1000, :pi=>3140.59265383977}

End of Reports

代码的黏贴复制会导致代码变形,大家可以去看roadrunner源码的test目录,里面有很多测试用例.
   发表时间:2009-11-19  
Great!  是否可以生成类似loadrunner的图形分析报表?
0 请登录后投票
   发表时间:2009-11-19  
dennis_zane 写道
Great!  是否可以生成类似loadrunner的图形分析报表?


可以啊,当初用的是FlashChart来画图的,那时候做了一个展示的平台,其它用了EXT做了一个OAOP的富客户端页面,不过自己感觉很乱,而且Extjs比我这个gem还大,所以没继续跟进做.

现在我玩了下FLEX,画个报表做个OAOP的页面没问题,以后就用一个Flash做一个服客户端来展示报表什么的,但还没做呢.

要是有人需要,那我做一个.
0 请登录后投票
   发表时间:2009-11-19  
我觉得我在写数据库这块代码的时候比较让自己满意,

这块的设计是这样的:
当你引用RoadRunner这个gem时,如果你还在生成RoadRunner类的同时,给RoadRunner.new方法一个block,
并且这个block里面是一个ActiveRecord的数据库连接,
而且这个数据库中没有scenarios,transactions,records这三张表,
则RoadRunner会自动创建这三张表,以及默认的字段
并且将测试的数据写入这三张表中.
但要注意,如果已经有了这三张表,但字段和RR的要求不同,那就会导致写数据异常,需要分库或者改
0 请登录后投票
   发表时间:2009-11-19   最后修改:2009-11-19
非常不错, 我们组同事也要做类似的东西。

不过比较担心的是可信度, 怕用ruby压的效果不如Loadrunner, 后者单物理机的压力非常可观, 一般的性能问题都能暴漏出来。

PS: 一听这项目名称就知道哪个公司的。
0 请登录后投票
   发表时间:2009-11-19  
dazuiba 写道
非常不错, 我们组同事也要做类似的东西。

不过比较担心的是可信度, 怕用ruby压的效果不如Loadrunner, 后者单物理机的压力非常可观, 一般的性能问题都能暴漏出来。

PS: 一听这项目名称就知道哪个公司的。



你听这个项目名以为哪个公司呢?
我把这个搞搞然后自己开一家公司叫RoadRunner?
嘿嘿。

Ruby性能有问题,绝对是。不过那是单进程模式。
我这个RR也是单进程玩的,因为跑性能代码的时候,多个虚拟用户之间可能会有交互,而且他们的tps也要统一起来计算,分成多进程就不好计算了。

不过设计思路可以改一下,用个本地的memcache暂存数据,只是要求这个本地的cache够快。
我还想过进程间通信,但怕效率不够会出问题。
比如:100个虚拟用户互相Process.kill的发信号,我不知道结果会不会准确。
也想过管道的方式,这个问题更大,算了。

后来想想,什么工作做什么事情,没有大而全的东西。
我这个ruby的确不快,但我可以压比它还要慢的东西。
这个东西再慢也是语言级别的,总要比绝大部分业务逻辑快吧,这样一思考,就没啥问题了,哈哈哈。

不过改进它的性能绝对是我以后的方向。
0 请登录后投票
   发表时间:2009-11-20  
顶楼主山寨,应该早点分享,哈哈
0 请登录后投票
   发表时间:2009-11-20  
linliangyi2007 写道
顶楼主山寨,应该早点分享,哈哈


谢谢

感觉flash报表还没搞好,之前用Ext的,不过那个js库比我这个gem还大,就一直没想拿出来,后来就忘了.

报表这块希望大家提需求,我来实现.
0 请登录后投票
   发表时间:2009-11-20  
CharlesCui 写道
linliangyi2007 写道
顶楼主山寨,应该早点分享,哈哈


谢谢

感觉flash报表还没搞好,之前用Ext的,不过那个js库比我这个gem还大,就一直没想拿出来,后来就忘了.

报表这块希望大家提需求,我来实现.

我比较关心的指标是TPS、系统负载、CPU(最好能多点收集,搞agent)、吞吐量之类。
你这个东西做好了,我就拿他替换loadrunner跑我们的压测,哈哈。
0 请登录后投票
   发表时间:2009-11-20   最后修改:2009-11-20
直觉上这样做是在从头干起, loadrunner一口气模拟成千上万个vuser应该不是那么容易能实现的。 性能测试领域应该还有很多的第三方包可以借鉴的。

我是门外汉, 不过有些工具可以google到, 楼主可以借鉴一下。

http://code.google.com/speed/tools.html
http://www.pylot.org/  比较靠谱。


0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics