论坛首页 Java企业应用论坛

用Tomcat5.0.27单独作WebServer时遇到的问题。

浏览 32419 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-11-10  
项目用Tomcat5.0.27单独作WebServer,处理所有Http请求,将8080端口映射改成了80端口,并调整了其他一些参数配置。人数少时访问没问题,当访问量一升高整台服务器就被堵死了,ping不通,只能重启服务器。最初以为是数据池中的链接没闭,经查验之后每connection都调用了close()方法,DBCP配置也没发现问题。在需访问数据库地也要增加了相应的缓冲处理。Tomcat初始内存为300M,最大内存为500M。最近服务器死机特频繁,几乎到每天晚上都要死2到3次,可是能晚上上网的人比较多。同时在线200多人时就很慢了,再多些确定歇菜。
    项目只有我一个人撑着,问题确总解决不了,郁闷ing。下面是Tomcat的一些配置,请看一下还需怎么改一下会更稳定些。

<?xml version='1.0' encoding='utf-8'?>
<Server>
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
  <GlobalNamingResources>
    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>
    <Resource auth="Container" description="User database that can be updated and saved" name="UserDatabase" type="org.apache.catalina.UserDatabase"/>
    <ResourceParams name="UserDatabase">
      <parameter>
        <name>factory</name>
        <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
      </parameter>
      <parameter>
        <name>pathname</name>
        <value>conf/tomcat-users.xml</value>
      </parameter>
    </ResourceParams>
  </GlobalNamingResources>
  <Service name="Catalina">
    <Connector acceptCount="128"  bufferSize="20480" connectionTimeout="20000" disableUploadTimeout="true" maxKeepAliveRequests="400" port="80" redirectPort="8443" threadPriority="100" maxSpareThreads="200" maxThreads="300" minSpareThreads="100">
    </Connector>
    <Connector port="8009" protocol="AJP/1.3" protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler" redirectPort="8443">
    </Connector>
    <Engine defaultHost="localhost" name="Catalina">
      <Host appBase="webapps" name="localhost">
        <Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_log." suffix=".txt" timestamp="true"/>
      </Host>
      <Logger className="org.apache.catalina.logger.FileLogger" prefix="catalina_log." suffix=".txt" timestamp="true"/>
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
    </Engine>
  </Service>
</Server>

