×

Loading...
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务

ZT:<建站要考虑数据库压力和服务器负载> rolia 上有没有能写这样文章的人才啊。。俺很想朝这个方向努力学习;希望能多指点。

本文发表在 rolia.net 枫下论坛所谓大型网站就是访问量与流量都很大的一些网站,因此在建站初期就要考虑好当
流量达到某一级别是是否可以支撑网站继续正常运营下去。其中主要考虑的方面有
几点:数据库压力,网页优化,服务器负载。
  一、 
  1、数据库压力问题 所有的压力最终都会反映到数据库方面,一定要对数据库
有一个整体的规划。 可以按照业务、区域等等特性对数据库进行配置,可以考虑
分库、使用rac、分区、分表等等策略,确保数据库能正常的进行交易。 
  2、事务问题 你采用了两种类型数据库,一个SQL Server、一个oracle,如果
一个交易需要在两个数据库中操作,那么必须考虑到分布式事务,你应该仔细的设
计你的系统,来避免使用分布式事务,以避免分布式事务带来更多的数据库压力和
其它问题。推荐你采用延迟提交的策略(并不保证数据的完整),来避免分布式事务
的问题,毕竟commit失败的几率很低。(某个超大型系统,有3套数据库,也是采
用的延迟提交策略,避免分布式事务带来的对数据库过大的压力)。  
  看到了你在应用前端(weblogic EJB)采用了F5,我个人不是很赞同这个方案,
虽然F5是一个好的L4产品,也能基于第7层做负载均衡和容灾。但是一个有事务交
易的EJB,如果采用了这种方案,把不需要使用分布式事务的交易变成了分布式交
易,试想,一个web如果在一个请求中,访问了后端两个EJB,那么L4就会有可能把
请求分发到不同的服务器上,没有对事务维持在一个服务器中,就不能使用本地事
务。同样,一个web,访问后端一个请求,这个请求中需要3个EJB,那么极有可能
把这3个请求分发到不同的服务器,又造成了分布式事务。weblogic是一个好的
J2EE产品,对这种有事务关联的负载均衡,它会优先考虑采用一个服务器里面的应
用,这样就采用了本地事务,提高了响应速度,减小了分布式事务对应用和数据库
的压力。  
  3、web的优化 我个人认为,一个商业的应用,硬件的投资可能不是主要的瓶
颈,往往可维护性,可扩展性是最主要的问题。   
  没有必要采用不成熟的方案,要更多的使用成熟的方案,将静态、图片独立使
用不同的服务器,对于常态的静态文件,采用E-TAG或者客户端缓存,google很多
就是这样干的。对于热点的功能,考虑使用完全装载到内存,保证绝对的响应速
度,对于需要频繁访问的热点数据,采用集中缓存(多个可以采用负载均衡),减轻
数据库的压力,比如:很多配置信息,操作员信息等等。  
  对了,对于几乎除二进制文件,都应该在L4上配置基于硬件的压缩方案,减少
网络的流量。提高用户使用的感知。  
  4、网络问题 你不可能要求所有的使用人员,都和你的服务器在一个运营商的
网络内,可以考虑采用镜像、多路网络接入、基于DNS的负载均衡。如果有足够的
投资,可以采用CDN(内容分发网),减轻你的服务器压力。 
  二、 
  F5的负载均衡 是必不可少的,他的每秒点击量能达到将近30万,并且它有会
话的 粘性,只要是同一个ip发过来的请求,它就会把它分到同一台机器的,不用
担心分发错误的。现在的问题是apache和tomcat的能力不平衡,动态的内容压力太
大,不是数据库的压力,我们的数据库 oracle是RAC群集。性能很好 
  三、 
  tomcat为什么死掉?当时CPU或者内存的占用率是多少?看看其中JVM占用了多
少?有没有OOM的错误?不可能20台tomcat只能支撑5000的并发。。。以前做过单
台的resin峰值到3K都是绰绰有余的。。。把缓存做好,减少动态查询 
  四、 
  1、F5的使用 F5不光可以做web的负载均衡,也可以做基于第4层的负载均衡。
比如:银行接口,大部分基于socket通讯的,就可以在前面架设一套F5设备,将请
求分发到不同的服务器上。  
  大部分使用F5都是在web层次上,如果使用基于源IP地址的策略,有很多客户
端都是基于代理服务器,这个时候源IP地址是一样的,其实并没有把这些用户给分
发到不同的服务器上,建议采用基于cookie insert的方式,采用cookie的会话保
持策略,loadbalance的算法,需要仔细的结合自己的应用的实际情况来设置。 
  2、大并发的问题 现在你得到了一个大概的系统能承受的并发,但是还达不到
系统的设计目标。 应该从应用的角度去分析这个问题,web方面,通过工
具(httplook),检查一下客户端发起的请求都是什么响应状态,如果看到很多304
请求状态,你需要优化你的url缓存,看一下每个url的耗费时间,仔细针对比较慢
的进行调优;对于tomcat或者weblogic,在高并发的情况下,用kill -3 ,获得
ThreadDump(HeapDump需要特殊的设置),看一下在高并发下,jvm的线程到底在干
什么,仔细的分析可能对你有帮助。  
  如果在这些还没有改善的情况下,应当去想一想,硬件是否足够、配置是否合
