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

我怎么就觉得rails适合做大型应用

浏览 104771 次
该帖已经被评为良好帖
作者 正文
   发表时间:2008-08-26  
刑天战士 写道
robbin 写道
ray_linn 写道
一个烂的VM是支撑不起一个企业应用的。


的确,一个烂的VM支撑不了一个企业应用,但是一堆烂的VM就可以支撑一个企业应用了。所以我一直反复强调,Rails部署要多进程,要多进程,哈哈。

事实上Rails的多进程部署方式巧妙的规避了RubyVM的绝大多数问题,而代价就是要多吃猛吃内存,好在内存条便宜,只管加就是。



我们用apache+mongrel,配合一个叫god的监控gem(老板喜欢尝鲜,不愿意用大家都用的monit)。准备换成passenger的形式,不知道会不会更好……

rails绝对是吃内存的大户……而且对IO要求很高……


monit我研究过,用起来太麻烦,我自己写一个shell脚本就搞定了,总共40行代码而已。

Passenger只能稍微节省一点点内存而已,效果并不大。因为Ruby进程吃内存的地方主要在于堆地址分配,不在于共享库的加载。Passenger只能节省共享库加载的地址空间,但并不能让多进程共享堆地址空间(如果真能共享堆地址,其实麻烦更大)。

Rails的硬盘IO要求是很低的。

下图是一个Ruby进程的物理内存映射表,堆内存占据的空间是我抽取出来的三行:

00000000005d4000 125260K rwx--    [ anon ]
0000002a95c23000  23456K rw---    [ anon ]
0000002a99186000  50980K rw---    [ anon ]


