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

关于rails大容量网站部署的性能讨论

浏览 174984 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-06-23  
据我初步猜测,一个类的序列化有那么一些开销:
1. 如果之前jvm没有进行过任何类的序列化,则为了jvm为了执行第一次序列化,会有一个开销
2. 如果某个类没有进行过任何序列化,则为了执行这个类的对象的第一次序列化,会有一个开销.
3. 线程相关的1/2类开销.
至于那个随机问题, 我初步估计可能是jvm内部对io的优化(异步io)导致第一个开销的重复.因此,对main进行了修改
        public static void main(String[] args); throws Exception { 
                Long obj = new Long(1l);; 
                testMethod(obj);; 
                Date date = new Date();; 
                testMethod(date);; 
                TestBean bean = new TestBean();; 
                bean.setName("fankai");; 
                bean.setPass("fankai");; 
                bean.setAge(30);;
                preClassLoad();;
                TestBean30 bean30 = new TestBean30("fankai","fankai",30);; 
                testMethod(bean30);;
                Thread.sleep(100);;
                long start = System.currentTimeMillis();;                                
                for(int i=0;i<25;i++);{
                    testMethod2(i);;        
                }
                long end = System.currentTimeMillis();; 
                System.out.println("TestBean 25个对象序列化开销:"+ (end-start););;
               Thread.sleep(100);;  
                start = System.currentTimeMillis();;                                
                testMethod3();;
                end = System.currentTimeMillis();; 
                System.out.println("25个不同类对象的初始化和序列化开销:" + (end-start););;                
        } 

添加了Thread.sleep(100);即等待第一类开销的全局完成.
此时,运行结果基本稳定在
TestBean 25个对象序列化开销:0
25个不同类对象的初始化和序列化开销:46


改变sleep的值会出现很有意思而且不能直观解释的现象,我这儿如果改到10,结果一样,但是如果该到15,则等同于改到1,都是
TestBean 25个对象序列化开销:16
25个不同类对象的初始化和序列化开销:62

可能是jvm在干私活了
0 请登录后投票
   发表时间:2006-06-23  
在matrix上看的一文章  作者:matrix 来自:JL
-----------------

之前在javalobby上,  Jean-Marie Dautelle 使用Javolution benchmark 对Tiger 和 Mustang 进行了性能比较.

测试得到的详细数据:
Tiger:http://javolution.org/doc/results15.txt

Mustang:http://javolution.org/doc/results16.txt

通过分析数据, 我们可以得到以下结论:

1. Mustang明显在本地编译方面有显著提高.. Text vs StringBuffer 显示了2倍的效率提升. 而对小对象的创建效率,也同样提升很多.. 而大对象的创建, 则依然是比较慢.

2. Java的序列化效率提升50%

3.java.util.collection 提升并不明显..在这方面来说, 应该还有很大的余地..

Mustang 在 vm级别的效率提升明显(大概40-60%).. 而核心library (比如collection) 如果能够重写的话, 则对速度的提升也应该大有裨益.

-----------
0 请登录后投票
   发表时间:2006-06-23  
jetever 写道
楼上的兄弟,你去slashdot看看就知道咯,chinaren那种根本不是一个级别的。


那上面很多都是静态页面server的数据,跟mop和chinaren这种全部是jsp动态页面的网站不能比吧
0 请登录后投票
   发表时间:2006-06-24  
两个最近Rails性能优化方面的presentation的pdf,切一下题呵呵

http://www.railsexpress.de/blog/files/slides/rubyenrails2006.pdf
http://www.scalewithrails.com/downloads/ScaleWithRails-April2006.pdf
0 请登录后投票
   发表时间:2006-06-26  
robbin 写道
对同一个对象反复序列化,JVM会进行缓存,不管你循环20次,200次还是5000次,其实都是只序列化了一次,剩下的那只是循环本身的开销而已。如果你们真想得到最值得信赖的测试,那就应该真的去写一个web应用,用loadrunner去做压力测试,每个web页面去memcached取 session,然后再对比测试web页面不访问memcached,这样才行。