<?xml version='1.0' encoding='utf-8'?>
<Context displayName="Example" docBase="E:/WorkSpace/Example" path="/Example" >
  <Resource name="jdbc/sms" type="javax.sql.DataSource"/>
  <Resource name="jdbc/gd" type="javax.sql.DataSource"/>
  <Resource name="jdbc/bbs" type="javax.sql.DataSource"/>
  <ResourceParams name="jdbc/sms">
    <parameter>
      <name>restartNeeded</name>
      <value>true</value>
    </parameter>
    <parameter>
      <name>password</name>
      <value></value>
    </parameter>
    <parameter>
      <name>maxIdle</name>
      <value>20</value>
    </parameter>
    <parameter>
      <name>minEvictableIdleTimeMillis</name>
      <value>900000</value>
    </parameter>
    <parameter>
      <name>driverClassName</name>
      <value>com.mysql.jdbc.Driver</value>
    </parameter>
    <parameter>
      <name>username</name>
      <value>root</value>
    </parameter>
    <parameter>
      <name>testOnBorrow</name>
      <value>true</value>
    </parameter>
    <parameter>
      <name>maxWait</name>
      <value>5000</value>
    </parameter>
    <parameter>
      <name>url</name>
      <value>jdbc:mysql://127.0.0.1:3306/sms?useUnicode=true&characterEncoding=iso-8859-1&autoReconnect=true</value>
    </parameter>
    <parameter>
      <name>testWhileIdle</name>
      <value>true</value>
    </parameter>
    <parameter>
      <name>maxActive</name>
      <value>20</value>
    </parameter>
    <parameter>
      <name>timeBetweenEvictionRunsMillis</name>
      <value>-1</value>
    </parameter>
    <parameter>
      <name>testOnReturn</name>
      <value>true</value>
    </parameter>
    <parameter>
      <name>numTestsPerEvictionRun</name>
      <value>3</value>
    </parameter>
    <parameter>
      <name>removeAbandonedTimeout</name>
      <value>100</value>
    </parameter>
    <parameter>
      <name>validationQuery</name>
      <value>select 1+1</value>
    </parameter>
    <parameter>
      <name>removeAbandoned</name>
      <value>true</value>
    </parameter>
    <parameter>
      <name>minIdle</name>
      <value>0</value>
    </parameter>
  </ResourceParams>
  <ResourceParams name="jdbc/gd">
    <parameter>
      <name>restartNeeded</name>
      <value>true</value>
    </parameter>
    <parameter>
      <name>password</name>
      <value></value>
    </parameter>
    <parameter>
      <name>maxIdle</name>
      <value>10</value>
    </parameter>
    <parameter>
      <name>minEvictableIdleTimeMillis</name>
      <value>900000</value>
    </parameter>
    <parameter>
      <name>driverClassName</name>
      <value>com.mysql.jdbc.Driver</value>
    </parameter>
    <parameter>
      <name>username</name>
      <value>root</value>
    </parameter>
    <parameter>
      <name>testOnBorrow</name>
      <value>true</value>
    </parameter>
    <parameter>
      <name>maxWait</name>
      <value>5000</value>
    </parameter>
    <parameter>
      <name>url</name>
      <value>jdbc:mysql://127.0.0.1:3306/gd?useUnicode=true&characterEncoding=iso-8859-1&autoReconnect=true</value>
    </parameter>
    <parameter>
      <name>testWhileIdle</name>
      <value>true</value>
    </parameter>
    <parameter>
      <name>maxActive</name>
      <value>10</value>
    </parameter>
    <parameter>
      <name>timeBetweenEvictionRunsMillis</name>
      <value>-1</value>
    </parameter>
    <parameter>
      <name>testOnReturn</name>
      <value>true</value>
    </parameter>
    <parameter>
      <name>numTestsPerEvictionRun</name>
      <value>3</value>
    </parameter>
    <parameter>
      <name>removeAbandonedTimeout</name>
      <value>100</value>
    </parameter>
    <parameter>
      <name>validationQuery</name>
      <value>select 1+1</value>
    </parameter>
    <parameter>
      <name>removeAbandoned</name>
      <value>true</value>
    </parameter>
    <parameter>
      <name>minIdle</name>
      <value>0</value>
    </parameter>
  </ResourceParams>
  <ResourceParams name="jdbc/bbs">
    <parameter>
      <name>url</name>
      <value>jdbc:mysql://127.0.0.1:3306/bbs?useUnicode=true&characterEncoding=UTF8&autoReconnect=true</value>
    </parameter>
    <parameter>
      <name>validationQuery</name>
      <value>select 1+1</value>
    </parameter>
    <parameter>
      <name>maxIdle</name>
      <value>4</value>
    </parameter>
    <parameter>
      <name>maxActive</name>
      <value>4</value>
    </parameter>
    <parameter>
      <name>driverClassName</name>
      <value>com.mysql.jdbc.Driver</value>
    </parameter>
    <parameter>
      <name>maxWait</name>
      <value>5000</value>
    </parameter>
    <parameter>
      <name>numTestsPerEvictionRun</name>
      <value>3</value>
    </parameter>
    <parameter>
      <name>testWhileIdle</name>
      <value>true</value>
    </parameter>
    <parameter>
      <name>minEvictableIdleTimeMillis</name>
      <value>900000</value>
    </parameter>
    <parameter>
      <name>removeAbandoned</name>
      <value>true</value>
    </parameter>
    <parameter>
      <name>testOnReturn</name>
      <value>true</value>
    </parameter>
    <parameter>
      <name>username</name>
      <value>root</value>
    </parameter>
    <parameter>
      <name>minIdle</name>
      <value>0</value>
    </parameter>
    <parameter>
      <name>timeBetweenEvictionRunsMillis</name>
      <value>-1</value>
    </parameter>
    <parameter>
      <name>removeAbandonedTimeout</name>
      <value>100</value>
    </parameter>
    <parameter>
      <name>password</name>
      <value></value>
    </parameter>
    <parameter>
      <name>testOnBorrow</name>
      <value>true</value>
    </parameter>
  </ResourceParams>
</Context>
   发表时间:2004-11-10  
http://forum.iteye.com/viewtopic.php?t=8321
0 请登录后投票
   发表时间:2004-11-10  