0000000000400000    760K r-x--  /usr/local/ruby/bin/ruby
00000000005bd000     92K rw---  /usr/local/ruby/bin/ruby
00000000005d4000 125260K rwx--    [ anon ]
0000002a95556000     84K r-x--  /lib64/ld-2.3.3.so
0000002a9556b000     12K rw---    [ anon ]
0000002a9556e000     24K r--s-  /usr/lib64/gconv/gconv-modules.cache
0000002a95574000      4K rw---    [ anon ]
0000002a95577000     12K rw---    [ anon ]
0000002a9557a000    204K r----  /usr/lib/locale/en_US.utf8/LC_CTYPE
0000002a9566a000     12K rw---  /lib64/ld-2.3.3.so
0000002a9566d000      8K r-x--  /lib64/libdl.so.2
0000002a9566f000   1024K -----  /lib64/libdl.so.2
0000002a9576f000      4K rw---  /lib64/libdl.so.2
0000002a95770000     36K r-x--  /lib64/libcrypt.so.1
0000002a95779000   1020K -----  /lib64/libcrypt.so.1
0000002a95878000      8K rw---  /lib64/libcrypt.so.1
0000002a9587a000    184K rw---    [ anon ]
0000002a958a8000    336K r-x--  /lib64/tls/libm.so.6
0000002a958fc000   1024K -----  /lib64/tls/libm.so.6
0000002a959fc000     16K rw---  /lib64/tls/libm.so.6
0000002a95a00000   1068K r-x--  /lib64/tls/libc.so.6
0000002a95b0b000   1020K -----  /lib64/tls/libc.so.6
0000002a95c0a000    100K rw---  /lib64/tls/libc.so.6
0000002a95c23000  23456K rw---    [ anon ]
0000002a9730c000     16K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/thread.so
0000002a97310000   1020K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/thread.so
0000002a9740f000      4K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/thread.so
0000002a97410000     32K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/zlib.so
0000002a97418000   1020K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/zlib.so
0000002a97517000      8K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/zlib.so
0000002a97519000     72K r-x--  /lib64/libz.so.1.2.1
0000002a9752b000   1024K -----  /lib64/libz.so.1.2.1
0000002a9762b000      4K rw---  /lib64/libz.so.1.2.1
0000002a9762c000     40K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/socket.so
0000002a97636000   1020K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/socket.so
0000002a97735000      8K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/socket.so
0000002a97737000     20K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/stringio.so
0000002a9773c000   1020K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/stringio.so
0000002a9783b000      4K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/stringio.so
0000002a9783c000      8K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/etc.so
0000002a9783e000   1024K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/etc.so
0000002a9793e000      4K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/etc.so
0000002a9793f000    236K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/nkf.so
0000002a9797a000   1024K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/nkf.so
0000002a97a7a000     20K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/nkf.so
0000002a97a7f000      4K rw---    [ anon ]
0000002a97a80000     40K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/bigdecimal.so
0000002a97a8a000   1020K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/bigdecimal.so
0000002a97b89000      8K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/bigdecimal.so
0000002a97b8b000    108K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/syck.so
0000002a97ba6000   1024K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/syck.so
0000002a97ca6000     12K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/syck.so
0000002a97ca9000     16K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/strscan.so
0000002a97cad000   1024K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/strscan.so
0000002a97dad000      4K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/strscan.so
0000002a97dae000      4K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/fcntl.so
0000002a97daf000   1024K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/fcntl.so
0000002a97eaf000      4K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/fcntl.so
0000002a97eb0000      4K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/digest/md5.so
0000002a97eb1000   1024K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/digest/md5.so
0000002a97fb1000      4K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/digest/md5.so
0000002a97fb2000    988K r-x--  /usr/lib64/libcrypto.so.0.9.7
0000002a980a9000   1024K -----  /usr/lib64/libcrypto.so.0.9.7
0000002a981a9000    216K rw---  /usr/lib64/libcrypto.so.0.9.7
0000002a981df000     16K rw---    [ anon ]
0000002a981e3000     12K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/digest.so
0000002a981e6000   1020K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/digest.so
0000002a982e5000      4K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/digest.so
0000002a982e6000    228K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/openssl.so
0000002a9831f000   1020K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/openssl.so
0000002a9841e000     32K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/openssl.so
0000002a98426000    184K r-x--  /usr/lib64/libssl.so.0.9.7
0000002a98454000   1024K -----  /usr/lib64/libssl.so.0.9.7
0000002a98554000     28K rw---  /usr/lib64/libssl.so.0.9.7
0000002a9855b000      4K rw---    [ anon ]
0000002a9855c000     16K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/racc/cparse.so
0000002a98560000   1020K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/racc/cparse.so
0000002a9865f000      4K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/racc/cparse.so
0000002a98660000     16K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/iconv.so
0000002a98664000   1020K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/iconv.so
0000002a98763000      4K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/iconv.so
0000002a98764000    320K r-x--  /usr/local/ruby/lib/ruby/gems/1.8/gems/memcached-0.10/lib/rlibmemcached.so
0000002a987b4000   1024K -----  /usr/local/ruby/lib/ruby/gems/1.8/gems/memcached-0.10/lib/rlibmemcached.so
0000002a988b4000     16K rw---  /usr/local/ruby/lib/ruby/gems/1.8/gems/memcached-0.10/lib/rlibmemcached.so
0000002a988b8000     40K r-x--  /usr/local/lib/libmemcached.so.2.0.0
0000002a988c2000   1020K -----  /usr/local/lib/libmemcached.so.2.0.0
0000002a989c1000      8K rw---  /usr/local/lib/libmemcached.so.2.0.0
0000002a989c3000      4K r-x--  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/digest/sha1.so
0000002a989c4000   1024K -----  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/digest/sha1.so
0000002a98ac4000      4K rw---  /usr/local/ruby/lib/ruby/1.8/x86_64-linux/digest/sha1.so
0000002a98ac5000     60K r-x--  /usr/local/ruby/lib/ruby/gems/1.8/gems/hpricot-0.6/lib/i686-linux/hpricot_scan.so
0000002a98ad4000   1020K -----  /usr/local/ruby/lib/ruby/gems/1.8/gems/hpricot-0.6/lib/i686-linux/hpricot_scan.so
0000002a98bd3000      4K rw---  /usr/local/ruby/lib/ruby/gems/1.8/gems/hpricot-0.6/lib/i686-linux/hpricot_scan.so
0000002a98bd4000    588K r-x--  /usr/local/ruby/lib/ruby/gems/1.8/gems/ferret-0.11.6/lib/ferret_ext.so
0000002a98c67000   1024K -----  /usr/local/ruby/lib/ruby/gems/1.8/gems/ferret-0.11.6/lib/ferret_ext.so
0000002a98d67000    184K rw---  /usr/local/ruby/lib/ruby/gems/1.8/gems/ferret-0.11.6/lib/ferret_ext.so
0000002a98d95000      8K rw---    [ anon ]
0000002a98d97000     24K r-x--  /usr/local/ruby/lib/ruby/gems/1.8/gems/rmmseg-cpp-0.2.5/ext/rmmseg/rmmseg.so
0000002a98d9d000   1024K -----  /usr/local/ruby/lib/ruby/gems/1.8/gems/rmmseg-cpp-0.2.5/ext/rmmseg/rmmseg.so
0000002a98e9d000      4K rw---  /usr/local/ruby/lib/ruby/gems/1.8/gems/rmmseg-cpp-0.2.5/ext/rmmseg/rmmseg.so
0000002a98e9e000    696K r-x--  /usr/lib64/libstdc++.so.5.0.6
0000002a98f4c000   1024K -----  /usr/lib64/libstdc++.so.5.0.6
0000002a9904c000    116K rw---  /usr/lib64/libstdc++.so.5.0.6
0000002a99069000     72K rw---    [ anon ]
0000002a9907b000     40K r-x--  /lib64/libgcc_s.so.1
0000002a99085000   1020K -----  /lib64/libgcc_s.so.1
0000002a99184000      8K rw---  /lib64/libgcc_s.so.1
0000002a99186000  50980K rw---    [ anon ]
0000002a9c34f000     16K r-x--  /usr/local/ruby/lib/ruby/site_ruby/1.8/x86_64-linux/fcgi.so
0000002a9c353000   1020K -----  /usr/local/ruby/lib/ruby/site_ruby/1.8/x86_64-linux/fcgi.so
0000002a9c452000      4K rw---  /usr/local/ruby/lib/ruby/site_ruby/1.8/x86_64-linux/fcgi.so
0000002a9c453000     36K r-x--  /usr/local/fcgi/lib/libfcgi.so.0.0.0
0000002a9c45c000   1024K -----  /usr/local/fcgi/lib/libfcgi.so.0.0.0
0000002a9c55c000      8K rw---  /usr/local/fcgi/lib/libfcgi.so.0.0.0
0000002a9c55e000     68K r-x--  /lib64/libnsl.so.1
0000002a9c56f000   1024K -----  /lib64/libnsl.so.1
0000002a9c66f000     12K rw---  /lib64/libnsl.so.1
0000002a9c672000      8K rw---    [ anon ]
0000002a9c674000     76K r-x--  /usr/local/ruby/lib/ruby/site_ruby/1.8/x86_64-linux/mysql.so
0000002a9c687000   1020K -----  /usr/local/ruby/lib/ruby/site_ruby/1.8/x86_64-linux/mysql.so
0000002a9c786000      8K rw---  /usr/local/ruby/lib/ruby/site_ruby/1.8/x86_64-linux/mysql.so
0000002a9c788000    264K r-x--  /opt/mysql5/lib/mysql/libmysqlclient.so.15.0.0
0000002a9c7ca000   1024K -----  /opt/mysql5/lib/mysql/libmysqlclient.so.15.0.0
0000002a9c8ca000    340K rw---  /opt/mysql5/lib/mysql/libmysqlclient.so.15.0.0
0000002a9c91f000      4K rw---    [ anon ]
0000002a9c920000     36K r-x--  /lib64/libnss_files.so.2
0000002a9c929000   1020K -----  /lib64/libnss_files.so.2
0000002a9ca28000      8K rw---  /lib64/libnss_files.so.2
0000002a9ca2a000   6808K rw---    [ anon ]
0000002a9d0d0000     12K r-x--  /usr/lib64/gconv/EUC-CN.so
0000002a9d0d3000   1024K -----  /usr/lib64/gconv/EUC-CN.so
0000002a9d1d3000      4K rw---  /usr/lib64/gconv/EUC-CN.so
0000002a9d1d4000     64K r-x--  /usr/lib64/gconv/libGB.so
0000002a9d1e4000   1020K -----  /usr/lib64/gconv/libGB.so
0000002a9d2e3000      4K rw---  /usr/lib64/gconv/libGB.so
0000007fbeddd000  18572K rw---    [ stack ]
ffffffffff600000   8192K -----    [ anon ]
 total           280676K
