- 浏览: 4825970 次
- 性别:
- 来自: 上海
博客专栏
-
robbin谈管理
浏览量:137469
文章分类
最新评论
-
xly1981:
领导者是团队的灵魂。深入一线的过程,包括代码review,能帮 ...
robbin谈管理:改造团队的经验(2) -
jiehuangwei:
像这种总结比较性的ppt文档可以多发啊
Web并发模型粗浅探讨 -
linux1308:
看完学习到了很多东西,感谢推荐!
推荐一篇很好的RoR部署方案性能评测 -
zweite:
直接对搜索的结果进行缓存是不是会更快一点呢
漫谈应用缓存的命中率问题 -
kaogua:
现在已经是ruby2.0了, 不知道这个的效率是怎么样的, 是 ...
Ruby作为服务器端应用已经成熟了
这是一篇我们运营JavaEye网站将近半年时间所得到经验的总结。目前在整个rails社区,都极少有运营rails大访问量网站经验的人详细的谈这个话题。至于国内,rails应用都停留在学习和尝试阶段,真正投入商业运营的基本找不到,所以谈这个话题为时太早,颇有对牛弹琴的感觉。所以权当是个人的总结性文章吧,也不会很详细的展开谈论,能对大家有所启发就好。
一、硬件
1、CPU
ruby解析器相对于JVM,PHP解析器来说,比较低效,可能会导致比较多的context switch,因此提高CPU和内存之间的总线带宽和传输速度会对ruby应用有比较大的性能提升。在目前主流的x86_64 CPU当中,AMD Opteron在CPU芯片内置内存控制器,可以有效提高CPU和内存数据交换速度,提高context switch能力。所以用AMD Opteron比Intel Xeon EM64T性能要好很多。
2、物理内存
ruby是以进程方式运行的,rails应用的并发响应能力主要取决于ruby进程的数量。一个最简单的rails应用,一个ruby进程占用的物理内存一般不过30-40MB,但是对于真正复杂的,而且数据库访问频繁,数据量大的rails应用来说,ruby进程稳定的物理内存占用至少100多MB,经常达到200多MB,甚至300MB。以开10个ruby进程计算,那么物理内存使用上限就是3GB,所以4GB物理内存是起码的。
二、操作系统
1、Linux distro
对于AMD x86_64的CPU来说,SLES要比RHEL有更多的优化。
2、32位版本还是64位版本
应该使用64位版本操作系统,以充分发挥x86_64 CPU的性能,并且x86_64的Linux很多Kernel参数也大很多,代价就是需要更多的物理内存。所以内存多多益善。
3、文件系统
rails会对每个浏览器会话在硬盘生成session文件,一个繁忙的网站,临时文件目录下面有上万乃至几万个session文件是很常见的现象。对于这种目录下面几万个小文件的存取,reiserfs要比ext3性能好很多倍。
三、Web Server
主流的选择是apache2.2,lighttpd,litespeed。apache2.2可以首先排除,lighttpd和litespeed都不错,但我会选择开源免费的lighttpd。至于lighttpd的各种优化参数这里不谈。
四、ruby的部署
1、ruby GC
可以使用railsbench提供的GC patch,以优化ruby内存使用,降低GC频率,提高throughput,代价就是ruby进程的物理内存占用加倍。所以物理内存越多越好,4G根本不够用,8G,16G绝对不嫌多。
2、FCGI还是mongrel
ruby进程可以以FCGI方式来运行,以FastCGI协议和Web Server通讯,也可以以HTTP Server方式来运行(即Mongrel),以HTTP协议和Web Server通讯,这两种方式性能上没有什么差异。FCGI方式,在单机上面通过Unix Socket和Web Server通讯,效率比走TCP Port要高。
3、开多少个ruby进程
ruby进程数量和web server的connection数量的比例没有定规,少了多了都会降低性能,要靠实践去摸索,也要参考CPU和内存资源的使用状况。
五、应用程序
1、避免使用component
2、hash的key使用symbol
3、对于ORM来说,数据库的表设计的原则是颗粒度应该小一些,把常用字段和不常用字段尽量分离到不同表,严重影响性能的大字段分离到单独的表
4、在不使用对象缓存的情况下,查询方法的:include可以预加载关联对象,避免n+1问题
六、缓存
1、rails的页面缓存,Action缓存和片断缓存
rails提供的缓存方式可以有效降低对应用服务器的负载,但是缓存颗粒度太粗,适应范围比较狭窄,缓存过期的处理比较烦琐。
2、对象缓存
rails应用本身是可以水平扩展的,性能瓶颈往往还是数据库访问,使用CachedModel对象缓存可以有效降低数据库负载,但CachedModel不像Hibernate二级缓存那么强大,不能够针对非主键查询进行缓存读取,不能针对非主键查询进行缓存填充,和file-column有冲突,需要自行覆盖model对象的save方法等等。另外在使用对象缓存的情况下,应该把查询方法的:include去掉,避免关联查询无法利用缓存的现象。
3、查询缓存
对于统计类耗时查询,如果不要求实时性,那么可以使用memcache-client将查询结果缓存到memcached里面。
七、Session的存储方式
由于Linux文件系统的高效性以及操作系统使用内存来做disk cache,因此默认使用硬盘文件保存session,并不会带来性能瓶颈,使用memcached并不会提高多少IO性能。如果一定要优化session硬盘读取,除了memcached,可以使用RAMDISK。
为什么我的问题呢?
使用硬盘文件/RAMDISK保存session, 怎么做到系统的scaling?
我还真不觉得HTTP Proxy方案好,而且lighttpd当前的版本的HTTP Proxy的balance能力很差。Apache2.2就不用提了。
robbin试用过最新的 lighttpd-1.5.0-r1605 没有, 我感觉配上mongrel 还不错
从lighttpd作者的博客来看,lighttpd1.5.0还在疯狂的添加各种新特性的试验过程中,不适合跑生产环境。当然等lighttpd1.5.0正式发布以后,性能会有一个飞跃。
前面我说过了,即使对于lighttpd1.5.0来说,FCGI和HTTP也没有多大区别,FCGI和HTTP Proxy都已经整合到一个module代码里面去了。由于lighttpd自己处理静态资源,对于FCGI和Mongrel来说,单纯处理动态资源两者没有什么性能区别。而且真要追究细节,FCGI在本机可以走Unix Socket,通讯效率还更高,此外HTTP Proxy走Mongrel还有一个编程上的麻烦,由于proxy过来,Mongrel拿到的来源IP就是lighttpd,不是真实的用户IP。
我还真不觉得HTTP Proxy方案好,而且lighttpd当前的版本的HTTP Proxy的balance能力很差。Apache2.2就不用提了。
robbin试用过最新的 lighttpd-1.5.0-r1605 没有, 我感觉配上mongrel 还不错
我还真不觉得HTTP Proxy方案好,而且lighttpd当前的版本的HTTP Proxy的balance能力很差。Apache2.2就不用提了。
ps, top, vmstat, iostat
搜索以前robbin的帖子里面有。
一、硬件
1、CPU
ruby解析器相对于JVM,PHP解析器来说,比较低效,可能会导致比较多的context switch,因此提高CPU和内存之间的总线带宽和传输速度会对ruby应用有比较大的性能提升。在目前主流的x86_64 CPU当中,AMD Opteron在CPU芯片内置内存控制器,可以有效提高CPU和内存数据交换速度,提高context switch能力。所以用AMD Opteron比Intel Xeon EM64T性能要好很多。
2、物理内存
ruby是以进程方式运行的,rails应用的并发响应能力主要取决于ruby进程的数量。一个最简单的rails应用,一个ruby进程占用的物理内存一般不过30-40MB,但是对于真正复杂的,而且数据库访问频繁,数据量大的rails应用来说,ruby进程稳定的物理内存占用至少100多MB,经常达到200多MB,甚至300MB。以开10个ruby进程计算,那么物理内存使用上限就是3GB,所以4GB物理内存是起码的。
二、操作系统
1、Linux distro
对于AMD x86_64的CPU来说,SLES要比RHEL有更多的优化。
2、32位版本还是64位版本
应该使用64位版本操作系统,以充分发挥x86_64 CPU的性能,并且x86_64的Linux很多Kernel参数也大很多,代价就是需要更多的物理内存。所以内存多多益善。
3、文件系统
rails会对每个浏览器会话在硬盘生成session文件,一个繁忙的网站,临时文件目录下面有上万乃至几万个session文件是很常见的现象。对于这种目录下面几万个小文件的存取,reiserfs要比ext3性能好很多倍。
三、Web Server
主流的选择是apache2.2,lighttpd,litespeed。apache2.2可以首先排除,lighttpd和litespeed都不错,但我会选择开源免费的lighttpd。至于lighttpd的各种优化参数这里不谈。
四、ruby的部署
1、ruby GC
可以使用railsbench提供的GC patch,以优化ruby内存使用,降低GC频率,提高throughput,代价就是ruby进程的物理内存占用加倍。所以物理内存越多越好,4G根本不够用,8G,16G绝对不嫌多。
2、FCGI还是mongrel
ruby进程可以以FCGI方式来运行,以FastCGI协议和Web Server通讯,也可以以HTTP Server方式来运行(即Mongrel),以HTTP协议和Web Server通讯,这两种方式性能上没有什么差异。FCGI方式,在单机上面通过Unix Socket和Web Server通讯,效率比走TCP Port要高。
3、开多少个ruby进程
ruby进程数量和web server的connection数量的比例没有定规,少了多了都会降低性能,要靠实践去摸索,也要参考CPU和内存资源的使用状况。
五、应用程序
1、避免使用component
2、hash的key使用symbol
3、对于ORM来说,数据库的表设计的原则是颗粒度应该小一些,把常用字段和不常用字段尽量分离到不同表,严重影响性能的大字段分离到单独的表
4、在不使用对象缓存的情况下,查询方法的:include可以预加载关联对象,避免n+1问题
六、缓存
1、rails的页面缓存,Action缓存和片断缓存
rails提供的缓存方式可以有效降低对应用服务器的负载,但是缓存颗粒度太粗,适应范围比较狭窄,缓存过期的处理比较烦琐。
2、对象缓存
rails应用本身是可以水平扩展的,性能瓶颈往往还是数据库访问,使用CachedModel对象缓存可以有效降低数据库负载,但CachedModel不像Hibernate二级缓存那么强大,不能够针对非主键查询进行缓存读取,不能针对非主键查询进行缓存填充,和file-column有冲突,需要自行覆盖model对象的save方法等等。另外在使用对象缓存的情况下,应该把查询方法的:include去掉,避免关联查询无法利用缓存的现象。
3、查询缓存
对于统计类耗时查询,如果不要求实时性,那么可以使用memcache-client将查询结果缓存到memcached里面。
七、Session的存储方式
由于Linux文件系统的高效性以及操作系统使用内存来做disk cache,因此默认使用硬盘文件保存session,并不会带来性能瓶颈,使用memcached并不会提高多少IO性能。如果一定要优化session硬盘读取,除了memcached,可以使用RAMDISK。
评论
16 楼
lanhuai
2007-04-27
lanhuai 写道
javaeye的论坛帖子做分表了吗?Rails上做分表好像没有先成的东西,我也在寻找解决方案。
为什么我的问题呢?
15 楼
lanhuai
2007-04-17
javaeye的论坛帖子做分表了吗?Rails上做分表好像没有先成的东西,我也在寻找解决方案。
14 楼
whisper
2007-03-06
现在用nginx
比lighty还要爽
比lighty还要爽
13 楼
lcycenter
2007-02-07
引用
由于Linux文件系统的高效性以及操作系统使用内存来做disk cache,因此默认使用硬盘文件保存session,并不会带来性能瓶颈,使用memcached并不会提高多少IO性能。如果一定要优化 session硬盘读取,除了memcached,可以使用RAMDISK。
使用硬盘文件/RAMDISK保存session, 怎么做到系统的scaling?
12 楼
robbin
2007-02-06
capitain 写道
robbin 写道
gigix 写道
现在推荐的部署方案是HTTP Proxying了,FastCGI不太好用的说。
我还真不觉得HTTP Proxy方案好,而且lighttpd当前的版本的HTTP Proxy的balance能力很差。Apache2.2就不用提了。
robbin试用过最新的 lighttpd-1.5.0-r1605 没有, 我感觉配上mongrel 还不错
从lighttpd作者的博客来看,lighttpd1.5.0还在疯狂的添加各种新特性的试验过程中,不适合跑生产环境。当然等lighttpd1.5.0正式发布以后,性能会有一个飞跃。
前面我说过了,即使对于lighttpd1.5.0来说,FCGI和HTTP也没有多大区别,FCGI和HTTP Proxy都已经整合到一个module代码里面去了。由于lighttpd自己处理静态资源,对于FCGI和Mongrel来说,单纯处理动态资源两者没有什么性能区别。而且真要追究细节,FCGI在本机可以走Unix Socket,通讯效率还更高,此外HTTP Proxy走Mongrel还有一个编程上的麻烦,由于proxy过来,Mongrel拿到的来源IP就是lighttpd,不是真实的用户IP。
11 楼
capitain
2007-02-05
robbin 写道
gigix 写道
现在推荐的部署方案是HTTP Proxying了,FastCGI不太好用的说。
我还真不觉得HTTP Proxy方案好,而且lighttpd当前的版本的HTTP Proxy的balance能力很差。Apache2.2就不用提了。
robbin试用过最新的 lighttpd-1.5.0-r1605 没有, 我感觉配上mongrel 还不错
10 楼
tsing
2007-02-05
robbin 对比过nginx和lightty否?
9 楼
Jan
2007-02-05
对于大量小文件的存取,xfs可能会有更好的性能,不知道javaeye有没有做过对比。
要调整性能可以试试ruby自带的benchmark和profile库
要调整性能可以试试ruby自带的benchmark和profile库
8 楼
rsu
2007-02-04
robin果然是国内ror的前辈,我目前也正打算用ror开发一些大流量的网站,由于以前一直用mac,win下就用.net,现在需要改用linux来部署(XServe……买不起),所以希望可以和你多多交流经验,不只你有gtalk或msn否?
7 楼
javafifth
2007-02-02
我在准备用 Rails 开发一个网站,编程也差不多了,但从没有布暑的经验。我在找一些资料来帮助自己,而你的二篇有关此方面的文章,让我受益不浅,感谢你写的东西。
有问题的话我会多向你请教,还请你到时不吝指教一,二。
有问题的话我会多向你请教,还请你到时不吝指教一,二。
6 楼
robbin
2007-02-02
gigix 写道
现在推荐的部署方案是HTTP Proxying了,FastCGI不太好用的说。
我还真不觉得HTTP Proxy方案好,而且lighttpd当前的版本的HTTP Proxy的balance能力很差。Apache2.2就不用提了。
5 楼
robbin
2007-02-02
DigitalSonic 写道
看了老大的这篇文章大概有些数目了,我朋友做个rails的站点,服务器的配置没有javaeye的高,但pageview的量也不大,可是总觉得性能没上去,他希望我帮他调优,不过我对rails的调优没什么经验,但感觉他是配置不当造成的,具体情况我还没看过,不知道大概应该用些什么工具监控哪些东西呢?当然是开源的就最好了,呵呵。
ps, top, vmstat, iostat
4 楼
gigix
2007-02-02
现在推荐的部署方案是HTTP Proxying了,FastCGI不太好用的说。
3 楼
DigitalSonic
2007-02-02
看了老大的这篇文章大概有些数目了,我朋友做个rails的站点,服务器的配置没有javaeye的高,但pageview的量也不大,可是总觉得性能没上去,他希望我帮他调优,不过我对rails的调优没什么经验,但感觉他是配置不当造成的,具体情况我还没看过,不知道大概应该用些什么工具监控哪些东西呢?当然是开源的就最好了,呵呵。
2 楼
ouspec
2007-02-01
lanhuai 写道
javaeye现在的服务器是什么配置呢?
搜索以前robbin的帖子里面有。
1 楼
lanhuai
2007-02-01
javaeye现在的服务器是什么配置呢?
发表评论
-
《松本行弘的程序世界》推荐序
2011-07-21 13:47 15305在流行的编程语言中,ruby是一个比较另类的存在,这是因为大多 ... -
从Rails聊聊小公司的研发团队建设
2011-03-23 10:49 37233首先分享一点数据吧: JavaEye的PV到了140万了,一 ... -
Ruby作为服务器端应用已经成熟了
2009-11-17 14:55 15975JavaEye网站在过去的Ruby on rails实践当中, ... -
基于资源的HTTP Cache的实现介绍
2009-09-05 00:27 17076我们都知道浏览器会缓 ... -
请注意Rails2.3自带的memcache-client有性能问题
2009-03-23 18:05 14511Rails2.3版本发布了,这个版本内部的改动非常大,相关介绍 ... -
监视Rails进程内存泄漏的技巧
2008-12-30 21:56 10972Rails应用比较容易遇到的两类性能问题:一类是Rails执行 ... -
ruby MBARI大补丁性能评测报告
2008-12-23 12:19 5075JavaEye之前的新闻ruby内存泄漏的罪魁祸首 - 幽灵指 ... -
在top监视窗口显示Rails当前正在执行的请求URL
2008-12-01 14:15 9863这是一个从PragDave的博客上面学来的技巧,很实用,很co ... -
对Ruby VM的GC的思考
2008-09-02 23:41 8987Ruby虽然是动态脚本语言 ... -
推荐一篇很好的RoR部署方案性能评测
2008-07-08 11:55 9680今年年初的时候,我写了一篇RoR部署方案深度剖析的文章,分析了 ... -
Ruby和Rails的缺点
2008-06-25 21:08 17409有人说,robbin你说了那么多RoR的优点,你啥时候说说Ro ... -
Skynet --- ruby的类Google Map/Reduce框架
2008-06-02 00:39 8303Skynet是一个很响亮的名 ... -
rmmseg-cpp - 简洁高效的ruby中文分词程序
2008-05-27 00:47 11243我在前一篇文章向大家 ... -
使用libmmseg实现Ruby的中文分词功能
2008-05-24 21:43 11337用Ruby on Rails开发web2.0网站的人都知道,r ... -
mod_rails尝鲜
2008-04-13 14:32 8086Passenger(俗称mod_rails)是 ... -
Lighttpd和RoR安装配置的疑难解答
2008-03-07 11:09 14866之前写过一篇在Linux平 ... -
JavaEye网站的RoR性能优化经验谈
2008-01-20 16:11 18467JavaEye网站从2006年9月11 ... -
RoR部署方案深度剖析
2008-01-14 03:10 14809RoR的部署方案可谓五花八门,有Apache/Fastcgi方 ... -
RoR网站如何利用lighttpd的X-sendfile功能提升文件下载性能
2008-01-12 17:45 10268传统的Web服务器在处理文件下载的时候,总是先读入文件内容到应 ... -
Ruby为什么会受程序员的欢迎?
2008-01-07 20:08 15755孟岩最近写了一篇博客 ...
相关推荐
- **部署、安全与性能**:讲解如何部署Ruby on Rails应用、实施安全措施以及优化性能。 #### 结语 通过这五天的课程,读者不仅能够系统地学习Ruby on Rails的核心概念和技术,还能了解到一些高级主题。无论是初学者...
Ruby on Rails,简称Rails,是基于Ruby编程语言的一个开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和代码的可读性。Rails以其“约定优于配置”(Convention over Configuration)...
对于更高级的主题,例如部署到服务器、性能优化、安全性和API开发,本书也会提供基础的引导,帮助读者了解实际生产环境下的Rails应用运维。 总的来说,《Ruby on Rails入门权威经典》是一本内容丰富、实践性强的...
10. 性能优化:Rails应用可以通过缓存、数据库索引、数据库连接池、延迟加载等技术提升性能。在线考试系统可能会大量使用缓存来减少数据库查询,提高响应速度。 以上是关于“ruby on rails在线考试系统”的主要知识...
总的来说,Ruby on Rails 的页面缓存机制是提高 web 应用性能的有效手段,但需要开发者根据实际需求灵活选择和实施。通过了解页面缓存的原理和实践,可以更好地优化 Rails 应用的性能,为用户提供更快的加载速度和更...
进阶篇则会涉及更复杂的主题,如性能优化、测试驱动开发(TDD)和行为驱动开发(BDD)。Rails鼓励开发者使用测试来确保代码质量,因此,Rspec和Capybara等测试工具的使用方法是重要的一环。另外,书中可能会讲解如何进行...
Ruby on Rails,简称Rails,是由David Heinemeier Hansson创建的一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和可读性。在这个开发环境包中,我们拥有Ruby ...
本文将深入探讨几种优化Rails应用性能的方法,特别是针对内存管理和垃圾回收(Garbage Collection, GC)等问题。 #### 导致Rails应用变慢的原因 通常来说,Rails应用变慢的原因可以归结为两大类: 1. **错误地选择...
- **Rails入门**:讲解如何安装配置Ruby on Rails环境,以及创建第一个Rails应用的过程。 - **数据库交互**:教授如何在Rails应用中使用ActiveRecord来操作数据库。 - **控制器与视图**:介绍Rails中的控制器和视图...
- **《Ruby on Rails 3 教程》**:由Michael Hartl编写的一本经典教材,被广泛认为是学习Rails的最佳资源之一。 - **教学方法**: - **示例驱动**:通过具体的项目示例来讲解Rails的各种功能。 - **循序渐进**:从...
- **部署**:讨论如何将Rails应用部署到生产环境中,包括选择合适的云服务提供商。 - **性能优化**:提供一些实用技巧提高应用的响应速度和效率。 #### 三、学习方法建议 - **实践为主**:通过实际编码来加深对概念...
《Ruby on Rails Enterprise Application Development》是一本专注于Ruby on Rails框架的书籍,主要讲述了如何利用Ruby on Rails开发企业级应用程序。本书作者是Elliot Smith和Rob Nichols,他们在IT行业有着丰富的...
此外,这些示例代码还能帮助开发者学习如何优化Rails应用,包括性能调优、错误处理和安全实践。 总之,《Ruby on Rails专业指南》是一本适合初学者和有经验的开发者的书籍,它全面覆盖了Ruby on Rails的各个方面,...
通过《Ruby on Rails 入门经典教程》,无论你是编程新手还是希望转行Web开发的计算机操作者,都可以系统地掌握Ruby on Rails的核心知识,开启Web开发之旅。aybook.cn_rinumzwb1227.pdf这份文档正是这个宝贵资源的...
- **性能优化**:可以采用缓存机制来提高应用性能。 - **错误处理**:实现异常处理逻辑,提升用户体验。 - **测试**:编写单元测试和集成测试,确保代码质量。 #### 六、总结 本项目展示了如何使用Ruby on Rails...
了解如何配置和管理gem可以帮助你优化应用性能和稳定性。 8. **配置**:Rails应用的配置信息位于`config`目录下,如`application.rb`和`environment.rb`。源代码揭示了如何根据环境(开发、测试、生产)调整应用...
Ruby on Rails,简称Rails,是基于Ruby...以上只是Ruby on Rails的部分基础知识,实际开发中还会涉及到更多如缓存、部署、安全性、性能优化等方面的知识。通过深入学习和实践,你可以更好地掌握这个强大的Web开发框架。
在Rails应用中,视图(View)部分通常包含HTML和CSS代码,通过 erb(Embedded Ruby)模板引擎,可以将Ruby代码嵌入到HTML中,实现动态内容的生成。 在实例开发过程中,我们可能首先会设置一个新的Rails项目,通过`...
Ruby on Rails 是一个基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,用于快速开发高效、优雅的web应用程序。Redmine则是一个用Ruby on Rails构建的项目管理软件,提供了任务跟踪、...