`
cantellow
  • 浏览: 848309 次
  • 性别: Icon_minigender_1
  • 来自: 草帽海贼团
社区版块
存档分类
最新评论

关于resin ping超时的问题

    博客分类:
  • web
 
阅读更多

最近遇到一个很奇怪的问题,就是在高峰期的时候,resin会ping ok超时(这是resin的一个自动检查工具,在conf/resin.conf配置),如下图:

三次以上超时的话就会自动重启,因为之前没有过这方面的经验,所以解决起来很费劲,走了很多弯路(由于每次超时基本上都会有Forcing GC due to low memory这样的字眼,所以开始误以为是内存泄露),下面是分析经过,希望对有些人有帮助。

 

我在服务器ping超时的时候dump了一些信息(dump脚本文章末尾给出),我们来分析一下

 

首先看load21:58:15 up 34 days,  1:24,  2 users,  load average: 0.32, 0.28, 0.27

很明显load不高。

 

再看top

USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                    

root      18   0 12.1g  10g  89m S 21.7 70.0 203:49.72 java

cpu占用率也不高,这表示java没有进行密集的cpu计算,java内存占了70%,也就是15.6G*0.7=10.96G

 

再看看堆内存信息:

Eden Space:

   capacity = 5910298624 (5636.5MB)

   used     = 5481955816 (5228.000465393066MB)

   free     = 428342808 (408.4995346069336MB)

   92.75260295206363% used

From Space:

   capacity = 190119936 (181.3125MB)

   used     = 0 (0.0MB)

   free     = 190119936 (181.3125MB)

   0.0% used

To Space:

   capacity = 190578688 (181.75MB)

   used     = 0 (0.0MB)

   free     = 190578688 (181.75MB)

   0.0% used

PS Old Generation

   capacity = 4194304000 (4000.0MB)

   used     = 2836024848 (2704.644058227539MB)

   free     = 1358279152 (1295.355941772461MB)

   67.61610145568848% used

PS Perm Generation

   capacity = 190840832 (182.0MB)

   used     = 99512072 (94.90210723876953MB)

   free     = 91328760 (87.09789276123047MB)

   52.144014966356885% used

 

总共申请到的内存一共有:5636.5+181.3125+181.75+4000+182=10255.8125MB/1024M=10.015G,这说明JNI调用花费的内存为10.96-10.015=0.945GJNI不存在内存泄漏。

 

可能有人觉得Eden用了92%,是不是太高了点,这很正常,它马上会被回收掉,我们可以再看看另一台服务器的堆内存信息:

Eden Space:

   capacity = 9814802432 (9360.125MB)

   used     = 1181853960 (1127.1037673950195MB)

   free     = 8632948472 (8233.02123260498MB)

   12.041546105367392% used

From Space:

   capacity = 337051648 (321.4375MB)

   used     = 245305144 (233.94121551513672MB)

   free     = 91746504 (87.49628448486328MB)

   72.7796898355471% used

To Space:

   capacity = 333905920 (318.4375MB)

   used     = 0 (0.0MB)

   free     = 333905920 (318.4375MB)

   0.0% used

PS Old Generation

   capacity = 8388608000 (8000.0MB)

   used     = 3622388416 (3454.5787963867188MB)

   free     = 4766219584 (4545.421203613281MB)

   43.18223495483399% used

PS Perm Generation

   capacity = 100728832 (96.0625MB)

   used     = 100571056 (95.91203308105469MB)

   free     = 157776 (0.1504669189453125MB)

   99.84336560161842% used

 

这样看来内存是完全够用的,Perm设置为256M,之后还会膨胀,所以99%也没什么。

我们再来看看gc信息:

 S0C      S1C      S0U    S1U      EC       EU         OC          OU       PC       PU       YGC   YGCT    FGC    FGCT     GCT  

185664.0 186112.0  0.0    0.0   5771776.0 5330191.7 4096000.0  2769555.5  186368.0 97179.8    266  106.315   5     19.005  125.320

我也没看出来有什么异常。

 

我们来总结一下:

内存够用

cpu也没有进行大量的操作

gc正常

关键是也没有发生oom异常(这表示内存够用)

另外,并不是每次超时之前resin都会打印Forcing GC due to low memory这样的字眼

所以,我认为不是内存泄漏的原因,也就不用再分析2G多大的heap文件了。

 

如果不是内存泄漏的原因,那么到底是什么原因呢?

有两个因素引起了我的注意:

1.以前也有过这种情况,但是也没有这么频繁,最近开始变得有点频繁了

2.我统计了发生超时的时间,绝大部分都集中在访问的高峰期

 

整个问题的关键因素是搞清楚resin为什么会ping超时,是cpu忙不过来了?不是,是网络堵了?也不是,是内存不够?也不是,那到底是为什么呢?上述信息明显不够,于是我在服务器上开启了resinaccess.log;从access.log上可以看出,有大量的最近刚上线的请求这是不是就是最近频繁发生的原因呢?另外,我在服务器发生超时的时候接了一个图:


 从截图来看,224538发生一次超时,从access.log来看,前一次ping发生在22:44:17,第二次ping发生在22:45:45,照理说,ping是每隔1分钟ping的,也就是说第二次ping应该发生在22:45:17,但是却发生在22:45:45,中间这个误差就是超时的时间。也就是说这个ping操作完全没有连接上resin,突然想到,不是cpu忙不过,不是内存不够,那极有可能是达到了最大连接数限制了,刚开始我以为是thread-max配置最大连接数,后来仔细查了资料,发现不是这么回事。

 

Thread-maxthread-pool配置的,threadpool就是一个加工厂,每个thread都是一个工人,它们处理来自tcp连接的请求,所以不是连接数的设置。从网上找的资料,下了一个resin3.0.21源码包,找到Port类:

 

我没有去查找_connectionMax是否动态设置,但是据网上说resin是写死了的(又有的人说是pro专业版提供配置,但是我看Port类提供了动态设置的方法),也就是说最大连接数不能超过512个,看看代码:


 Port线程负责创建新的tcp连接,上面是代码,从这里可以看出,如果超出了最大连接数,就会等待60s,这个时间,ping早就超时了!!

 

那么我们的ping超时的时候,最大连接数到底是多少呢?幸好我当时也一并dump下了jstack,查找resin-tcp-connection-*:8080-,一共有515个这样的线程,除去"resin-tcp-connection-*:8080-101-EventThread""resin-tcp-connection-*:8080-101-SendThread(UserZooKeeper5:2181)""resin-tcp-connection-*:8080-101-SendThread(UserZooKeeper3:2181)"这三个不是用户tcp连接(是什么我也不知道),刚好剩下512个线程,这是巧合吗?好吧,我们再看看线上没有问题服务的tcp连接数,搜索resin-tcp-connection-*:8080-,一共是286个,小于512,这也是巧合吗?种种迹象表明,在ping超时时,我们的连接数达到了最大值512!!

 

最后的解决方法是,我参考了网上的方法,为resin加大了连接数,<http server-id="" host="*" port="8080" connection-max="700"/>

 

======================================dump脚本======================================

#!/bin/bash
export JAVA_HOME=/opt/j2sdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH

time=`date +"%Y-%m-%d-%H:%M:%S"`
dir="/data/dump"
if [ ! -x $dir ]
then
 mkdir $dir
fi

#load
w > $dir/load_$time.data
echo load done!

#java cpu/mem
top -n 1 > $dir/top_$time.data
echo top done!

#resin pid
pid=`/opt/j2sdk/bin/jps | grep Resin | cut -d' ' -f1`
echo resin pid is $pid...

#gc
jstat -gc $pid > $dir/gc_$time.data
echo gc done!

#heap info
jmap -heap $pid > $dir/heapinfo_$time.data
echo heap info done!

#histo
jmap -histo:live $pid  > $dir/histo_$time.data
echo histo done!

#heap dump
jmap -dump:live,format=b,file=$dir/heapdump_$time.bin $pid
echo heap dump done!

#jstack
jstack $pid > $dir/jstack_$time.data

echo jstack done!
 

 

  • 大小: 121 KB
  • 大小: 12.3 KB
  • 大小: 51 KB
3
2
分享到:
评论
2 楼 zcsunt 2012-08-19  
写的很赞。刚好我也遇到同样的问题了,可以参考一下。
1 楼 dxm1986 2012-01-29  

相关推荐

    resin常见有关问题

    【Resin常见有关问题详解】 Resin是一款由CAUCHO公司开发的高性能Web服务器和应用服务器,它专门支持Servlets和JSP,并以其快速的处理能力而受到青睐。Resin内建了HTTP/1.1协议的支持,不仅擅长处理动态内容,而且...

    运维-resin常见问题.txt

    ### 运维-resin常见问题解析 #### 1. Resin服务器基础问题 ##### 1.1 Resin服务器概述 Resin是一款高性能的企业级Java应用服务器,它支持Servlet、JSP以及各种Java EE规范,被广泛应用于Web应用程序的部署与运行...

    resin3 和 resin4

    Resin,由CAUCHO公司开发,是一款备受推崇的应用服务器,尤其在处理Servlet和JSP方面表现出色。作为Java语言的产物,Resin以其高效能和稳定性的特点,在IT行业中赢得了广泛的认可。Resin3和Resin4是该服务器软件的两...

    resin服务器有3部分,resin1,resin-webapp,resin-lib,由于大小限制分开传

    Resin服务器是一款高性能的Java应用服务器,由Caucho Technology公司开发。它的设计目标是提供高效、稳定且易于管理的平台来运行Java EE应用程序。在您提到的压缩包文件中,"resin1"、"resin-webapp"和"resin-lib"这...

    resin3 resin3下载

    在使用Resin3的过程中,应关注日志输出,以便及时发现和解决问题。Resin3的错误日志通常位于logs目录下。此外,Resin3的社区和官方文档是获取帮助的重要资源,它们包含了丰富的教程和解决方案。 总的来说,Resin3...

    resin中关于日志的配置

    这篇博客文章“resin中关于日志的配置”着重讲解了如何在Resin服务器上管理和配置日志系统,这对于监控应用状态、调试问题以及优化性能至关重要。下面将详细阐述相关知识点。 1. **日志的重要性**: - 日志记录了...

    Resin源码解读1

    分析启动日志有助于我们了解Resin的启动流程,及时发现并解决问题。总结分析启动日志,可以发现服务器启动时可能遇到的问题,如配置错误、依赖库缺失等,为故障排查提供线索。 二、运行时调试日志 运行时调试日志...

    resin内存益出后自动重启

    当Resin服务器遇到内存溢出(`java.lang.OutOfMemoryError`)时,如果不采取相应的措施,可能导致服务中断或响应延迟等问题。 #### 内存溢出的原因与表现 内存溢出主要指的是程序运行过程中所需的内存空间超过了...

    resin-1 resin服务器有三部分

    【标题】:“resin-1 resin服务器的组件详解” 【正文】: Resin服务器是一款高效、轻量级的Java应用服务器,尤其适用于处理高并发的Web应用。它由多个核心组件构成,使得其在性能、稳定性和扩展性上具有显著优势。...

    resin4.0 服务器 (for windows版本)

    Resin 4.0 服务器是一款高性能的Java应用服务器,尤其在Windows环境下有着出色的表现。Resin是由Caucho Technology开发的,它以其快速、稳定和高效而闻名,被誉为世界上最快的Web服务器之一。这款服务器主要面向需要...

    resin3.0中的https配置

    - 将 `C:\Program Files\GnuWin32\bin\` 目录下的 `libssl32.dll` 和 `libeay32.dll` 两个文件复制到 Resin 的根目录下。 #### 四、生成 SSL 证书 1. **创建 keys 目录**: - 在 Resin 根目录下创建名为 `keys` ...

    resin-4.0.7-src

    以下是一些关于Resin 4.0.7版本的关键知识点: 1. **性能优化**:Resin以其高性能著称,它使用了预编译JSP和HTTP连接池等技术,以提高响应速度和并发处理能力。 2. **轻量级架构**:Resin的设计目标是轻量级和高效...

    centos下resin-2.1.17安装

    - 其他高级配置,如缓存策略、连接超时等也可以在此处进行设置。 #### 五、配置防火墙 1. **编辑防火墙规则:** - 使用文本编辑器打开防火墙配置文件: ```bash vi /etc/sysconfig/iptables ``` - 添加允许 ...

    非常有用的resin配置

    Resin是一款高性能、轻量级的Java应用服务器,主要用于运行Java EE应用。下面将详细介绍Resin配置中的几个关键点。 1. **Resin默认端口配置** 默认情况下,Resin独立的Web服务器监听HTTP请求的端口是8080,而用于...

    resin-3.1.8

    9. **日志和监控**:Resin提供详细的日志记录和监控工具,帮助开发者和管理员诊断问题、优化性能。 10. **热部署**:Resin支持应用的热部署,开发者可以在不中断服务的情况下更新应用,提高了开发和维护效率。 在...

    resin-3.0.22.zip

    关于压缩包"resin-3.0.22.zip",其中包含的文件和目录将构成Resin服务器的完整安装包。解压后,用户可以找到配置文件、启动脚本、库文件以及必要的文档,按照官方提供的指南进行安装和配置,即可启动和使用Resin ...

    resin的eclipse插件,支持resin 3.1

    Resin是一款高性能、轻量级的Java应用服务器,尤其适合于Web应用的部署与开发。在Java开发领域,Eclipse是一款广泛使用的集成开发环境(IDE),它提供了丰富的功能,包括代码编辑、调试、构建等。当开发者需要在...

    Windows下Resin的配置与部署(附图).doc

    #### 四、常见问题及解决方案 1. **无法启动Resin服务**:检查端口是否被占用,尝试更改端口号。 2. **管理员账户无法登录**:确认用户名和密码是否正确,密码是否经过正确的加密。 3. **项目部署失败**:确保...

    resin应用部署详细步骤

    需要注意的是,实际部署过程中可能会遇到各种问题,如权限问题、依赖缺失等,需要根据具体情况进行调整。此外,Resin还提供了丰富的管理界面和工具,可以帮助开发者更方便地监控和管理应用程序。 通过这篇文档的...

    resin4.0配置文件介绍

    这些信息对于诊断问题和优化性能非常有帮助。 #### 三、Resin 4.0 的管理与维护 ##### 1.13 命令行工具 Resin 提供了一系列命令行工具来管理服务的启动、停止和监控: - **console**:提供交互式界面来查看 ...

Global site tag (gtag.js) - Google Analytics