理等等系统级别的问题。


五、 
  似乎在说瓶颈在于tomcat并发承载能力不够,但为什么tomcat只能承担单机
200个并发?当并发急剧上升的时候,tomcat在执行动态请求的时候,瓶颈在哪
里?是哪部分程序,或者哪个环节首先导致tomcat失去响应的?在davexin描述的
刀片硬件上面,tomcat上面如果跑的仅仅是最简单的jsp页面,在采用BEA JRockit
JVM的情况下,500个并发也可以达到。 
  我的推测是瓶颈还是出在EJB远程方法调用上! 
  tomcat上面的java应用要通过EJB远程方法调用,来访问weblogic上面的无状
态SessionBean,这样的远程方法调用一般都在100ms~500ms级别,或者更多。而如
果没有远程方法调用,即使大量采用spring的动态反射,一次完整的web请求处理
在本地JVM内部的完成时间一般也不过20ms而已。一次web请求需要过长的执行时
间,就会导致servlet线程被占用更多的时间,从而无法及时响应更多的后续请
求。 
  如果这个推测是成立的话,那么我的建议就是既然你没有用到分布式事务,那
么就干脆去掉EJB。weblogic也可以全部撤掉,业务层使用spring取代EJB,不要搞
分布式架构,在每个tomcat实例上面部署一个完整的分层结构。 
  另外在高并发情况下,apache处理静态资源也很耗内存和CPU,可以考虑用轻
量级web server如lighttpd/litespeed/nginx取代之。 
  六、 
  tomcat之所以并发低很可能是由于remote session bean造成的,remote
session bean又一次被滥用了,在楼主的这种业务情况下,web层和service层根本
不需要分开,象楼主这样分开带来就是一访问业务层就带来长时间的远程请求,确
实导致tomcat上servlet资源释放的问题。那么remote session bean应该被用在什
么地方呢,without ejb上有写到金融系统常用ejb。我把他的这句话延伸一下,也
就是说当业务的运行时间远超过远程调用的时间时,我们就可以用remote session
bean来把这个业务分离出去。而楼主的系统中没有这种业务情况。所以使用remote
session bean应该来说是一个错误的选择,不过这个错误的选择带来的危害被大量
的硬件所掩盖,带来的是成本的提高。而性能上还不如slsb。 
  所以我觉得如果要改架构最便捷的方法是使用slsb,把remote session bean
去掉。这样改造的成本比较低,如果换成spring+hibernate成本就高得多了。也就
是说可以struts+Bean+DAO+helper,然后把weblogic作cluster,任意一个node上
都部署相同的应用。也就是水平扩展,理论上来讲当性能不满足要求时添加node就
行了,如果能做成农场就更加方便了。当然即使非农场也没有关系,可以用现在在
使用的stick分发。这样的改造之所以方便是因为把remote session bean改成slsb
是很容易的,而且团队里的人估计对ejb都更加熟悉一点,成本会比较低一点 
  七、 
  近段时间正在做购买新硬件和新软件的预算,公司高层准备买weblogic10和
oracle 10g,所以请了bea公司的人员和我一块做测试,经过近几天的测试,测试
一下新的系统指标1万个并发,需要多少软件和多少硬件能够支撑,已经测试了不
同的组合方式,有了不同的结果,分别如下: 
  1。1台weblogic10 能支持900个用户并发(没有用ejb),平均响应时间 10
秒。 
  2。1台weblogic10 Express(相当于1台tomcat,用于发布jsp应用)加1台
weblogic10(发布ejb应用),能支持1000个并发用户,平均响应时间9秒,由于本
人使用的loadRunner最多支持1000个web并发,虽然此时weblogic没有任何错误,
但是没办法再向上压用户,所以不知道最高能支撑多少个并发用户,很遗憾。 
  3。1台weblogic8, 能支持900个用户并发(没有用ejb),平均响应时间 11
秒。但是没有weblogic10在同样时间内处理的交易数量多。可以判定性能不能
weblogic10。 
  4。1台tomcat4.1加1台weblogic8,只能支持350个并发用户,tomcat就连结超
时,说明此种结构瓶颈在tomcat。 
  5。1台tomcat6.14加1台weblogic8,还不如方案4,tomcat结超时更多,说明
此种结构瓶颈在tomcat。由于还没有看tomcat6.14的调优资料。所以还请高手给建
议。 
  6。1台tomcat4.1加1台weblogic10,性能同样不佳,问题出现在tomcat性能跟
不上。 
  7。1台tomcat6.14加1台weblogic10,性能同样不佳,问题出现在tomcat性能
跟不上。 
  明天还要做一个weblogic10 cluster测试,等有了测试结果,再根大家交流。
 
  以上测试机器都为 linux as4 操作系统,2cpu + 2G内存,发现cpu利用率最
高占45%,一般就在10%左右,内存可以用到1.5G。 loadRunner机器为2cpu + 2G内
存,window server 2003操作系统。 
  有以上的结果,bea公司人员建议购买16-20cpu的licens。机器购买4cpu + 8G
内存机器4-6台。前端tomcat增加到50台。 
  由于根据以前的宕机记录,主要表现在tomcat层,个别高峰时候也出现在F5。
