`
robbin
  • 浏览: 4800097 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
377a9ecd-1ea1-34ac-9530-9daa53bb2a7b
robbin谈管理
浏览量:135785
社区版块
存档分类
最新评论

请注意Rails2.3自带的memcache-client有性能问题

    博客分类:
  • Ruby
阅读更多
Rails2.3版本发布了,这个版本内部的改动非常大,相关介绍可以看JavaEye这篇新闻:http://www.iteye.com/news/5390,估计最近也有不少人开始动手升级到Rails2.3了,JavaEye也不例外,这一升级才发现性能低得令人发指。

由于过于信任Rails框架,没有进行本地性能测试,在通过了兼容性测试就兴冲冲上线了。这一上线,动态请求立刻堵了一大堆,仔细看了看fastcgi的crash log,发现大量请求在flush数据的时候发生broen pipe。打开Rails2.3新采用的Rack框架源代码当中fastcgi的adapter一看,这代码写的太不负责了!fastcgi协议本身是没有设定缓冲区的,写出去的数据立刻就发送掉了,结果Rack还非常多余的在每次写数据之后flush一下,造成了连接已经关闭之后,fastcgi还傻傻的等着flush数据呢!

自行修改了Rack的fastcgi adapter,本地运行压力测试,fastcgi不再报错,代码上线发布,立刻又堵住了,load非常高,这下开始怀疑是不是Rack的fastcgi支持的不好,导致的性能差? 由于thin是对Rack支持最好的Rails应用服务器,因此我们把网站rails运行方式从fastcgi改成了thin,再次代码上线发布,又堵住了,而且堵的更严重,load比刚才用fastcgi还要高很多! 由此也可以看出来,fastcgi毕竟还是Rails性能最好的运行方式。

完全排除了fastcgi的问题,又排查了好几处可能造成性能影响的地方,还是无法解决rails2.3一上线请求就被堵塞的问题。最后老老实实在本地进行了性能测试,这下终于真相大白。在我本地MacOSX的环境下面,rails2.2的情况下每秒可以处理40个请求,但是rails2.3每秒只能处理25个请求,同时CPU消耗的更多,进程内存占用更高!

最后真正的原因是Rails2.3自带的memcache-client有重大性能问题

简单的来说,Rails2.2自带的memcache-client是1.5.0版本,这是一个用了很久很稳定的版本了,也是目前 memcache-client官方正式发布版本;而Rails2.3的memcache-client升级到了1.6.5版本,这是一个全新的版本,仅仅在github上面,并未正式发布,可以看成一个开发当中的版本,而这个版本有无数的问题!

第一、它设置了一个怪异的timeout参数,默认情况下,导致连接memcache server的速度变得异常缓慢,把该timeout参数改成nil以后,速度恢复正常

第二、它把连接memcache server的每个方法操作改成了闭包调用,固然代码和异常处理显得优雅一些,但是性能测试表明,整体应用性能会下降很多。

第三、它里面的代码还有一些自相矛盾的地方,比方说多线程的检测和处理代码有错误

总之,在把rails2.3的memcache client版本换成老的1.5.0版本以后,性能问题得到了解决,而且在本地性能测试的结果表明,在rails2.3上面运行JavaEye代码,速度比rails2.2上面还要提升了11%的性能,但是内存消耗有所上升(估计是rails2.3的local cache带来的)。

当然memcache-client 1.6.5也不是一无是处,他添加了自动故障转移的能力(在多个memcached server之间),内部代码也进行了一些重构(尽管重构的结果是性能更低下),添加了一些多线程支持(尽管这部分代码根本不能正常工作),不过毕竟这还是一个开发当中不成熟的版本,rails不应该很草率的就升级了memcache client版本。
分享到:
评论
36 楼 t0uch 2009-03-24  
robbin 写道
t0uch 写道
想来也是rails core team缺乏这样的数据和经验,如果robbin可以教训他们一顿可以有一定帮助。


人家跑上百万的PV,动辄五六台服务器拼个群集,不在乎那点性能损失。我们就一台跑rails的服务器,性能差一点,网站都得堵,也怪咱穷,否则也租它一个机柜,14台1U服务器一字堆叠下来,谁还管它rails性能好坏呢。

是啊,但是按照这个趋势下去,ROR越来越臃肿是在所难免的了。
35 楼 robbin 2009-03-24  
t0uch 写道
想来也是rails core team缺乏这样的数据和经验,如果robbin可以教训他们一顿可以有一定帮助。


人家跑上百万的PV,动辄五六台服务器拼个群集,不在乎那点性能损失。我们就一台跑rails的服务器,性能差一点,网站都得堵,也怪咱穷,否则也租它一个机柜,14台1U服务器一字堆叠下来,谁还管它rails性能好坏呢。
34 楼 t0uch 2009-03-24  
想来也是rails core team缺乏这样的数据和经验,如果robbin可以教训他们一顿可以有一定帮助。
33 楼 linliangyi2007 2009-03-24  
昨天上午上JE,堵了好久的说,不知道跟R胖说的这个有关否!
32 楼 tanggq 2009-03-24  
ror好处是开发快,但部署好象就不那容易了

这个比apache+PHP基本上不会存在这个问题

这个是许多网站前台均用php的原因
31 楼 bachmozart 2009-03-24  
是不是 rails 这种东西只能当作前端使用,压力主要是由后端承担

比如 很多互联网门户 基本上都是使用 php +c 的
php负责前端,c写的底层来承担大访问压力


30 楼 jejwe 2009-03-24  
现在ruby的轻型轮子也越来越多了
29 楼 花花公子 2009-03-24  
原来还想等rails2.3推出后,推行我的rails metal+sinatra的平滑过渡计划呢。
没有想到2.3性能这么差,希望rails team能赶快解决这个问题,好能够让rails和sinatra和谐相处。
28 楼 potian 2009-03-24  
robbin 写道
duker 写道
robbin 写道
duker 写道
shaka 写道
可以理解,看来ROR还是高级玩具。
不知道Robbin有没有上了贼船的感觉


好像看到一个测试数据, python 应该是动态语言里面速度最快的,
robbin当初为何没有选择python 呢?


你去python社区看看就知道,web框架没有一个真正令人满意的,于是新的轮子还在不断涌现中......


难有十全十美的事情,如果python 的性能真的比ruby好,加上python 的代码可读性比ruby强,
我觉得这两点就有理由弃ruby而选python.


Java的性能比Python要好的多,而且Java的代码,那个静态语言,可读性比Python强多了,照你的理由,绝对可以弃Python和ruby,而选择Java。

你目前这样的硬件撑这样的访问量,说明rails的性能很不错了,再加上rails的scaling能力和php/python基本一样
看起来rails基本上可以对付任何普通web端的事情了

其它方面的问题例如在线聊天需要的消息传递,或许可以尝试用erlang来解决




27 楼 robbin 2009-03-24  
duker 写道
robbin 写道
duker 写道
shaka 写道
可以理解,看来ROR还是高级玩具。
不知道Robbin有没有上了贼船的感觉


好像看到一个测试数据, python 应该是动态语言里面速度最快的,
robbin当初为何没有选择python 呢?


你去python社区看看就知道,web框架没有一个真正令人满意的,于是新的轮子还在不断涌现中......


难有十全十美的事情,如果python 的性能真的比ruby好,加上python 的代码可读性比ruby强,
我觉得这两点就有理由弃ruby而选python.


Java的性能比Python要好的多,而且Java的代码,那个静态语言,可读性比Python强多了,照你的理由,绝对可以弃Python和ruby,而选择Java。
26 楼 duker 2009-03-24  
robbin 写道
duker 写道
shaka 写道
可以理解,看来ROR还是高级玩具。
不知道Robbin有没有上了贼船的感觉


好像看到一个测试数据, python 应该是动态语言里面速度最快的,
robbin当初为何没有选择python 呢?


你去python社区看看就知道,web框架没有一个真正令人满意的,于是新的轮子还在不断涌现中......


难有十全十美的事情,如果python 的性能真的比ruby好,加上python 的代码可读性比ruby强,
我觉得这两点就有理由弃ruby而选python.
25 楼 robbin 2009-03-24  
duker 写道
shaka 写道
可以理解,看来ROR还是高级玩具。
不知道Robbin有没有上了贼船的感觉


好像看到一个测试数据, python 应该是动态语言里面速度最快的,
robbin当初为何没有选择python 呢?


你去python社区看看就知道,web框架没有一个真正令人满意的,于是新的轮子还在不断涌现中......
24 楼 richyzhang 2009-03-24  
Raecoo 写道
Merb集成进来后没有进行大量的测试就急于发布,哎~
用着真是危险,两团队估计现在还是貌合神离着呢


2.3基本还没有merb什么事情.
23 楼 Raecoo 2009-03-24  
Merb集成进来后没有进行大量的测试就急于发布,哎~
用着真是危险,两团队估计现在还是貌合神离着呢
22 楼 duker 2009-03-24  
shaka 写道
可以理解,看来ROR还是高级玩具。
不知道Robbin有没有上了贼船的感觉


好像看到一个测试数据, python 应该是动态语言里面速度最快的,
robbin当初为何没有选择python 呢?
21 楼 richyzhang 2009-03-24  
robbin 写道
neodoxy 写道
期待Merb在Rails里发挥更大作用


老实说我真的不指望。看看那帮人,包括DHH整天吹捧mod_rails我就知道指望不上。mod_rails这种玩意,我就说一句话,高负载的Rails网站用mod_rails是不负责任的。

以JavaEye目前的大流量和低端硬件,只有lighttpd/fcgi能稳定的支撑下来,其它的什么thin/mongrel/mod_rails只要一上,统统堵住。他们这些人如果没有像我们这样的切肤之痛,是不可能重视这个问题的。


mod_rails确实不错的,不过搭配着apache性能就只能一般般了.但是如果mod_rails是推出nginx版的,那恐怕很难达到现在的热度.
另外就是硬件对于老外来说比起我们便宜的多,对老外来说直接升硬件了事.再说,javaeye现在看来已经是100w pv每天了,如果只是一台机器的话,而且还是三四年前的amd芯片,那么性能这块也算过关了.
20 楼 robbin 2009-03-24  
sg552 写道
ROBBIN 应该给rails team发个各种数据对比的EMAIL.

然后被rails招进去,专门负责 performance....


rails对我来说就是一个用来做网站的工具,我没兴趣丢掉自己的事业不干,跑去钻研一个工具的性能好坏。
19 楼 robbin 2009-03-24  
ilicis 写道
不懂ror瞎问一下
不知道JE的memcache命中率怎么样?
之前用过Nginx的memcache模块觉得挺爽


命中率95.7%
18 楼 shaka 2009-03-24  
可以理解,看来ROR还是高级玩具。
不知道Robbin有没有上了贼船的感觉
17 楼 tanggq 2009-03-24  
Ruby version 1.8.6 (i386-mswin32)
RubyGems version 1.3.1
Rails version 2.2.2
Database adapter mysql

偶现在的开发环境,发现rails许多插件变化太快了,而且不一定兼容rails
,rails根不本敢随便升级

另外就是进程,本地环境慢的不行,服务器端用是apache代理,稍好一些







相关推荐

Global site tag (gtag.js) - Google Analytics