清除WAS的僵死进程

“百足之虫,至死不僵,以扶之者众也。”
                              ————三国·魏·曹冏《六代论》

一、背景:僵死进程让人心烦意乱
                          
在日常的维护中,在紧急情况下需要kill -9杀掉WAS的进程后,WAS会自动重启server,但是与此同时你又在管理控制台重启server,因为WAS在:进程定义-监控策略的常规属性条目“自动重新启动”选项默认情况下是自动选中的,也就是说其“指定如果进程失败了是否应该自动重新启动。缺省为自动重新启动进程。”由于重复重启,后启动的进程一般会抛出“已经有同样的实例在运行或者端口冲突”的错误信息,重启无效的同时不会自动停止而导致操作系统层面产生很多无用但是又占微量CPU和几百M内存的垃圾进程,我一般习惯称之为僵死进程。

上述讨论了我理所当然认为WAS会产生僵死进程的一种典型场景,当然还有其他情形也有可能,大家可以加以发挥。

二、目标:对待垃圾要一扫为快

“百足之虫,至死不僵”,如何漂亮地处理这种光占坑不拉屎的同志,最好是一除为快。本篇通过shell以短平快的方式迅速为操作系统尽微薄之力:
1、洗胃清肠,清理垃圾,减轻负担,提高性能
2、解决在top命令看到一堆进程任务在屏幕妖光闪闪,但实际WAS的server又没几个在跑、分不清孰友孰敌情形下,有效减少视野污染。

三、实战:举手之劳写个脚本搞定

设计思路简单提要如下:
1、获取跟WAS相关的dmgr、nodeagent、server的运行时有用进程;
2、获取跟其他应用相关的运行时进程,to do,自行加码;
3、获取所有运行时有用的WebSphere JAVA进程的进程号集合;
4、获取与WebSphere有关的JAVA进程集合;
5、获取待杀的与WebSphere有关的JAVA垃圾进程集合(采用排除法,即,一个进程要么是有用的,要么是垃圾,没有第三种选择);
6、杀掉待杀的与WebSphere有关的JAVA垃圾进程;

闲话少说,静心看代码,代码有注释,千言万语尽在行行复行行的百行代码之内。

#!/bin/sh
#      getridofzombie4java.sh
#目的:清理WAS因kill -9而产生的、以及其他原因产生的java僵死进程
#作者:carpnet
#日期:2008-08-15
#更新:2009-04-27

#WAS_INSTALL_HOME
WAS_INSTALL_HOME="/IBM/WebSphere"

#WAS的*.pid文件里记录的进程号集合
wasppids=""

#以WAS的*.pid的进程号为父进程及其自身的所有进程号集合
allwaspids=""

#其他应用相关的运行时进程号集合
otherapppids=""

#所有运行时有用WebSphere JAVA进程的进程号集合
persistpids=""

#存放所有运行时有用WebSphere JAVA进程的进程号集合的临时文件
persistpidstmp="$WAS_INSTALL_HOME/persistpids.tmp"
cat /dev/null > $persistpidstmp

#与java有关的进程集合
javapids=""

#待杀的垃圾进程集合
killedpids=""

##1.获取跟WAS相关的dmgr、nodeagent、server的运行时进程
#获取WAS的*.pid文件的绝对路径
waspidstr=`find $WAS_INSTALL_HOME -name *.pid|awk '{ORS=" "}{print $1}' `
echo "[`date`] WAS的*.pid文件列表为:$waspidstr"

#获取以*.pid的进程号为父进程及其自身的所有进程号
if [ "$waspidstr" != "" ]
then
    for per in $waspidstr
    do
        waspid="`cat $per`"
        echo "[`date`] $per的进程号为:$waspid"
       
        subwaspids=`ps -ef|grep root|grep WebSphere|grep java|grep $waspid|grep -v grep|awk '{ORS=" "}{print $2}' `
        echo "[`date`] 以$waspid为父进程的子进程有:$subwaspids"
        wasppids="$waspids $waspid" 
        allwaspids="$allwaspids $subwaspids"
    done
fi

echo "[`date`] 以$wasppids为父进程及其自身的所有进程号集合有:$allwaspids"

##2.获取跟其他应用相关的运行时进程,to do

##3.获取所有运行时有用的WebSphere JAVA进程的进程号集合
persistpids="$allwaspids $otherapppids"
echo "[`date`] 所有运行时有用的WebSphere JAVA进程的进程号集合有:$persistpids"

##4.获取与WebSphere有关的JAVA进程集合
javapids=`ps -ef|grep root|grep WebSphere|grep java|grep -v grep|awk '{ORS=" "} {print $2}' `
echo "[`date`] 与WebSphere有关的JAVA进程集合为:$javapids"

##5.获取待杀的与WebSphere有关的JAVA垃圾进程集合
if [ "$javapids" != "" ] && [ "$persistpids" != "" ]
then
    echo "$persistpids" > $persistpidstmp
    for javapid in $javapids
    do
        inflag=`grep $javapid $persistpidstmp|wc -l`
       
        if [ $inflag -eq 0 ]
        then
            killedpids="$killedpids $javapid"
        fi
    done
    rm -rf $persistpidstmp