要测试的是并发情况下每个线程自己去序列化的开销,而不是单个线程对同一个Class的obj反复序列化的开销!!!
[b][/b]


跑这段代码,结果很清楚:第一次慢,以后就快了。

正像前几位所说,jvm对对象进行第一次序列化时会有一定的优化,比方说会初始化该类的ObjectStreamClass实例,这会带来一定的开销。
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;

public class SerializableTest {
	public static void main(String[] args); throws Exception {
		for (int i = 0; i < 10; i++); {
			Thread t = new Thread(new Runnable(); {
				public void run(); {
					try {
						TestBean bean = new TestBean();;
						bean.setName("fankai" + this.toString(););;
						bean.setPass(this.toString(););;
						bean.setAge(this.hashCode(););;
						long start = System.currentTimeMillis();;
						ByteArrayOutputStream byteStream = new ByteArrayOutputStream();;
						ObjectOutputStream outStream = new ObjectOutputStream(byteStream);;
						outStream.writeObject(bean);;
						outStream.flush();;
						outStream.close();;
						byteStream.close();;
						long end = System.currentTimeMillis();;
						System.out.println((end - start);+"   ["+bean.getName();+","+bean.getPass();+","+bean.getAge();+"]");;
					} catch (Exception e); {
						e.printStackTrace();;
					}
				}
			});;
			Thread.sleep(100);;
			t.start();;
		}
	}
}
0 请登录后投票
   发表时间:2006-06-30  
使用JMeter,在Spring+Hibernate+MemCached的框架下粗略测试了一下

硬件: 2台服务器,一台跑Resin,一台跑memcache
  CPU: Intel(R) Xeon(TM) CPU 2.80GHz * 2
  内存: 2G

结果如下(读操作):
300个并发(循环3次): 平均相应时间是5099ms
200个并发(循环3次): 平均相应时间是3542ms
100个并发(循环3次): 平均相应时间是2070ms

测试同样的页面,改为ehcache
300个并发(循环3次): 平均相应时间是2679ms
0 请登录后投票
   发表时间:2006-07-06  
写一个简单的web应用程序,使用loadrunner进行了压力测试。对比方案:

方案一:使用HttpSession保存用户状态
方案二:使用memcached保存用户状态(memcached和tomcat不在同一台机器)

每个页面都需要LoginInterceptor,即每个请求都会去取用户信息。

测试结果表明,并发处理能力几乎一模一样,CPU消耗也没有明显差异。

看来上面jkit同学关于序列化的结论是正确的。
0 请登录后投票
   发表时间:2006-09-23  
对于Java的序列化要提升性能,自己实现Externalizable接口
0 请登录后投票
   发表时间:2006-09-30  
robbin 写道
写一个简单的web应用程序,使用loadrunner进行了压力测试。对比方案:

方案一:使用HttpSession保存用户状态
方案二:使用memcached保存用户状态(memcached和tomcat不在同一台机器)

每个页面都需要LoginInterceptor,即每个请求都会去取用户信息。

测试结果表明,并发处理能力几乎一模一样,CPU消耗也没有明显差异。

看来上面jkit同学关于序列化的结论是正确的。


结论就是Java也可以使用SNA架构啦?请确认一下,要是这样太好了。
0 请登录后投票
   发表时间:2006-09-30  
bigpanda 写道
robbin 写道
写一个简单的web应用程序,使用loadrunner进行了压力测试。对比方案:

方案一:使用HttpSession保存用户状态
方案二:使用memcached保存用户状态(memcached和tomcat不在同一台机器)

每个页面都需要LoginInterceptor,即每个请求都会去取用户信息。

测试结果表明,并发处理能力几乎一模一样,CPU消耗也没有明显差异。

看来上面jkit同学关于序列化的结论是正确的。


结论就是Java也可以使用SNA架构啦?请确认一下,要是这样太好了。


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

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