故不敢轻易的舍弃无状态session bean。由于tomcat做了大部分的业务,只有需要
数据库的时候才调用weblogic中间件,由于weblogic的价格还是比较昂贵的,公司
以前购买的weblogic licens数量限制。所以还不能把所有的tomcat换成
weblogic。如果有20台weblogic的licens,我也就不担心1万个并发了。  
  八、 
  坦白说我还从来没有听说过大规模互联网应用使用EJB的先例。为什么大规模
互联网应用不能用EJB,其实就是因为EJB性能太差,用了EJB几乎必然出现性能障
碍。阿里巴巴和淘宝网那是每天多少亿PV的电子商务网站了,其实也就是用JBoss
而已,而且也只是用其web容器(JBoss的web容器就是tomcat),所以本质上还是在
用tomcat。 
  今年年初,RedHat在深圳的HW大客户在内部做过性能对比评测,JBoss4 vs
WebLogic 9,在web容器一项的评测当中,JBoss4胜出。这个结果并不令人感到意
外,因为web容器的性能说到底无非就是Servlet线程调度能力而已,Tomcat不像
WebLogic那样附加n多管理功能,跑得快很正常。这一点你只要对比测试一下
WebLogic的数据库连接池和C3P0连接池的性能也会发现类似的结论,C3P0可要比
WebLogic的连接池快好几倍了。这不是说WebLogic性能不好,只不过weblogic要实
现更多的功能,所以在单一的速度方面就会牺牲很多东西。 
  以我的经验来判断,使用tomcat5.5以上的版本,配置apr支持,进行必要的
tuning,使用BEA JRockit JVM的话,在你们目前的刀片上面,支撑500个并发完全
是可以做到的。结合你们目前20个刀片的硬件,那么达到1万并发是没问题的。当
然这样做的前提是必须扔掉EJB,并置web层和业务层在同一个JVM内部。 
  从你上面的发言来看,你们之所以采用EJB,无非是因为经费有限,无法购买
充足的weblogic license。所以退而求其次,购买少量的weblogic license,专门
跑业务层服务器,用SLSB暴露远程接口给tomcat调用。然后部署n十多台免费的
tomcat服务器跑web。为省钱而采用EJB到是一个很新鲜的事,但实际上这就是一个
很愚蠢的决定。 
  weblogic的优秀更多的体现在他对于J2EE标准优秀的支持,各种复杂的企业应
用场景以及传统的中间件应用的丰富而方便的集成手段上。简单的来说,就是
weblogic/websphere是企业应用的首选,特别是强调事务的企业应用,例如金融,
电信计费。但在互联网应用方面,weblogic/websphere根本就体现不出有什么能够
超过resin/tomcat的地方,诚然weblogic express的web容器稳定性要好于
tomcat,但没有互联网企业在大规模部署tomcat水平群集的时候,还会为这一点而
疯狂买单购买weblogic license。 
  所以我个人很不理解,作为一个互联网公司的CTO,怎么会如此迷信
weblogic,因为我认识的互联网公司高层,没有什么人愿意用商业产品,绝大多数
都是用开源的,我不惮揣测他的背景可能来自传统企业应用出身的吧,呵呵。

九、 
  这说明瓶颈还不在EJB远程调用上,但是问题已经逐渐清楚了。为什么
weblogic充当web容器发起远程EJB调用的时候可以支撑1000个并发,但是tomcat只
能到350个?只有两个可能的原因: 
  1、你的tomcat没有配置好,严重影响了性能表现 2、tomcat和weblogic之间
的接口出了问题 
  上面的帖子其实我也介绍过了,如果只是单纯的作为servlet容器来看,
tomcat的性能不应该比weblogic差,甚至还要更好,所以你可以这样来拟定测试方
案: 
  在同样硬件环境下对比测试tomcat5.5和weblogic10的servlet容器性能,分别
写几个访问数据库,和不访问数据库的JSP页面测试就可以了,并发从500往上走,
看看哪个throughput更高。记得要调优tomcat5.5,配置apr支持要打开。 
  如果测试结果表明tomcat并发响应能力远远差于weblogic,那就说明你的
tomcat配置有很大的问题,好好钻研tomcat configuration && performance
tuning吧; 
  如果测试结果表明tomcat并发响应能力与weblogic相当,或者差不多,那么很
不幸,问题不在tomcat本身,而是出在了tomcat到weblogic的接口上。而tomcat是
通过weblogic提供的EJB client jar去调用weblogic的EJB的,那你只好咨询BEA去
寻求解决方案了。  
  十、 
  1.基础配置优化 tomcat 6? tomcat参数调优? JRockit JVM? JVM参数调优?
Apache+Squid 处理静态内容? 
  2.业务层优化 部分功能本地化,而不调remote session bean? 异步提交操
作,JMS? cache热点数据? 
  3.展示层优化 动态页面发布为静态页面? Cache部分动态页面内容? 
  十一、 
  对于楼主的问题,以及公司的架构方案,我认为你们仍然在犯错! 误区:遇
