Java进程吃CPU; 为什么?

我有一个Linux服务器,我已经安装了Java。

有时候,只有当大量访问者访问我的网站时,网站才会挂起。

当我打开terminal并input“top”命令来查看发生了什么事情时,我可以看到“ Java ”进程正在吃掉CPU! 400%。

我也试过ps aux命令,可以看到这个命令来自usr / bin / java

我几乎没有什么经验来解决这类问题,所以我转向你们寻求帮助。

我有一个Java容器安装( Jetty ),我必须有使用SOLR (search引擎),这是集成到我的网站。

我可以通过以下方式启动和停止SOLR:

  etc/init.d/solr stop 

但是这并没有从“Top”命令中删除java进程。 Java仍然吃着400%的CPU。

有其他的方法来重新启动Java只?

这发生了两次给我,每次我现在重新启动我的整个服务器,一切都很好。

如果你需要更多的input,让我知道!

如果停止solr进程并且java进程仍在运行,那么服务器上还有另一个java进程。 第一步是logging所有正在运行的Java进程。 在Unix上的一个好工具是ps工具。 尝试这个:

 $ ps auxwww | grep java 

该输出应该显示所有正在运行的java进程以及正在执行的命令。 试试这个之前和之后,你停止solr。

第二个问题是“这些Java进程中的哪一个正在吃掉这么多的CPU”? 除了solr过程之外,您可能还需要停止dockerstream程。 另外,你永远都不需要重新启动Linux服务器,因为一个进程是不正常的。 你也可以使用kill命令停止一个进程,如果你现在是进程ID的话,你可以从top或者ps

在短期内,在您的机器上安装某种“看门狗”脚本来帮助解决这些问题可能是一个好主意。 例如, monit可用于在消耗一定数量的CPU资源时自动重新启动服务或进程。

从长远来说,我很抱歉地说你有一个性能问题。 你至less需要重新configurationsolr和jetty。 您可能还需要考虑垃圾收集调优,并可能添加更多的硬件。 网上有很多关于这些话题的信息,我很遗憾地说这个过程可能有些困难。

祝你好运!

汤姆·珀尔

如果在响应时间不断减less的情况下,CPU正在越来越多,那么我首先要看的就是java中的堆pipe理 – 它可能做了很多主要的收集 – 而解决这个问题的最快方法是给容器运行更多的内存。

这不是真正的正确的地方要求程序debugging问题。 如果Solr是唯一正在运行的Java应用程序,那么您应该确保您的Lucene索引被更新的频率以及服务器启动时每秒运行的search查询次数超载。