当某个进程占用了 100% 的 CPU 时间时采取适当的行动

当某个进程占用了 100% 的 CPU 时间时采取适当的行动

我在几台机器上遇到了一个问题,某个进程占用了 CPU 的 100% 时间。

USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND

root 85740 100.0 0.2 34668 6352 ?? R 12:06AM 472:20.86 /usr/bin/javad (perl5.12.4)

目前,这个过程已经运行了近8个多小时:

# ps -p 85740 -o etime=

08:05:25

# ps -auxeww显示完整命令为:root 29323 99.0 0.2 32292 6692 ?? R 11:21PM 596:50.14 SUDO_COMMAND=/usr/local/bin/bash LOGNAME=root MAIL=/var/mail/root PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/fgz/bin SUDO_GID=1004 OLDPWD=/usr/local PWD=/usr/local/jboss4/bin _=./start.sh TERM=xterm USER=root HOME=/root SHELL=/usr/local/bin/bash SUDO_USER=fgz SUDO_UID=1004 USERNAME=root JBOSS_HOME=/usr/local/jboss4 SHLVL=1 /usr/bin/javad (perl5.12.4)

在这台特定的机器上,我们安装了 JBoss AS(其他机器上也安装了)。

我将非常感激任何有关如何启动此过程的提示。在/etc/crontab或中,crontab -l我没有任何可以启动 perl 的操作。

有趣的是:

# ls -al /usr/bin/javad

ls: /usr/bin/javad: No such file or directory

当进程仍在运行时。

正在运行的其他 Java 进程:

USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND

root 1322 0.0 0.0 14688 1344 0- I 24Jun13 0:00.00 /bin/sh ./run.sh -b 10.0.5.9

root 1334 0.0 11.8 2465148 493584 0- I 24Jun13 40:40.66 [java]

run.shJBoss Bootstrap 脚本在哪里。

答案1

每当我看到 perl 在运行 JBoss 的机器上消耗 100% 的 CPU 时,我都愿意打赌该机器已被蠕虫感染。

就在今天早上,我还发现在安装了 JBoss AS 的 Linux 机器上运行着一个不存在的 /usr/bin/javad。调查显示,存在一个安全漏洞 - 罗马尼亚的某个人访问了 /invoker/JMXInvokerServlet 并设法在服务器上部署了一个“Web 应用程序”(是的!)。您应该检查这个“invoker”是否可以在您的服务器上访问。如果可以,下一个问题是,它真的有必要吗?就我而言,我只是删除了它(通过删除 $JBOSS_HOME/server/default/deploy/http-invoker.sar 目录),重新启动了 JBoss 并验证了 Web 应用程序仍在运行。

答案2

答案3

以下是一篇关于监控Java进程的文章:http://www.ibm.com/developerworks/library/j-5things8/

最有用的工具是jstack。如果您的系统上安装了它,那么可以使用它来显示繁忙进程正在做什么。我应该提到jstack是一个命令行工具。您可以将其与繁忙 Java 进程的进程 ID 一起使用。它应该提供该进程中每个线程的堆栈转储。大多数线程应该等待同步对象(表明它们不忙,没有使用任何 CPU)。

如果不存在,jstack您可以向进程发送适当的信号 - 但找到堆栈被转储的位置可能是一个挑战。参见https://stackoverflow.com/questions/3734696/how-to-get-stack-trace-of-a-thread了解详情。

相关内容