到性能问题的第一件事情就是找硬件和容器的事情! 性能问题的基本上无一例外的
都出在写的程序有问题,满足不了伸缩性。 好好看看你们的程序吧,不要再给bea
打电话了,你得到的建议,基本上都是用不到的。 robin的观点是对的,我甚至怀
疑你们的数据库连接是否有释放问题的。 增加你们前端的内存,多做缓存。
hibernate的cache方案不差jdbc对数据库的频繁使用 html的书写是否符合w3的规
范  
  最好在一个服务器上部署整个应用! 
  十二、 
  淘宝用的weblogic8,他们的web层使用的Turbine,且大量的使用velocity,由
于对事务要求及其苛刻用到了ejb,也用到spring很多其他服务,访问数据库使用
ibatis,他们对weblogic优化到的极致加上外面也架了apache,,在如此高并发的
情况,且高度复杂的搜索。。。,还能保持如此的响应速度,确实很不错。 
  淘宝的搜索功能说是在的非常强大,不晓得是不是yahoo中国来人做的,一直
觉得很神奇 
  robbin大哥说的还是很有道理,对于大多数门户门户网站,使用EJB确实浪
费,购买weblogic的钱可以购买很多硬件来apache,tomcat负载均衡远远胜过于ejb
方案的性能。没有绝对的性能好坏之分,主要还是看你的需求,weblogic永远是对
于银行,证券,电信的行业所准备,他们所使用的硬件对象也绝对不是刀片,双路
至强的硬件这样的东东。 
  十三、 
  经过今天修改tomcat的参数,修改如下: 经过测试,并发人数是可以达到像
robbin所说的一样,能够在600人左右,如果压到并发700人,就有15%左右的失
败,虽然在调整上面参数之后,并发人数上去了,但是在同样的时间内所完成的事
务数量下降了10%左右,并且响应时间延迟了1秒左右,但从整体上来说,牺牲一点
事务吞吐量和响应时间,并发人数能够提高500,觉得还是值得的。谢谢robbin的
建议。  
  由于本人使用的loadRunner 能支持的独立client数量在100个,所以没办法对
ejb进行单独的压力测试。因为我在对前段应用调用ejb时,最多并发用户已经达到
1000个,但是通过监控weblogic10中发布的ejb应用和连接池,发现ejb应用等待数
量为0,但是连接池中最多有60个活动连接,有7个连接在等待,因为此时设置的
weblogic连接池最大数量是60,后来对连接池数量进行增大到160个,再次进行测
试,发现性能反而不如把连接池数量调为60个的时候。问起bea的人,他们也说不
清楚原因。  
  同时对他们所提供的一种更好的jvm进行测试,jvm的名字是 RealTime.发现性
能并没有太大改善。 我们现在的系统已经作了很多的缓存,有全局的,有局部
的,都是放到内存中的HashMap,静态的页面都是放在apache上的,不过没有使用
apr, 接下来如果有时间,会测试一下这个咚咚。  
  che前面是F5负载均衡器,在apache后面是tomcat,tomcat在公网上,然后通
过内网网卡访问weblogic,weblogic才能访问数据库,tomcat不能直接访问数据库
的,由于以前的网络结构的原因,也有安全的原因,公司还有部分服务器在北京
(无线事业部)和广州(老系统,以后会逐渐迁移到上海),虽然现在也有其他的
安全方案可以把tomcat放在内网,去掉weblogic,但是这种改变是需要时间的,也
要考虑平稳过渡,所以还请各位理解。至于购买weblogic,公司也是有自己的考虑
的。因为以前就是运行在weblogic上的,如果现在不用了,如果出了问题,就很难
办了。 
  十四、 
  是的,如果调整参数,可以达到并发人数达到1000以上,但是通过对比同样压
力下的weblogic和tomcat,发现tomcat的响应时间都比weblogic长,并且tomcat的
cpu的占用率达到45%-60%,而同样的压力下weblogic的cpu占用只有3%-5%。内存都
是2G都用了97%,说明主要差别表现在cpu和相应时间上,我没有做tomcat 1000人
并发测试,但是从以前600人并发的响应时间判断,我觉得响应时间可能会超过15
秒。所以从综合各方面性能指标考虑,我觉得要找出一个响应时间,并发人数,完
成交易数量3方面考虑折中,找出一个满足应用响应时间和并发用户的折中吧,如
果是并发交易量比较大的应用,我想应该减少并发用户,提高单位时间内交易数量
来满足应用需求吧。 
  十五、 
  又回到了realtime的定义,并不是很快的意思,而是响应时间是可预计的。 
  而JVM对响应时间可预计性的影响,主要表现在 1.线程调度受操作系统线程调
度的影响 2.垃圾收集引起的暂停 
  所以jrockit选择了动态垃圾收集,以频繁的收集来换取每次中断时间的减
少,所以,对吞吐量来说,是反而会下降的。大部分jvm都有吞吐量优先,短暂停
时间两种截然不同的垃圾收集算法。更多精彩文章及讨论,请光临枫下论坛 rolia.net
Report

