该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间: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 |
|
返回顶楼 | |
发表时间:2008-08-26
建议 ltian 保持一颗开放的心态,乐观的接受新事物。
看到大家上面那么多帖子,让我也收获很大。 学习Ruby on Rails, 看来是我近期的重点工作了! |
|
返回顶楼 | |
发表时间: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之区别。 |
|
返回顶楼 | |
发表时间:2008-08-26
ray_linn 写道 从某种意义上,部署Ruby可能需要考虑的冗错的问题抵消了Ruby的效率。这就是好的VM和差的VM之区别。
什么意思? |
|
返回顶楼 | |
发表时间:2008-08-26
PS:
支持起企业应用的,是“能开发企业应用”的人,而不是靠某种啥有的没的。 SQL, Cobol, C, java, C# 都曾经在大型企业应用中出现过。 |
|
返回顶楼 | |
发表时间:2008-08-26
ray_linn 写道 PS:
支持起企业应用的,是“能开发企业应用”的人,而不是靠某种啥有的没的。 SQL, Cobol, C, java, C# 都曾经在大型企业应用中出现过。 这个说得很在理 事实上我经常在rails中去调用其他语言(主要是JAVA、C)的一些库、工具、函数。 一般用facebook的thrift 纠结于某语言/框架不能做什么实在很没意思。 每种钢用在合适的刀刃上就可以了。 |
|
返回顶楼 | |
发表时间:2008-08-26
如果企业应用不需要web,不需要MVC,Rails有何用武之地?
在银行里,字符终端还是很盛行的。 |
|
返回顶楼 | |
发表时间:2008-08-26
gigix 写道 ray_linn 写道 从某种意义上,部署Ruby可能需要考虑的冗错的问题抵消了Ruby的效率。这就是好的VM和差的VM之区别。
什么意思? 这个我是假设为了防止ruby vm的出错,可能需要mirror节点,具体的,我没用过ruby,不知道。 |
|
返回顶楼 | |
发表时间:2008-08-26
ray_linn 写道 如果企业应用不需要web,不需要MVC,Rails有何用武之地?
在银行里,字符终端还是很盛行的。 其实重点不在于Rails 而是混合语言编程:一种坚实的基础语言,一种快速开发应用程序的通用语言,多种DSL |
|
返回顶楼 | |
发表时间:2008-08-26
ray_linn 写道 gigix 写道 ray_linn 写道 从某种意义上,部署Ruby可能需要考虑的冗错的问题抵消了Ruby的效率。这就是好的VM和差的VM之区别。
什么意思? 这个我是假设为了防止ruby vm的出错,可能需要mirror节点,具体的,我没用过ruby,不知道。 实际上rails应用部署天生就是多服务器集群 |
|
返回顶楼 | |