﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-kit-文章分类-web server</title><link>http://www.blogjava.net/kit-soft/category/41425.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 27 Aug 2009 10:02:16 GMT</lastBuildDate><pubDate>Thu, 27 Aug 2009 10:02:16 GMT</pubDate><ttl>60</ttl><item><title>容器比较 tomcat jboss resin glassfish weblogic websphere</title><link>http://www.blogjava.net/kit-soft/articles/292858.html</link><dc:creator>kit_lo</dc:creator><author>kit_lo</author><pubDate>Thu, 27 Aug 2009 09:20:00 GMT</pubDate><guid>http://www.blogjava.net/kit-soft/articles/292858.html</guid><wfw:comment>http://www.blogjava.net/kit-soft/comments/292858.html</wfw:comment><comments>http://www.blogjava.net/kit-soft/articles/292858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kit-soft/comments/commentRss/292858.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kit-soft/services/trackbacks/292858.html</trackback:ping><description><![CDATA[<div id="blogDetailDiv" style="font-size: 16px">
<p><strong fromubb="1">1.</strong> Tomcat是Apache鼎力支持的Java Web应用服务器，由于它优秀的稳定性以及丰富的文档资料，广泛的使用人群，从而在开源领域受到最广泛的青睐。&shy;</p>
<p><strong fromubb="1">2.</strong> Jboss作为Java EE应用服务器，它不但是Servlet容器，而且是EJB容器，从而受到企业级开发人员的欢迎，从而弥补了Tomcat只是一个Servlet容器的缺憾。&shy;</p>
<p><strong fromubb="1">3.</strong> Resin也仅仅是一个Servlet容器，然而由于它优秀的运行速度，使得它在轻量级Java Web领域备受喜爱，特别是在互联网Web服务领域，众多知名公司都采用其作为他们的Java Web应用服务器，譬如163、ku6等。&shy;</p>
<p>在商用应用服务器里主要有：Weblogic、Websphere，其中Weblogic我也使用过很长一段时间，当时也只用其当Servlet容器，然而就在同等条件下，在性能及易用性等方面，要比Tomcat优秀很多。&shy;</p>
<p>4.glassfish是Sun公司推出的Java EE服务器，一个比较活跃的开源社区,不断的通过社区的反馈来提高其的可用性,经过glassfish v1 glassfish v2 到今天的glassfish v3 ,它已经走向成熟.Glassfish是一个免费、开放源代码的应用服务，它实现了Java EE 5，Java EE 5 平台包括了以下最新技术：EJB 3.0、JSF 1.2、Servlet 2.5、JSP 2.1、JAX-WS 2.0、JAXB 2.0、 Java Persistence 1.0、Common Annonations 1.0、StAX 1.0等.&shy;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 支持集群,通过内存中会话状态复制,增强了部署体系结构的可用性与可伸缩性,它对集群有着很好的支持,可以简单到通过添加机器,就可轻松的提高网站的带负载能力,在解析能力方面,它对html的吞吐能力与apache服务器不分上下,就是tomcat所不能比的,支持目录部署,热部署,解决了tomcat对热部署能力的缺陷.在版本方面做的更加人性化,有开发时用的简化版,专门用于部署web项目的版本,还要完全符合j2ee标准的版本.&shy;</p>
</div>
<img src ="http://www.blogjava.net/kit-soft/aggbug/292858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kit-soft/" target="_blank">kit_lo</a> 2009-08-27 17:20 <a href="http://www.blogjava.net/kit-soft/articles/292858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat 三种集群方式</title><link>http://www.blogjava.net/kit-soft/articles/292856.html</link><dc:creator>kit_lo</dc:creator><author>kit_lo</author><pubDate>Thu, 27 Aug 2009 09:18:00 GMT</pubDate><guid>http://www.blogjava.net/kit-soft/articles/292856.html</guid><wfw:comment>http://www.blogjava.net/kit-soft/comments/292856.html</wfw:comment><comments>http://www.blogjava.net/kit-soft/articles/292856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kit-soft/comments/commentRss/292856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kit-soft/services/trackbacks/292856.html</trackback:ping><description><![CDATA[1.使用DNS轮询.<br />
2.使用Apache R-proxy方式。<br />
3.使用Apache mod_jk方式.<br />
&nbsp;<br />
DNS轮询的缺点是，当集群中某台服务器停止之后，用户由于dns缓存的缘故，便无法访问服务，<br />
必须等到dns解析更新，或者这台服务器重新启动。<br />
还有就是必须把集群中的所有服务端口暴露给外界，没有用apache做前置代理的方式安全，<br />
并且占用大量公网IP地址，而且tomcat还要负责处理静态网页资源，影响效率。<br />
优点是集群配置最简单，dns设置也非常简单。<br />
&nbsp;<br />
R-proxy的缺点是，当其中一台tomcat停止运行的时候，apache仍然会转发请求过去，导致502网关错误。<br />
但是只要服务器再启动就不存在这个问题。<br />
&nbsp;<br />
mod_jk方式的优点是，Apache 会自动检测到停止掉的tomcat，然后不再发请求过去。<br />
缺点就是，当停止掉的tomcat服务器再次启动的时候，Apache检测不到，仍然不会转发请求过去。<br />
&nbsp;<br />
R-proxy和mod_jk的共同优点是.可以只将Apache置于公网，节省公网IP地址资源。<br />
可以通过设置来实现Apache专门负责处理静态网页，让Tomcat专门负责处理jsp和servlet等动态请求。<br />
共同缺点是：如果前置Apache代理服务器停止运行，所有集群服务将无法对外提供。<br />
R-proxy和mod_jk对静态页面请求的处理，都可以通设置来选取一个尽可能优化的效果。<br />
这三种方式对实现最佳负载均衡都有一定不足，mod_jk相对好些，可以通过设置lbfactor参数来分配请求任务，但又因为mod_jk2方式不被推荐，mod_jk2已经不再被更新了。郁闷中&#8230;&#8230; 
<img src ="http://www.blogjava.net/kit-soft/aggbug/292856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kit-soft/" target="_blank">kit_lo</a> 2009-08-27 17:18 <a href="http://www.blogjava.net/kit-soft/articles/292856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaEE应用程序在Glassfish上的性能调优案例分析 </title><link>http://www.blogjava.net/kit-soft/articles/292855.html</link><dc:creator>kit_lo</dc:creator><author>kit_lo</author><pubDate>Thu, 27 Aug 2009 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/kit-soft/articles/292855.html</guid><wfw:comment>http://www.blogjava.net/kit-soft/comments/292855.html</wfw:comment><comments>http://www.blogjava.net/kit-soft/articles/292855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kit-soft/comments/commentRss/292855.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kit-soft/services/trackbacks/292855.html</trackback:ping><description><![CDATA[<span lang="EN-US">&nbsp;
<p><span style="color: red">转载之：<span style="color: red"><a href="http://developers.sun.com.cn/blog/yutoujava/entry/8">http://developers.sun.com.cn/blog/yutoujava/entry/8</a><br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java EE</span><span style="font-family: 宋体">应用的性能问题对严肃的项目和产品来说是一个非常重要的问题。特别是企业级的应用，并发用户多，数据传输量大，业务逻辑复杂，占用系统资源多，因此性能问题在企业级应用变得至关重要，它和系统的稳定性有着直接的联系。更加重要的是，性能好的应用在完成相同任务的条件下，能够占用更少的资源，获得更好的用户体验，换句话说，就是能够节省费用和消耗，获得更高的利润。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt">要获得更好的性能，就需要对原来的系统进行性能调优。对运行在Glassfish上的JavaEE应用，调优是一件相对复杂的事情。在调优以前必须要认识到：对JavaEE的系统，调优是多层次的。一个JavaEE的应用其实是整个系统中很少的一部分。开发人员所开发的JavaEE程序，无论是JSP还是 EJB，都是运行在JavaEE应用服务器（Glassfish）之上。而应用服务器本身也是Java语言编写的，需要运行在Java虚拟机之上。 Java虚拟机也只不过是操作系统的一个应用而已，和其他的应用（如Apache）对于操作系统来说没有本质的区别。而操作系统却运行在一定的硬件环境中，包括CPU，内存，网卡和硬盘等等。在这么多的层次中，每一个层次的因素都会影响整个系统的性能。因此，对一个系统的调优，事实上需要同时对每个层次都要调优。JavaEE应用性能调优不仅仅和Glassfish有关，Java语言有关，还要和操作系统以及硬件都有关系，需要调优者有综合的知识和技能。这些不同层面的方法需要综合纵效，结合在一起灵活使用，才能快速有效的定位性能瓶颈。下面是一些具体的案例分析: </p>
<p>&nbsp;</p>
<h3>内存泄漏问题</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 某个JavaEE应用运行在8颗CPU的服务器上。上线运行发现性能不稳定。性能随着时间的增加而越来越慢。通过操作系统的工具（mpstat），发现在系统很慢的时候，只有一颗CPU很忙，其他的CPU都很空闲。因此怀疑是Java虚拟机经常进行内存回收，因为虚拟机在内存回收的时候，有的回收算法通常只能运行在一个CPU上。通过Java虚拟机的工具&#8220;jstat&#8221;可以清楚的看到，Java虚拟机进行内存回收的频率非常高，几乎每5秒中就有一次，每次回收的时间为2秒钟。另外，通过&#8220;jstat&#8221;的输出还发现每次回收释放的内存非常有限，大多数对象都无法回收。这种现象很大程度上暗示着内存泄漏。使用 Java虚拟机的工具&#8220;jmap&#8221;来获得当前的一个内存映象。发现有很多（超过10000）个的session对象。这是不正常的一个现象。一般来说， session对应于一个用户的多次访问，当用户退出的时候，session就应该失效，对象应该被回收。当我们和这个系统的开发工程师了解有关 session的设置，发现当他们部署应用的时候，竟然将session的timeout时间设置为50分钟，并且没有提供logout的接口。这样的设置下，每个session的数据都会保存50分钟才会被回收。根据我们的建议，系统提供了logout的链接，并且告诉用户如果退出应用，应该点击这个 logout的链接；并且将session的timeout时间修改为5分钟。通过几天的测试，证明泄漏的问题得到解决。</p>
<p>&nbsp;</p>
<h3>数据库连接池问题</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 某财务应用运行在JavaEE服务器上，后台连接Oracle数据库。并发用户数量超过100人左右的时候系统停止响应。通过操作系统层面的进程监控工具发现进程并没有被杀死或挂起，而CPU使用率几乎为零。那么是什么原因导致系统停止响应用户请求呢？我们利用Java虚拟机的工具（kill -3 pid）将当前的所有线程状态DUMP出来，发现JavaEE服务器的大部分处理线程都在等待数据库连接池的连接，而那些已经获得数据库连接的线程却处于阻塞状态。数据库管理员应要求检查了数据库的状态，发现所有的连接的session都处于死锁状态。显然，这是因为数据库端出现了死锁的操作，阻塞了那些有数据库操作的请求，占用了所有数据库连接池中的连接。后续的请求如果还要从连接池中获取连接，就会阻塞在连接池上。当解决数据库死锁的问题之后，性能问题迎刃而解。</p>
<p>&nbsp;</p>
<h3>大对象缓存问题</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 电信应用运行在64位Java虚拟机上，系统运行得很不稳定，系统经常停止响应。使用进程工具查看，发现进程并没有被杀死或挂起。利用Java虚拟机的工具发现系统在长时间的进行内存回收，内存回收的时间长达15分钟，整个系统在内存回收的时候就像挂起一样。另外还观察到系统使用了12G的内存（因为是 64位虚拟机所以突破了4G内存的限制）。从开发人员那里了解到，这个应用为了提高性能，大量使用了对象缓存，但是事与愿违，在Java中使用过多的内存，虽然在正常运行的时候能够获得很好的性能，但是会大大增加内存回收的时间。特别是对象缓存，本系统使用了8G的缓存空间，共缓存了6000多万个对象，对这些对象的遍历导致了长时间的内存回收。根据我们的建议，将缓存空间减少到1G，并调整回收算法（使用增量回收的算法），使得系统由于内存回收而造成的最大停顿时间减少到4秒，基本满足用户的需求。</p>
<h3><br />
外部命令问题</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数字校园应用运行在4CPU的Solaris10服务器上，中间件为JavaEE服务器。系统在做大并发压力测试的时候，请求响应时间比较慢，通过操作系统的工具（mpstat）发现CPU使用率比较高。并且系统占用绝大多数的CPU资源而不是应用本身。这是个不正常的现象，通常情况下用户应用的CPU占用率应该占主要地位，才能说明系统是正常工作。通过Solaris 10的Dtrace脚本，我们查看当前情况下哪些系统调用花费了最多的CPU资源，竟然发现最花费CPU的系统调用是&#8220;fork&#8221;。众所周知， &#8220;fork&#8221;系统调用是用来产生新的进程，在Java虚拟机中只有线程的概念，绝不会有进程的产生。这是个非常异常的现象。通过本系统的开发人员，我们找到了答案：每个用户请求的处理都包含执行一个外部shell脚本，来获得系统的一些信息。这是通过Java的&#8220;Runtime.getRuntime ().exec&#8221;来完成的，但是这种方法在Java中非常消耗资源。Java虚拟机执行这个命令的方式是：首先克隆一个和当前虚拟机一样的进程，再用这个新的进程去执行外部命令，最后再退出这个进程。如果频繁执行这个操作，系统的消耗会很大，不仅在CPU，内存操作也很重。用户根据建议去掉这个shell 脚本执行的语句，系统立刻回复了正常。</p>
<h3><br />
文件操作问题</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 内容管理（CMS）系统运行在JavaEE服务器上，当系统长时间运行以后，性能非常差，用户请求的延时比系统刚上线的时候要大很多，并且用户的并发量很小，甚至是单个用户也很慢。通过操作系统的工具观察，一切都很正常，CPU利用率不高，IO也不是很大，内存很富余，网络几乎没有压力（因为并发用户少）。先不考虑线程互锁的问题，因为单个用户性能也不好。通过Java虚拟机观察也没有发现什么问题（内存回收很少发生）。这使得我们不得不使用代码跟踪器来全程跟踪代码。我们采用了Netbeans的Profiler，跟踪的结果非常意外，用户请求的90％的时间在创建新文件。从系统设计人员了解到，此系统使用了一个目录用于保存所有上传和共享的文件，文件用其命名方式来唯一区别于其他文件。我们查看了那个文件目录，发现该目录下已经拥有80万个文件了。这时候我们才定位到问题了：在同个目录下放置太多的文件，在创建新文件的时候，系统的开销是比较大的，例如为了防止重名，文件系统会遍历当前目录下所有的文件名等等。根据我们的建议，将文件分类保存在不同的目录下，性能有了大幅度的提高。</p>
<h3><br />
高速缓存命中率问题</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行在JavaEE服务器上的ERP系统，在CPU充分利用的情况下性能仍然不太好。从操作系统层面上观察不到什么大问题，而且ERP系统过于复杂，代码跟踪比较困难。于是进行了CPU状态的进一步检查，发现CPU的TLB命中率不是很高，于是对Java虚拟机的启动参数进行了修改，强迫虚拟机使用大尺寸的内存页面，提高TLB的命中率。下面的参数是在Sun的HOTSPOT中调整大尺寸（4M）页面的设置：<br />
-XX:+AggressiveHeap<br />
-XX:LargePageSizeInBytes=256m<br />
通过调整，TLB命中明显提高，性能也得到近40％的提升。</p>
 <img src ="http://www.blogjava.net/kit-soft/aggbug/292855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kit-soft/" target="_blank">kit_lo</a> 2009-08-27 17:13 <a href="http://www.blogjava.net/kit-soft/articles/292855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>