0 请登录后投票
   发表时间:2008-08-26  
建议 ltian 保持一颗开放的心态,乐观的接受新事物。

看到大家上面那么多帖子,让我也收获很大。

学习Ruby on Rails, 看来是我近期的重点工作了!
7 请登录后投票
   发表时间:2008-08-26  
robbin 写道
liuqiang 写道
ray_linn 写道
一个烂的VM是支撑不起一个企业应用的。

 

 我很大一部分就是针对你这种观点而写的,把应用分开,合理的分,rails鼓励你去分,一个好的VM也难支撑起一个企业应用的

 

另外,貌似几年前很多做c++的就嘲笑JVM的性能

 

这句话说的很棒!的确一个好的VM也无法支持一个大型企业应用。在我接触过的大型企业应用,往往都要水平+垂直群集部署,没见过一个JVM打天下的。

 

而且随着现在PC服务器的CPU数量猛增,以及内存容量的不断增加,单机部署多个JVM已经是一个非常迫切的话题了。一个JVM的堆内存不宜超过2GB,否则FullGC会非常恐怖,事实上堆内存以少于1G为宜,那么现在PC服务器动不动8G,16G,32G内存,你怎么办?只能多个JVM组成群集一起跑,充分利用CPU的多核,以及超大的物理内存。

 

 

