锁定老帖子 主题:关于rails大容量网站部署的性能讨论
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间: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在干私活了 |
|
返回顶楼 | |
发表时间: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) 如果能够重写的话, 则对速度的提升也应该大有裨益. ----------- |
|
返回顶楼 | |
发表时间:2006-06-23
jetever 写道 楼上的兄弟,你去slashdot看看就知道咯,chinaren那种根本不是一个级别的。
那上面很多都是静态页面server的数据,跟mop和chinaren这种全部是jsp动态页面的网站不能比吧 |
|
返回顶楼 | |
发表时间:2006-06-24
两个最近Rails性能优化方面的presentation的pdf,切一下题呵呵
http://www.railsexpress.de/blog/files/slides/rubyenrails2006.pdf http://www.scalewithrails.com/downloads/ScaleWithRails-April2006.pdf |
|
返回顶楼 | |
发表时间: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();; } } } |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2006-07-06
写一个简单的web应用程序,使用loadrunner进行了压力测试。对比方案:
方案一:使用HttpSession保存用户状态 方案二:使用memcached保存用户状态(memcached和tomcat不在同一台机器) 每个页面都需要LoginInterceptor,即每个请求都会去取用户信息。 测试结果表明,并发处理能力几乎一模一样,CPU消耗也没有明显差异。 看来上面jkit同学关于序列化的结论是正确的。 |
|
返回顶楼 | |
发表时间:2006-09-23
对于Java的序列化要提升性能,自己实现Externalizable接口
|
|
返回顶楼 | |
发表时间:2006-09-30
robbin 写道 写一个简单的web应用程序,使用loadrunner进行了压力测试。对比方案:
方案一:使用HttpSession保存用户状态 方案二:使用memcached保存用户状态(memcached和tomcat不在同一台机器) 每个页面都需要LoginInterceptor,即每个请求都会去取用户信息。 测试结果表明,并发处理能力几乎一模一样,CPU消耗也没有明显差异。 看来上面jkit同学关于序列化的结论是正确的。 结论就是Java也可以使用SNA架构啦?请确认一下,要是这样太好了。 |
|
返回顶楼 | |
发表时间:2006-09-30
bigpanda 写道 robbin 写道 写一个简单的web应用程序,使用loadrunner进行了压力测试。对比方案:
方案一:使用HttpSession保存用户状态 方案二:使用memcached保存用户状态(memcached和tomcat不在同一台机器) 每个页面都需要LoginInterceptor,即每个请求都会去取用户信息。 测试结果表明,并发处理能力几乎一模一样,CPU消耗也没有明显差异。 看来上面jkit同学关于序列化的结论是正确的。 结论就是Java也可以使用SNA架构啦?请确认一下,要是这样太好了。 是的。 |
|
返回顶楼 | |