Chinaunix首页 | 论坛 | 博客
  • 博客访问: 834263
  • 博文数量: 167
  • 博客积分: 7173
  • 博客等级: 少将
  • 技术积分: 1671
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-04 23:07
文章分类

全部博文(167)

文章存档

2018年(1)

2017年(11)

2012年(2)

2011年(27)

2010年(88)

2009年(38)

分类: 系统运维

2010-08-20 15:08:30

先上故障现象图:
# netstat -nlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name  
tcp        0      0 192.168.238.73:9505         0.0.0.0:*                   LISTEN      -                  
tcp        0      0 0.0.0.0:9090                0.0.0.0:*                   LISTEN      31812/java         
tcp        0      0 0.0.0.0:35718               0.0.0.0:*                   LISTEN      31812/java         
tcp        0      0 127.0.0.1:6600              0.0.0.0:*                   LISTEN      31725/java         
tcp        0      0 0.0.0.0:35721               0.0.0.0:*                   LISTEN      31814/java         
tcp        0      0 127.0.0.1:6800              0.0.0.0:*                   LISTEN      31814/java         
tcp        0      0 0.0.0.0:8080                0.0.0.0:*                   LISTEN      -                  
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1993/sshd          
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      -                  
tcp        0      0 0.0.0.0:35710               0.0.0.0:*                   LISTEN      31726/java         
tcp        0      0 0.0.0.0:35711               0.0.0.0:*                   LISTEN      31725/java         
udp        0      0 0.0.0.0:514                 0.0.0.0:*                               1878/syslogd       
udp        0      0 0.0.0.0:161                 0.0.0.0:*                               1982/snmpd 

从top中看到的现象是:
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
 xx yy       25   0 4844m 4.2g 9.9m S  775 71.6 371:34.21 java            
xx yy       25   0 5844m 4.2g 9.9m S  775 71.6 371:34.21 java   
最多尝试过同时出现3个java进程。

从现象中可看到,resin9090 6600  6800 端口都让其自己的子进程给占用了,这种情况下还能正常提供服务,但负载就飙升得很厉害。
这个应用是提供搜索服务,在建动态索引和建静态所以的时候resin会比较繁忙。在这过程中对resin发出停止的信号会不成功。
以下是停止resin的脚本:
if [[ -n "$RESIN_USER" && $USER != $RESIN_USER ]]; then
          su $RESIN_USER -c "$JAVA $JVM_ARG -jar $RESIN_HOME/lib/resin.jar $ARGS stop"  1>$RESIN_HOME/log/start.info 2>&1
          ret=$?
        else
          $JAVA $JVM_ARG -jar $RESIN_HOME/lib/resin.jar $ARGS stop  1>$RESIN_HOME/log/start.info 2>&1
          ret=$?
        fi

        ps auxwww|grep $SEARCH_STR >/dev/null
        if [ $? = 0 ]; then
                PID1=`ps auxwww|grep $SEARCH_STR |egrep -v "ResinWatchdogManager|grep" |awk '{ print $2 }'`
                PID2=`ps auxwww|grep $SEARCH_STR |grep "ResinWatchdogManager" |grep -v grep |awk '{ print $2 }'`
          if [ -n "$PID1" ];then
                kill -9 $PID1 $PID2
                if [ $? = 0 ];then
                  action $"Stopping $prog: " /bin/true
                else
                  action $"Stopping $prog: " /bin/false
                fi
          else
                action $"Starting $prog: " /bin/true
          fi
        else
                action $"Starting $prog: " /bin/true
        fi
在使用resin。jar停止resin不成功的时候,使用kill -9 对此进行强制关闭,这强制的动作后,特殊情况下会出现,主进程给杀死,由相应主进程派生
出来的子进程接替了主进程的地址,这就造成了图中的现象。

现在的办法是检测到这种情况restart一次resin


最终的解决方法只能是:开发人员改善代码


阅读(2685) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

skybin0908042010-08-20 15:33:12

killall kill -15 kill -9 一般都不能杀掉 defunct进程   用了kill -15,kill -9以后 之后反而会多出更多的僵尸进程   kill -kill pid fuser -k pid 可以考虑杀死他的parent process,   kill -9 他的parent process

chinaunix网友2010-08-20 15:32:05

谢谢sky大大的分享!!

skybin0908042010-08-20 15:28:29

以上情况是僵尸进程的情况 In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie. 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程. 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程……