fi

echo "[`date`] 待杀的与WebSphere有关的JAVA垃圾进程集合为:$killedpids"

##6.杀掉待杀的与WebSphere有关的JAVA垃圾进程
if [ "$killedpids" != "" ]
then
    echo "[`date`] 待杀的与WebSphere有关的JAVA垃圾进程集合非空,进入扑杀状态!"
    exit 0
    kill -9 $killedpids
else
    if [ "$killedpids" = "" ]
    then
        echo "[`date`] 待杀的与WebSphere有关的JAVA垃圾进程集合为空,所以无以为杀!"
    fi
fi

echo "[`date`] 完成扑杀的与WebSphere有关的JAVA垃圾进程!"
exit 0

以上shell脚本已经在HP UX以及Redhat Linux上验证通过。

尤为需要注意的是,如果机器上不仅安装了WAS,同时还有其他应用的话,请自行完善“2、获取跟其他应用相关的运行时进程,to do,自行加码;”捕捉到其他应用的在用进程,避免错杀好人,否则枉杀无辜,后果自负。

<think>嗯,需要解决用户关于Lumerical报错"Error: there was an unknown parallel error. The error code is 3031, the process number is 0"的问题。用户提供了几个引用,但这些引用内容似乎与Lumerical无关,主要涉及Java并行处理、HBase表创建失败、文件损坏检查以及Infiniband驱动。需要忽略这些不相关的引用,专注于Lumerical并行计算错误。 这个错误代码3031出现在并行计算过程中,进程号0通常表示主进程。可能的原因包括内存资源不足、MPI配置问题、软件内部缺陷或系统环境冲突。用户可能是使用Lumerical FDTD或MODE进行光电仿真时遇到的这个问题。 关于解决方案,首先考虑资源问题:检查可用内存是否充足,特别是当仿真模型较大时;调整MPI进程数量以减少内存消耗;更新显卡驱动和CUDA工具包(如果使用GPU加速)。其次检查软件配置:确认MPI设置正确,尝试重置为默认设置;验证防火墙或安全软件是否阻止了MPI通信。软件维护方面:安装最新版本或补丁;清理临时文件;尝试简化模型复现错误。最后建议联系官方技术支持,提供完整的错误日志和模型信息。 用户提供的引用中提到Java并行OOM错误,这与内存管理有关,但Lumerical的3031错误更可能是MPI通信层面的问题。引用中HBase表锁定问题的解决方法(删除锁定文件)对当前问题不适用,但"清理残留"的思路可以借鉴——建议用户检查Lumerical的临时文件。 需要生成相关问题:如何诊断MPI配置?如何监控内存使用?官方支持渠道是什么?是否需要调整模型网格设置?这些问题能帮助用户延伸排查。 </think>针对Lumerical报错"Error: there was an unknown parallel error. The error code is 3031, the process number is 0",请按以下步骤排查: ### 原因分析与解决方案 1. **MPI通信故障(核心原因)** - 进程号0表示主进程出现通信中断 - **操作步骤**: a. 重启MPI服务:命令行执行 `mpiexec -remove` 清除残留进程 b. 检查防火墙设置:确保`lumerical_mpich2smpd.exe`未被拦截 c. 重新安装MPICH组件:在Lumerical安装目录运行`redist\MPICH\mpich2setup.exe`重新配置 2. **内存资源不足** - 并行计算时内存耗尽导致主进程崩溃 - **解决方法**: $$ \text{所需内存} \approx N_{\text{进程}} \times M_{\text{单进程}} $$ a. 任务管理器中监控内存使用峰值 b. 在仿真设置中减少并行进程数(如从8核改为4核) c. 减小仿真区域网格密度 3. **软件环境冲突** - 常见于多版本共存或驱动不兼容 - **排查方案**: a. 更新显卡驱动至最新稳定版(尤其NVIDIA Tesla/A系列) b. 禁用第三方性能监控软件(如MSI Afterburner) c. 运行`lumerical_diagnose.exe`检查环境依赖完整性 4. **临时文件损坏** - 类似HBase表锁残留的场景(参考引用[4]思路) - **操作命令**: ```powershell del /f /q "%APPDATA%\Lumerical\tmp\*.*" ``` ### 进阶调试方案 ```python # 进程状态检测脚本示例(需管理员权限) import psutil def check_lumerical_process(): for proc in psutil.process_iter(['name','status']): if 'fdtd-solutions' in proc.name().lower(): if proc.status() == 'zombie': # 检测僵死进程 proc.kill() print(f"Killed zombie process: PID {proc.pid}") ``` ### 官方推荐措施 1. 升级至2024 R2.2+版本(修复MPI握手协议漏洞) 2. 提交诊断包:通过`Help > Create Diagnostic Package`生成错误报告[^Lumerical-Support]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值