JVM、系统、AppServer、数据库,好像每项都要改一顿。我在Tomcat上共跑了四个应用,其中有三个应用项目用到了MYSQL数据,均通过DBCP获取数据源。有两个应用访问最频繁,主要是网站主体与论坛,论坛是JIVE3.11汉化版本,网站主体则是自己写的Struts+DAO应用。
    目前计划:1、查程序,找出程序上的不足;2、根据管理员建议查数据库文档,修改数据配置;3、查Tomcat文档,修改参数值;4、试一下加一个apache2代理下(另一个头疼问题:apache+jk2+tomcat总是有问题);5、实在不行就换一个AppServer产品。
0 请登录后投票
   发表时间:2004-11-11  
老大,你想在tomcat上跑多少并发用户?
另外,服务器性能调优可是一个大大的学问,包括你的OS,DB等等参数调节。
0 请登录后投票
   发表时间:2004-11-11  
楼上这位哥哥,我知道调优的学问很大,但项目只有我一个人负责,找不到其他人帮我。正是苦于不知要修改些什么设置、参数,目前只能先从自身找原因。最近网站项目问题变本加利,同时100多人时就死,我都快气疯了。希望有经验的仁兄们多指点一下。
0 请登录后投票
   发表时间:2004-11-11  
为什么非要单独用tomcat做web server?
可以考虑整合apache.
从你描述的看,问题可能出在内存上,你的应用占用的内存太大,而你分给tomcat的内存太小,所以出现OutOfMemoryError.  tomcat当掉时查看进程信息可以确认这种情况。(别告诉我你不知道怎么查看啊)。
你可以试试把tomcat内存设置为512M-1024M。(当然,检查你的程序的内存泄漏或者把不该占用内存的东东清除出内存才是这个问题的釜底抽薪之道)
0 请登录后投票
   发表时间:2004-11-11  
你首先要找出应用的瓶颈:

(1)tomcat的连接数什么时候达到到最大。
(2)监控mysql当前连接数的情况和当前是哪些sql语句在执行。看看这些语句的执行计划。
(3)分析哪些页面打开所需的时间过长。看看程序是否有问题。

看看你的描述,觉得这几个方面你要注意:
(1)你可以把JVM的初始内存和最大内存设置成一样大小,这是推荐的做法。
(2)难道你所有的页面都是动态的嘛,静态的页面你可以有apache来处理,那么对这些页面的访问不会占用tomcat的连接。
(3)动态的页面取得的数据从cache中取得(特别是不大变化的数据),这样减少数据库的压力。

当然还有很多。。。。。

最后,这些优化你都做好了,还是不行,那只有最后的杀手锏,向领导要预算买内存和服务器。多个应用服务器load balance,mysql采用读写分开。
一般论坛一台web服务器和一个数据库服务器的配置,十几万的PV是没问题的,有问题的话就是你的配置、架构、优化做的不好。
0 请登录后投票
   发表时间:2004-11-11  
项目中所有页面都是用过Struts+Tiles配置出来的动态页面。每个页面只有与具体业务相关的展示代码,展示所需数据又是经过action从业务BEAN中获得,业务BEAN又是用DAO与数据库交互,在业务BEAN中也作了一定CACHE处理。纯静态的页面非常少。因此,每个页面访问都要经tomcat处理占用了它大量的处理资源。论坛部分是JIVE汉化版,我想问题应该不大。

APACHE2+JK2+TOMCAT我也试过,但加入APACHE2之后网站上所有的图片、CSS、JS等文件路径全都找不到,撤掉APACHE2之后一切正常,在网上找到一些apache2配tomcat的文档可都有同样的问题,不得以只能让TOMCAT自已担负全部职责,辛苦他了。 现在我已经把JVM内存分配到600M,并修改了一些OS网络参数,希望能起一些作用。希望能找到APACHE2配Tomcat确实可行的文档。

    谢谢大家的给出的指导与建议,如有其他方案请大家继续提。目前我正在检查程序。

以下是服务器的配置:
机型:Dell Server PE1750
CPU:Intel 2.8G
内存:1G
系统:Microsoft Windows 2000 5.00.2195 SP4
硬盘:80G
Tomcat:5.0.27
Mysql:4.0.18
0 请登录后投票
   发表时间:2004-11-12  
Apache2 + Tomcat 的相关文档很多啊,你可以把tomcat的root设置为apache的root,不会有路径的问题.
0 请登录后投票
   发表时间:2004-12-05  
纯动态页面的应用不要加apache2, 加上会更慢。
监测硬盘的IO, 看你的配置好象只有1个硬盘。单硬盘并发读写时性能下降的很多。
0 请登录后投票
论坛首页 Java企业应用版

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