Replies, comments and Discussions:

  • 工作学习 / 学科技术讨论 / ZT:<建站要考虑数据库压力和服务器负载> rolia 上有没有能写这样文章的人才啊。。俺很想朝这个方向努力学习;希望能多指点。
    本文发表在 rolia.net 枫下论坛所谓大型网站就是访问量与流量都很大的一些网站,因此在建站初期就要考虑好当
    流量达到某一级别是是否可以支撑网站继续正常运营下去。其中主要考虑的方面有
    几点:数据库压力,网页优化,服务器负载。
      一、 
      1、数据库压力问题 所有的压力最终都会反映到数据库方面,一定要对数据库
    有一个整体的规划。 可以按照业务、区域等等特性对数据库进行配置,可以考虑
    分库、使用rac、分区、分表等等策略,确保数据库能正常的进行交易。 
      2、事务问题 你采用了两种类型数据库,一个SQL Server、一个oracle,如果
    一个交易需要在两个数据库中操作,那么必须考虑到分布式事务,你应该仔细的设
    计你的系统,来避免使用分布式事务,以避免分布式事务带来更多的数据库压力和
    其它问题。推荐你采用延迟提交的策略(并不保证数据的完整),来避免分布式事务
    的问题,毕竟commit失败的几率很低。(某个超大型系统,有3套数据库,也是采
    用的延迟提交策略,避免分布式事务带来的对数据库过大的压力)。  
      看到了你在应用前端(weblogic EJB)采用了F5,我个人不是很赞同这个方案,
    虽然F5是一个好的L4产品,也能基于第7层做负载均衡和容灾。但是一个有事务交
    易的EJB,如果采用了这种方案,把不需要使用分布式事务的交易变成了分布式交
    易,试想,一个web如果在一个请求中,访问了后端两个EJB,那么L4就会有可能把
    请求分发到不同的服务器上,没有对事务维持在一个服务器中,就不能使用本地事
    务。同样,一个web,访问后端一个请求,这个请求中需要3个EJB,那么极有可能
    把这3个请求分发到不同的服务器,又造成了分布式事务。weblogic是一个好的
    J2EE产品,对这种有事务关联的负载均衡,它会优先考虑采用一个服务器里面的应
    用,这样就采用了本地事务,提高了响应速度,减小了分布式事务对应用和数据库
    的压力。  
      3、web的优化 我个人认为,一个商业的应用,硬件的投资可能不是主要的瓶
    颈,往往可维护性,可扩展性是最主要的问题。   
      没有必要采用不成熟的方案,要更多的使用成熟的方案,将静态、图片独立使
    用不同的服务器,对于常态的静态文件,采用E-TAG或者客户端缓存,google很多
    就是这样干的。对于热点的功能,考虑使用完全装载到内存,保证绝对的响应速
    度,对于需要频繁访问的热点数据,采用集中缓存(多个可以采用负载均衡),减轻
    数据库的压力,比如:很多配置信息,操作员信息等等。  
      对了,对于几乎除二进制文件,都应该在L4上配置基于硬件的压缩方案,减少
    网络的流量。提高用户使用的感知。  
      4、网络问题 你不可能要求所有的使用人员,都和你的服务器在一个运营商的
    网络内,可以考虑采用镜像、多路网络接入、基于DNS的负载均衡。如果有足够的
    投资,可以采用CDN(内容分发网),减轻你的服务器压力。 
      二、 
      F5的负载均衡 是必不可少的,他的每秒点击量能达到将近30万,并且它有会
    话的 粘性,只要是同一个ip发过来的请求,它就会把它分到同一台机器的,不用
    担心分发错误的。现在的问题是apache和tomcat的能力不平衡,动态的内容压力太
    大,不是数据库的压力,我们的数据库 oracle是RAC群集。性能很好 
      三、 
      tomcat为什么死掉?当时CPU或者内存的占用率是多少?看看其中JVM占用了多
    少?有没有OOM的错误?不可能20台tomcat只能支撑5000的并发。。。以前做过单
    台的resin峰值到3K都是绰绰有余的。。。把缓存做好,减少动态查询 
      四、 
      1、F5的使用 F5不光可以做web的负载均衡,也可以做基于第4层的负载均衡。
    比如:银行接口,大部分基于socket通讯的,就可以在前面架设一套F5设备,将请
    求分发到不同的服务器上。  
      大部分使用F5都是在web层次上,如果使用基于源IP地址的策略,有很多客户
    端都是基于代理服务器,这个时候源IP地址是一样的,其实并没有把这些用户给分
    发到不同的服务器上,建议采用基于cookie insert的方式,采用cookie的会话保
    持策略,loadbalance的算法,需要仔细的结合自己的应用的实际情况来设置。 
      2、大并发的问题 现在你得到了一个大概的系统能承受的并发,但是还达不到
    系统的设计目标。 应该从应用的角度去分析这个问题,web方面,通过工
    具(httplook),检查一下客户端发起的请求都是什么响应状态,如果看到很多304
    请求状态,你需要优化你的url缓存,看一下每个url的耗费时间,仔细针对比较慢
    的进行调优;对于tomcat或者weblogic,在高并发的情况下,用kill -3 ,获得
    ThreadDump(HeapDump需要特殊的设置),看一下在高并发下,jvm的线程到底在干
    什么,仔细的分析可能对你有帮助。  
      如果在这些还没有改善的情况下,应当去想一想,硬件是否足够、配置是否合
    理等等系统级别的问题。


    五、 
      似乎在说瓶颈在于tomcat并发承载能力不够,但为什么tomcat只能承担单机
    200个并发?当并发急剧上升的时候,tomcat在执行动态请求的时候,瓶颈在哪
    里?是哪部分程序,或者哪个环节首先导致tomcat失去响应的?在davexin描述的
    刀片硬件上面,tomcat上面如果跑的仅仅是最简单的jsp页面,在采用BEA JRockit
    JVM的情况下,500个并发也可以达到。 
      我的推测是瓶颈还是出在EJB远程方法调用上! 
      tomcat上面的java应用要通过EJB远程方法调用,来访问weblogic上面的无状
    态SessionBean,这样的远程方法调用一般都在100ms~500ms级别,或者更多。而如
    果没有远程方法调用,即使大量采用spring的动态反射,一次完整的web请求处理
    在本地JVM内部的完成时间一般也不过20ms而已。一次web请求需要过长的执行时
    间,就会导致servlet线程被占用更多的时间,从而无法及时响应更多的后续请
    求。 
      如果这个推测是成立的话,那么我的建议就是既然你没有用到分布式事务,那
    么就干脆去掉EJB。weblogic也可以全部撤掉,业务层使用spring取代EJB,不要搞
    分布式架构,在每个tomcat实例上面部署一个完整的分层结构。 
      另外在高并发情况下,apache处理静态资源也很耗内存和CPU,可以考虑用轻
    量级web server如lighttpd/litespeed/nginx取代之。 
      六、 
      tomcat之所以并发低很可能是由于remote session bean造成的,remote
    session bean又一次被滥用了,在楼主的这种业务情况下,web层和service层根本
    不需要分开,象楼主这样分开带来就是一访问业务层就带来长时间的远程请求,确
    实导致tomcat上servlet资源释放的问题。那么remote session bean应该被用在什
    么地方呢,without ejb上有写到金融系统常用ejb。我把他的这句话延伸一下,也
    就是说当业务的运行时间远超过远程调用的时间时,我们就可以用remote session
    bean来把这个业务分离出去。而楼主的系统中没有这种业务情况。所以使用remote
    session bean应该来说是一个错误的选择,不过这个错误的选择带来的危害被大量
    的硬件所掩盖,带来的是成本的提高。而性能上还不如slsb。 
      所以我觉得如果要改架构最便捷的方法是使用slsb,把remote session bean
    去掉。这样改造的成本比较低,如果换成spring+hibernate成本就高得多了。也就
    是说可以struts+Bean+DAO+helper,然后把weblogic作cluster,任意一个node上
    都部署相同的应用。也就是水平扩展,理论上来讲当性能不满足要求时添加node就
    行了,如果能做成农场就更加方便了。当然即使非农场也没有关系,可以用现在在
    使用的stick分发。这样的改造之所以方便是因为把remote session bean改成slsb
    是很容易的,而且团队里的人估计对ejb都更加熟悉一点,成本会比较低一点 
      七、 
      近段时间正在做购买新硬件和新软件的预算,公司高层准备买weblogic10和
    oracle 10g,所以请了bea公司的人员和我一块做测试,经过近几天的测试,测试
    一下新的系统指标1万个并发,需要多少软件和多少硬件能够支撑,已经测试了不
    同的组合方式,有了不同的结果,分别如下: 
      1。1台weblogic10 能支持900个用户并发(没有用ejb),平均响应时间 10
    秒。 
      2。1台weblogic10 Express(相当于1台tomcat,用于发布jsp应用)加1台
    weblogic10(发布ejb应用),能支持1000个并发用户,平均响应时间9秒,由于本
    人使用的loadRunner最多支持1000个web并发,虽然此时weblogic没有任何错误,
    但是没办法再向上压用户,所以不知道最高能支撑多少个并发用户,很遗憾。 
      3。1台weblogic8, 能支持900个用户并发(没有用ejb),平均响应时间 11
    秒。但是没有weblogic10在同样时间内处理的交易数量多。可以判定性能不能
    weblogic10。 
      4。1台tomcat4.1加1台weblogic8,只能支持350个并发用户,tomcat就连结超
    时,说明此种结构瓶颈在tomcat。 
      5。1台tomcat6.14加1台weblogic8,还不如方案4,tomcat结超时更多,说明
    此种结构瓶颈在tomcat。由于还没有看tomcat6.14的调优资料。所以还请高手给建
    议。 
      6。1台tomcat4.1加1台weblogic10,性能同样不佳,问题出现在tomcat性能跟
    不上。 
      7。1台tomcat6.14加1台weblogic10,性能同样不佳,问题出现在tomcat性能
    跟不上。 
      明天还要做一个weblogic10 cluster测试,等有了测试结果,再根大家交流。
     
      以上测试机器都为 linux as4 操作系统,2cpu + 2G内存,发现cpu利用率最
    高占45%,一般就在10%左右,内存可以用到1.5G。 loadRunner机器为2cpu + 2G内
    存,window server 2003操作系统。 
      有以上的结果,bea公司人员建议购买16-20cpu的licens。机器购买4cpu + 8G
    内存机器4-6台。前端tomcat增加到50台。 
      由于根据以前的宕机记录,主要表现在tomcat层,个别高峰时候也出现在F5。
    故不敢轻易的舍弃无状态session bean。由于tomcat做了大部分的业务,只有需要
    数据库的时候才调用weblogic中间件,由于weblogic的价格还是比较昂贵的,公司
    以前购买的weblogic licens数量限制。所以还不能把所有的tomcat换成
    weblogic。如果有20台weblogic的licens,我也就不担心1万个并发了。  
      八、 
      坦白说我还从来没有听说过大规模互联网应用使用EJB的先例。为什么大规模
    互联网应用不能用EJB,其实就是因为EJB性能太差,用了EJB几乎必然出现性能障
    碍。阿里巴巴和淘宝网那是每天多少亿PV的电子商务网站了,其实也就是用JBoss
    而已,而且也只是用其web容器(JBoss的web容器就是tomcat),所以本质上还是在
    用tomcat。 
      今年年初,RedHat在深圳的HW大客户在内部做过性能对比评测,JBoss4 vs
    WebLogic 9,在web容器一项的评测当中,JBoss4胜出。这个结果并不令人感到意
    外,因为web容器的性能说到底无非就是Servlet线程调度能力而已,Tomcat不像
    WebLogic那样附加n多管理功能,跑得快很正常。这一点你只要对比测试一下
    WebLogic的数据库连接池和C3P0连接池的性能也会发现类似的结论,C3P0可要比
    WebLogic的连接池快好几倍了。这不是说WebLogic性能不好,只不过weblogic要实
    现更多的功能,所以在单一的速度方面就会牺牲很多东西。 
      以我的经验来判断,使用tomcat5.5以上的版本,配置apr支持,进行必要的
    tuning,使用BEA JRockit JVM的话,在你们目前的刀片上面,支撑500个并发完全
    是可以做到的。结合你们目前20个刀片的硬件,那么达到1万并发是没问题的。当
    然这样做的前提是必须扔掉EJB,并置web层和业务层在同一个JVM内部。 
      从你上面的发言来看,你们之所以采用EJB,无非是因为经费有限,无法购买
    充足的weblogic license。所以退而求其次,购买少量的weblogic license,专门
    跑业务层服务器,用SLSB暴露远程接口给tomcat调用。然后部署n十多台免费的
    tomcat服务器跑web。为省钱而采用EJB到是一个很新鲜的事,但实际上这就是一个
    很愚蠢的决定。 
      weblogic的优秀更多的体现在他对于J2EE标准优秀的支持,各种复杂的企业应
    用场景以及传统的中间件应用的丰富而方便的集成手段上。简单的来说,就是
    weblogic/websphere是企业应用的首选,特别是强调事务的企业应用,例如金融,
    电信计费。但在互联网应用方面,weblogic/websphere根本就体现不出有什么能够
    超过resin/tomcat的地方,诚然weblogic express的web容器稳定性要好于
    tomcat,但没有互联网企业在大规模部署tomcat水平群集的时候,还会为这一点而
    疯狂买单购买weblogic license。 
      所以我个人很不理解,作为一个互联网公司的CTO,怎么会如此迷信
    weblogic,因为我认识的互联网公司高层,没有什么人愿意用商业产品,绝大多数
    都是用开源的,我不惮揣测他的背景可能来自传统企业应用出身的吧,呵呵。

    九、 
      这说明瓶颈还不在EJB远程调用上,但是问题已经逐渐清楚了。为什么
    weblogic充当web容器发起远程EJB调用的时候可以支撑1000个并发,但是tomcat只
    能到350个?只有两个可能的原因: 
      1、你的tomcat没有配置好,严重影响了性能表现 2、tomcat和weblogic之间
    的接口出了问题 
      上面的帖子其实我也介绍过了,如果只是单纯的作为servlet容器来看,
    tomcat的性能不应该比weblogic差,甚至还要更好,所以你可以这样来拟定测试方
    案: 
      在同样硬件环境下对比测试tomcat5.5和weblogic10的servlet容器性能,分别
    写几个访问数据库,和不访问数据库的JSP页面测试就可以了,并发从500往上走,
    看看哪个throughput更高。记得要调优tomcat5.5,配置apr支持要打开。 
      如果测试结果表明tomcat并发响应能力远远差于weblogic,那就说明你的
    tomcat配置有很大的问题,好好钻研tomcat configuration && performance
    tuning吧; 
      如果测试结果表明tomcat并发响应能力与weblogic相当,或者差不多,那么很
    不幸,问题不在tomcat本身,而是出在了tomcat到weblogic的接口上。而tomcat是
    通过weblogic提供的EJB client jar去调用weblogic的EJB的,那你只好咨询BEA去
    寻求解决方案了。  
      十、 
      1.基础配置优化 tomcat 6? tomcat参数调优? JRockit JVM? JVM参数调优?
    Apache+Squid 处理静态内容? 
      2.业务层优化 部分功能本地化,而不调remote session bean? 异步提交操
    作,JMS? cache热点数据? 
      3.展示层优化 动态页面发布为静态页面? Cache部分动态页面内容? 
      十一、 
      对于楼主的问题,以及公司的架构方案,我认为你们仍然在犯错! 误区:遇
    到性能问题的第一件事情就是找硬件和容器的事情! 性能问题的基本上无一例外的
    都出在写的程序有问题,满足不了伸缩性。 好好看看你们的程序吧,不要再给bea
    打电话了,你得到的建议,基本上都是用不到的。 robin的观点是对的,我甚至怀
    疑你们的数据库连接是否有释放问题的。 增加你们前端的内存,多做缓存。
    hibernate的cache方案不差jdbc对数据库的频繁使用 html的书写是否符合w3的规
    范  
      最好在一个服务器上部署整个应用! 
      十二、 
      淘宝用的weblogic8,他们的web层使用的Turbine,且大量的使用velocity,由
    于对事务要求及其苛刻用到了ejb,也用到spring很多其他服务,访问数据库使用
    ibatis,他们对weblogic优化到的极致加上外面也架了apache,,在如此高并发的
    情况,且高度复杂的搜索。。。,还能保持如此的响应速度,确实很不错。 
      淘宝的搜索功能说是在的非常强大,不晓得是不是yahoo中国来人做的,一直
    觉得很神奇 
      robbin大哥说的还是很有道理,对于大多数门户门户网站,使用EJB确实浪
    费,购买weblogic的钱可以购买很多硬件来apache,tomcat负载均衡远远胜过于ejb
    方案的性能。没有绝对的性能好坏之分,主要还是看你的需求,weblogic永远是对
    于银行,证券,电信的行业所准备,他们所使用的硬件对象也绝对不是刀片,双路
    至强的硬件这样的东东。 
      十三、 
      经过今天修改tomcat的参数,修改如下: 经过测试,并发人数是可以达到像
    robbin所说的一样,能够在600人左右,如果压到并发700人,就有15%左右的失
    败,虽然在调整上面参数之后,并发人数上去了,但是在同样的时间内所完成的事
    务数量下降了10%左右,并且响应时间延迟了1秒左右,但从整体上来说,牺牲一点
    事务吞吐量和响应时间,并发人数能够提高500,觉得还是值得的。谢谢robbin的
    建议。  
      由于本人使用的loadRunner 能支持的独立client数量在100个,所以没办法对
    ejb进行单独的压力测试。因为我在对前段应用调用ejb时,最多并发用户已经达到
    1000个,但是通过监控weblogic10中发布的ejb应用和连接池,发现ejb应用等待数
    量为0,但是连接池中最多有60个活动连接,有7个连接在等待,因为此时设置的
    weblogic连接池最大数量是60,后来对连接池数量进行增大到160个,再次进行测
    试,发现性能反而不如把连接池数量调为60个的时候。问起bea的人,他们也说不
    清楚原因。  
      同时对他们所提供的一种更好的jvm进行测试,jvm的名字是 RealTime.发现性
    能并没有太大改善。 我们现在的系统已经作了很多的缓存,有全局的,有局部
    的,都是放到内存中的HashMap,静态的页面都是放在apache上的,不过没有使用
    apr, 接下来如果有时间,会测试一下这个咚咚。  
      che前面是F5负载均衡器,在apache后面是tomcat,tomcat在公网上,然后通
    过内网网卡访问weblogic,weblogic才能访问数据库,tomcat不能直接访问数据库
    的,由于以前的网络结构的原因,也有安全的原因,公司还有部分服务器在北京
    (无线事业部)和广州(老系统,以后会逐渐迁移到上海),虽然现在也有其他的
    安全方案可以把tomcat放在内网,去掉weblogic,但是这种改变是需要时间的,也
    要考虑平稳过渡,所以还请各位理解。至于购买weblogic,公司也是有自己的考虑
    的。因为以前就是运行在weblogic上的,如果现在不用了,如果出了问题,就很难
    办了。 
      十四、 
      是的,如果调整参数,可以达到并发人数达到1000以上,但是通过对比同样压
    力下的weblogic和tomcat,发现tomcat的响应时间都比weblogic长,并且tomcat的
    cpu的占用率达到45%-60%,而同样的压力下weblogic的cpu占用只有3%-5%。内存都
    是2G都用了97%,说明主要差别表现在cpu和相应时间上,我没有做tomcat 1000人
    并发测试,但是从以前600人并发的响应时间判断,我觉得响应时间可能会超过15
    秒。所以从综合各方面性能指标考虑,我觉得要找出一个响应时间,并发人数,完
    成交易数量3方面考虑折中,找出一个满足应用响应时间和并发用户的折中吧,如
    果是并发交易量比较大的应用,我想应该减少并发用户,提高单位时间内交易数量
    来满足应用需求吧。 
      十五、 
      又回到了realtime的定义,并不是很快的意思,而是响应时间是可预计的。 
      而JVM对响应时间可预计性的影响,主要表现在 1.线程调度受操作系统线程调
    度的影响 2.垃圾收集引起的暂停 
      所以jrockit选择了动态垃圾收集,以频繁的收集来换取每次中断时间的减
    少,所以,对吞吐量来说,是反而会下降的。大部分jvm都有吞吐量优先,短暂停
    时间两种截然不同的垃圾收集算法。更多精彩文章及讨论,请光临枫下论坛 rolia.net
    • 这好象算不上什么人才吧。泛泛而谈,眉毛胡子一把抓,谬误段段有。。。说实话,我愣没看出ta是什么方向,web server admin?load/performance tester?如果说architect的话,那还是太junior了。