`
kalogen
  • 浏览: 878159 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

生产环境-linux-tomcat宕掉解决办法

 
阅读更多

对于中小公司使用tomcat作为java容器,没有经过系统的调优很容易出现tomcat在运行过程中出现服务宕掉,并且在tomcat的日志中一般无法看出有用的信息,而此次实例中对tomcat宕机后调优,是由公司的构架进行调整,他是对JVM调优有着非常深的理解,而作者对JVM调优的理解比较浅薄,所以本实例不会过多讲解调优的原理,只记录分析和调优的过程,希望能给各位遇到tomcat宕机的运维朋友们带来一点思路。

一、tomcat宕掉初步分析

    生产环境的tomcat会在隔几天的情况下服务宕掉,这其中没有规律,有规律的是tomcat宕掉每次都是在版本升级后重启10分钟~60分钟内,并不是每次重启tomcat都会宕掉,如果tomcat启动超过一天,运行过程中是不会宕掉的,而且再次重启tomcat后,就不会再出现tomcat宕掉的情况,这可以初步排除上线代码导致的主因(新代码上线其实也是有一部分原因,后面会讲)。

    查看tomcat的catalina.out日志:

1
2
3
4
5
6
7
8
9
10
11
2015-1-5 13:35:41 org.apache.coyote.http11.Http11NioProtocol pause
信息: Pausing Coyote HTTP/1.1 on http-8890
2015-1-5 13:35:42 org.apache.catalina.core.StandardService stop
信息: Stopping service Catalina
 
2015-1-5 13:35:42 org.apache.coyote.http11.Http11NioProtocol destroy
信息: Stopping Coyote HTTP/1.1 on http-8890
Exception in thread "Timer-1" java.lang.NullPointerException
        at com.qhfax.invest.balanceAccount.common.util.TaskBalanceAccount.run(TaskBalanceAccount.java:75)
        at java.util.TimerThread.mainLoop(Timer.java:512)
        at java.util.TimerThread.run(Timer.java:462)

    通过日志可以看到,tomcat先暂停了http服务的8890端口,然后停止了核心服务。

    很明显,从上面的日志,我们无法看到任何的有用信息,那该如何办呢?

二、tomcat内存分析调优-开启GC日志

    既然从日志无法看出tomcat是如何宕掉的,那么我们就从分析tomcat内存开始,可以开启gc日志,记录日常JVM在清理内存时的情况,具体步骤如下:

    先展示下,未做过调优前生产tomcat的配置情况(tomcat调优的核心就是JVM参数设置):

1
2
3
4
5
原配置:
编辑{tomcat_home}/bin/catalina.sh,可以直接在顶部#注释说完后,就添加以下参数
export JRE_HOME=/usr/java/jdk1.6.0_38
export CATALINA_HOME=/home/resin/tomcat
JAVA_OPTS="-Xms1024m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m"

JVM启动参数说明:

    -Xms1024m 设置JVM最小可用内存为1024M

    -Xmx1024m 设置JVM最大可用内存为1024M

    -XX:PermSize=512m   JVM初始分配的非堆内存

    -XX:MaxPermSize=512m 设置持久代大小为512M

 

1
2
3
4
修改后配置:
export JRE_HOME=/usr/java/jdk1.6.0_38
export CATALINA_HOME=/home/resin/tomcat
JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xmn512m -XX:+UseParallelOldGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:/home/resin/tomcat/logs/gc.log"

调优后JVM启动参数说明:

    -server server模式启动速度较慢,但是一旦运行起来后,性能将会有很大的提升

    -Xmn512m 设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

    -XX:+UseParallelOldGC  执行垃圾回收器,一般在多线程多处理器机器上使用

    -XX:+PrintGCDateStamps 记录GC日志并不会特别地影响Java程序性能

    -XX:+PrintGCDetails 打印收集的其他信息

    -Xloggc:/****/****/tomcat/logs/gc.log  GC日志路径地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
2.tomcat配置文件server.xml
原配置:
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
    <Connector port="8890" protocol="HTTP/1.1" 
            URIEncoding="UTF-8"   connectionUploadTimeout="36000000" disableUploadTimeout="false" connectionTimeout="60000"    
               redirectPort="8443" />
修改后配置:
 <!-- Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" gcDaemonProtection="false"/ -->   #此语句注释掉
    <Connector executor="tomcatThreadPool"
               port="8890" protocol="org.apache.coyote.http11.Http11NioProtocol" 
   connectionUploadTimeout="36000000" 
               disableUploadTimeout="false" 
               connectionTimeout="60000" 
               redirectPort="8443" />

 说明:注释掉的语句是为了减少JVM的周期性的Full GC频繁问题。

            在初步调优后,之后又出现了一次tomcat宕掉,看来tomcat调优没有还需要继续,通过查看gc.log:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
2015-01-07T14:29:45.658+0800: 169496.327: [GC [PSYoungGen: 5069K->4064K(514304K)] 40126K->39121K(2087168K), 0.0034770 secs] [Times: user=0.04 sys=0.00, real=0.01 secs] 
2015-01-07T14:29:45.661+0800: 169496.331: [Full GC (System) [PSYoungGen: 4064K->0K(514304K)] [ParOldGen: 35057K->38587K(1572864K)] 39121K->38587K(2087168K) [PSPermGen: 51269K->51269K(72128K)], 0.3473340 secs] [Times: user=1.42 sys=0.00, real=0.35 secs] 
2015-01-07T14:55:31.114+0800: 171041.784: [GC [PSYoungGen: 212923K->9959K(514048K)] 251510K->54259K(2086912K), 0.0073020 secs] [Times: user=0.06 sys=0.00, real=0.00 secs] 
2015-01-07T14:55:31.122+0800: 171041.791: [Full GC (System) [PSYoungGen: 9959K->0K(514048K)] [ParOldGen: 44299K->34703K(1572864K)] 54259K->34703K(2086912K) [PSPermGen: 51276K->51274K(69440K)], 0.2653740 secs] [Times: user=0.79 sys=0.01, real=0.27 secs] 
2015-01-07T14:55:31.531+0800: 171042.200: [GC [PSYoungGen: 5345K->2304K(507776K)] 40048K->37007K(2080640K), 0.0024170 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 
2015-01-07T14:55:31.533+0800: 171042.203: [Full GC (System) [PSYoungGen: 2304K->0K(507776K)] [ParOldGen: 34703K->36747K(1572864K)] 37007K->36747K(2080640K) [PSPermGen: 51364K->51363K(67264K)], 0.2703940 secs] [Times: user=0.83 sys=0.00, real=0.28 secs] 
2015-01-07T14:55:37.374+0800: 171048.044: [GC [PSYoungGen: 10021K->10878K(508416K)] 46768K->47625K(2081280K), 0.0026770 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
2015-01-07T14:55:37.377+0800: 171048.046: [Full GC (System) [PSYoungGen: 10878K->0K(508416K)] [ParOldGen: 36747K->34645K(1572864K)] 47625K->34645K(2081280K) [PSPermGen: 51364K->51363K(65216K)], 0.2716380 secs] [Times: user=0.86 sys=0.00, real=0.27 secs] 
2015-01-07T14:55:37.670+0800: 171048.339: [GC [PSYoungGen: 3948K->2880K(510016K)] 38594K->37525K(2082880K), 0.0025790 secs] [Times: user=0.03 sys=0.00, real=0.00 secs] 
2015-01-07T14:55:37.672+0800: 171048.342: [Full GC (System) [PSYoungGen: 2880K->0K(510016K)] [ParOldGen: 34645K->37317K(1572864K)] 37525K->37317K(2082880K) [PSPermGen: 51363K->51363K(63104K)], 0.2714200 secs] [Times: user=0.84 sys=0.00, real=0.27 secs] 
2015-01-07T15:33:44.205+0800: 173334.875: [GC [PSYoungGen: 153420K->14231K(505728K)] 190738K->51548K(2078592K), 0.0048450 secs] [Times: user=0.04 sys=0.00, real=0.00 secs] 
2015-01-07T15:33:44.210+0800: 173334.880: [Full GC (System) [PSYoungGen: 14231K->0K(505728K)] [ParOldGen: 37317K->34594K(1572864K)] 51548K->34594K(2078592K) [PSPermGen: 51364K->51359K(61440K)], 0.2908710 secs] [Times: user=0.89 sys=0.00, real=0.29 secs] 
2015-01-07T15:33:44.514+0800: 173335.183: [GC [PSYoungGen: 3254K->2560K(506816K)] 37849K->37154K(2079680K), 0.0024490 secs] [Times: user=0.03 sys=0.00, real=0.00 secs] 
2015-01-07T15:33:44.516+0800: 173335.186: [Full GC (System) [PSYoungGen: 2560K->0K(506816K)] [ParOldGen: 34594K->36883K(1572864K)] 37154K->36883K(2079680K) [PSPermGen: 51360K->51360K(60224K)], 0.2721010 secs] [Times: user=0.82 sys=0.00, real=0.27 secs]

发现,tomcat会周期在一段时间频繁的进行full gc,说明从JVM内存出发对tomcat调优方向是对的。

二、tomcat内存分析调优-开启HeapDump

        仅仅开启gc.log还是无法分析出tomcat宕掉的具体原因,到底是由什么导致的,这时候就要针对tomcat的OutOfMemory时的内存情况进行分析,于是构架师又进行了第二次调优:

调整JVM启动参数  

1
2
3
原:JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xmn512m -XX:+UseParallelOldGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:/home/resin/tomcat/logs/gc.log"
修改后: 
JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xmn768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:+UseParallelOldGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/resin/tomcat/dumpfile/heap.bin  -Xloggc:/home/resin/tomcat/logs/gc.log"

调优后JVM启动参数说明

-XX:PermSize=128m  方法区内存从默认20M,提高到128M

-XX:MaxPermSize=256m   限定方法区内存最大256M

-XX:+UseParallelOldGC        相当于” Parallel Scavenge” + “ParallelOld”,都是多线程并行处理

-XX:+HeapDumpOnOutOfMemoryError    开启HeapDump

-XX:HeapDumpPath=/*****/****/tomcat/dumpfile/heap.bin   HeapDump输出路径

 

三、如何对HeapDump文件分析

    在上次调优后,tomcat很稳定的跑了2个月,但年后又出现了一次服务宕掉,并且声称了HeapDump文件,那么我们就要对HeapDump文件进行分析了。

  1. 先将HeapDump文件从服务器传输到你的本地电脑。

  2. 使用MemoryAnalyzer-1.4.0.20140604-win32.win32.x86这个软件,使用过程我会在下面截图,软件是构架给我的,51cto下载地址:点这里

    或者打开这个链接:http://down.51cto.com/data/2006879

  3. 打开MemoryAnalyzer.exe,导入HeapDump文件

wKiom1UBCrLChlBxAANhL5pi-dg754.jpg

wKioL1UBC9Whh60hAASdWxuSKGc966.jpg

 

wKiom1UBCrryWAMXAAZqiYBG1mE870.jpg

wKioL1UBC9riInnIAAqhYl4NRq0013.jpg

    至此,我们就大致找到了导致此次tomcat宕掉的原因,剩下的就是将此次分析报告交给上司,后面的工作就是开发的了,可以看到因代码或应用无限循环导致内存泄露,再对JVM调优已无意义。

四、总结

    以上只是给各位遇到此类问题的运维童鞋一些思路,如果遇到这种棘手的问题导致找出最终原因,其中涉及到JVM调优的东东,作者暂时涉及不深,可能存在错误的地方,往各路大神指正!

    具体关于JVM调优,作者手机了几篇比较给力的,特贡献出来:

    JVM原理及调优--网页链接收藏

原文地址:
http://vekergu.blog.51cto.com/9966832/1619640

 

分享到:
评论

相关推荐

    Tomcat7---Linux版本apache-tomcat-7.0.82.tar.gz

    总结,"Tomcat7---Linux版本apache-tomcat-7.0.82.tar.gz"是一个在Linux环境中运行的Java Web服务器,具备部署和管理Java应用的能力。正确安装、配置和维护Tomcat7对于开发者和运维人员来说至关重要。通过持续学习和...

    linux jdk+tomcat安装

    如果遇到权限问题,例如提示 `-bash: ./jdk-6u45-linux-x64.bin: Permission denied`,可以先通过 `chmod 777 jdk-6u45-linux-x64.bin` 赋予文件执行权限,然后再运行安装命令。 - 在安装过程中,会显示协议条款,...

    jdk-8u151-linux-x64.rpm

    Linux环境下的Tomcat所依赖的jdk8的环境rpm版 Linux环境下的Tomcat所依赖的jdk8的环境rpm版 Linux环境下的Tomcat所依赖的jdk8的环境rpm版 Linux环境下的Tomcat所依赖的jdk8的环境rpm版 Linux环境下的Tomcat所依赖的...

    Apache-tomcat-6.0.53 for Linux(Redhat/CentOS测试通过)

    输入命令:tar -zxvf apache-tomcat-6.0.53.tar.gz 在目录下有apache-tomcat-6.0.53文件夹,重命名为tomcat 2、修改环境变量 在目录/etc下修改profile文件 export CATALINA_HOME=/usr/local/tomcat export CLASSPATH...

    apache-tomcat7 linux

    默认情况下,Tomcat的管理界面是开放的,为了安全,需要配置用户和角色,修改 `$CATALINA_HOME/conf/tomcat-users.xml` 文件添加用户和角色。例如: ```xml &lt;role rolename="manager-gui"/&gt; ...

    apache-tomcat-7.0.90-linux

    在Linux环境中部署和运行Tomcat,可以为开发者和系统管理员提供一个轻量级且高效的Web服务器解决方案。 1. **Tomcat简介**:Tomcat是Apache软件基金会的Jakarta项目的一部分,主要负责处理Java的动态内容。它不仅是...

    linux64_tomcat7

    在Linux环境下,用户可以使用`tar -zxvf apache-tomcat-7.0.39.tar.gz`命令来解压。解压后,会得到一个包含Tomcat所有文件和目录的结构,其中包括启动和停止服务器的脚本、配置文件、Web应用目录(如webapps)、日志...

    Linux apache-tomcat-5.5.33.tar.gz

    `apache-tomcat-5.5.33.tar.gz`这个文件意味着它包含了Apache Tomcat 5.5.33的所有组件,包括配置文件、库、可执行文件等,压缩后便于在网络上传输或节省磁盘空间。 解压此文件通常会得到一个名为`apache-tomcat-...

    linux-jdk-7u80-tomcat7.0.67

    首先,我们来了解`jdk-7u80-linux-x64.tar.gz`。这是Oracle JDK的第7个更新版本,具体是Update 80(7u80),专为64位Linux系统设计。Java JDK是Java编程语言和平台的基础,它包含了开发和运行Java程序所需的所有工具...

    最新版linux apache-tomcat-9.0.37.tar.gz

    标题中的"最新版linux apache-tomcat-9.0.37.tar.gz"指的是适用于Linux操作系统的Apache Tomcat服务器的9.0.37版本,该版本被打包成了tar.gz格式的压缩文件。这种格式在Linux中很常见,因为它可以方便地进行文件归档...

    官方tomcat10.0.0-Linux版本-Java工具类资源

    官网正式版本,此版本为10.0.0版本,适用于Linux系统。 解压直接安装,然后配置环境变量,将路径加到PATH即可,然后在命令行里测试,操作startup.bat启动Tomcat,打开的情况下,输入浏览器地址...

    tomcat-linux-apache-tomcat-8.0.44.tar.gz

    9. **安全性**:为了增强安全性,需要配置 `conf/tomcat-users.xml` 添加管理员用户,并启用管理应用程序的访问控制。 10. **监控与性能优化**:通过JMX(Java Management Extensions)可以监控Tomcat的性能指标。...

    tomcat-juli.jar,tomcat-juli-adapters.jar,log4j-1.2.12.jar tomcat 6日志输出

    总结来说,`tomcat-juli.jar`和`tomcat-juli-adapters.jar`是Tomcat的自定义日志实现,而`log4j-1.2.12.jar`提供了一种更强大的替代日志解决方案。通过配置这些组件,我们可以有效地管理和控制Tomcat 6的日志输出,...

    tomcat-redis-session-manager的jar包-包含Tomcat7和Tomcat8

    《深入理解Tomcat-Redis-Session-Manager:在Tomcat7和Tomcat8中的应用》 ...无论是为了提升服务性能,还是为了应对复杂的集群环境,Tomcat-Redis-Session-Manager都是一个值得考虑的优秀解决方案。

    tomcat_linux

    【标题】"Tomcat在Linux环境下的部署与运行" 【正文】 Tomcat是一款广泛应用的开源Java Servlet容器,它实现了Java EE中的Web应用服务规范。在Linux环境下部署Tomcat,可以充分利用Linux系统的稳定性和安全性,为...

    tomcat-redis-session-manager包集合下载(tomcat8)

    【描述】中提到的"所需的tomcat-redis-session-manager所有的jar包下载"意味着我们需要了解如何配置和使用这个第三方库,以便在Tomcat8环境中存储和检索用户的session数据到Redis缓存系统。测试环境使用的是JDK1.8,...

    tomcat-redis-session-manager-1.2-tomcat-6&7

    标题 "tomcat-redis-session-manager-1.2-tomcat-6&7" 指的是一个用于在Tomcat服务器中集成Redis作为session管理器的组件。这个组件使得Web应用程序可以利用Redis分布式缓存系统来存储和管理用户的会话数据,从而...

    tomcat-8.5-linux

    【标题】"tomcat-8.5-linux"指的是在Linux操作系统环境下使用的Apache Tomcat服务器的8.5版本。Apache Tomcat是一款开源的Java Servlet容器,主要用于处理Java Web应用程序,包括JSP、Servlet以及JavaServer Pages等...

    apache-tomcat-8.0.30 linux 64位

    首先,下载完`apache-tomcat-8.0.30.tar.gz`后,你需要将其解压到你希望安装的目录。在Linux命令行中,可以使用以下命令来完成这个操作: ```bash wget ...

Global site tag (gtag.js) - Google Analytics