恰恰相反,在企业中单JVM 的应用也是很多的,而多JVM的应用恰恰反而比较少数。

 

从某种意义上,部署Ruby可能需要考虑的冗错的问题抵消了Ruby的效率。这就是好的VM和差的VM之区别。

0 请登录后投票
   发表时间:2008-08-26  
ray_linn 写道
从某种意义上,部署Ruby可能需要考虑的冗错的问题抵消了Ruby的效率。这就是好的VM和差的VM之区别。

什么意思?
0 请登录后投票
   发表时间:2008-08-26  
PS:

支持起企业应用的,是“能开发企业应用”的人,而不是靠某种啥有的没的。
SQL, Cobol, C, java, C# 都曾经在大型企业应用中出现过。

0 请登录后投票
   发表时间:2008-08-26  
ray_linn 写道
PS:

支持起企业应用的,是“能开发企业应用”的人,而不是靠某种啥有的没的。
SQL, Cobol, C, java, C# 都曾经在大型企业应用中出现过。



这个说得很在理

事实上我经常在rails中去调用其他语言(主要是JAVA、C)的一些库、工具、函数。
一般用facebook的thrift

纠结于某语言/框架不能做什么实在很没意思。

每种钢用在合适的刀刃上就可以了。
0 请登录后投票
   发表时间:2008-08-26  
如果企业应用不需要web,不需要MVC,Rails有何用武之地?
在银行里,字符终端还是很盛行的。
0 请登录后投票
   发表时间:2008-08-26  
gigix 写道
ray_linn 写道
从某种意义上,部署Ruby可能需要考虑的冗错的问题抵消了Ruby的效率。这就是好的VM和差的VM之区别。

什么意思?


这个我是假设为了防止ruby vm的出错,可能需要mirror节点,具体的,我没用过ruby,不知道。
0 请登录后投票
   发表时间:2008-08-26  
ray_linn 写道
如果企业应用不需要web,不需要MVC,Rails有何用武之地?
在银行里,字符终端还是很盛行的。

其实重点不在于Rails
而是混合语言编程:一种坚实的基础语言,一种快速开发应用程序的通用语言,多种DSL
0 请登录后投票
   发表时间:2008-08-26  
ray_linn 写道
gigix 写道
ray_linn 写道
从某种意义上,部署Ruby可能需要考虑的冗错的问题抵消了Ruby的效率。这就是好的VM和差的VM之区别。

什么意思?

这个我是假设为了防止ruby vm的出错,可能需要mirror节点,具体的,我没用过ruby,不知道。

实际上rails应用部署天生就是多服务器集群
0 请登录后投票
论坛首页 编程语言技术版

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