【问题标题】:Java Running at close to 100% CPUJava 以接近 100% 的 CPU 运行
【发布时间】:2016-05-18 18:52:44
【问题描述】:

周末过多的日志记录活动导致 ColdFusion 抛出以下错误:

Message:    No space left on device
StackTrace: java.io.IOException: No space left on device at
            java.io.FileOutputStream.writeBytes(Native Method) at 
            java.io.FileOutputStream.write(FileOutputStream.java:269) at 
            coldfusion.compiler.NeoTranslator. ......

到今天早上,ColdFusion 网站上的页面根本没有加载。光盘 (12Gig) 已用完 99% 以上。我们将几个文件移到了第二张光盘上,现在它大约是 80%,远低于以往的水平。我们将把日志记录活动定向到第二张光盘 (100Gig) 以防止重复。在磁盘上创建了空间后,我们重新启动了 apache 和 Coldfusion,但仍然没有加载页面。

当我们运行top -H 时,java 似乎在接近100% CPU 运行。有没有人知道发生了什么或者我需要提供什么信息以便有人可以弄清楚?

设置是AWS,ubuntu 13.04,coldfusion 10,mysql(rds)。

更新

我做了一些非常奇怪但希望有帮助的观察。 我仍在尝试找到一个工具来帮助获取线程转储。 每当我重新启动 ColdFusion 时,大多数页面加载正常,CPU 使用率似乎正常,大部分为 0.7 - 1.5%,但偶尔会出现峰值到 10% 可以看到。但是有一个特定的页面,当我尝试加载时,它会导致 CPU 使用率上升到 97%总是。加载良好的页面具有从一个表中读取数据的简单查询。这个有问题的页面有一个内部连接,并从两个表中读取数据。我不知道这有多大帮助,但我认为它太一致以至于微不足道。

更新 2

并且自从这个问题开始以来,第一次出现以下错误并且有数百行:

[2243:140630871263104] [error] ajp_send_request::jk_ajp_common.c (1649):
(cfusion) connecting to backend failed. Tomcat is probably not started 
or is listening on the wrong port (errno=111)

// and

[2234:140630871263104] [info] ajp_connect_to_endpoint::jk_ajp_common.c (1027): 
Failed opening socket to (127.0.0.1:8012) (errno=111)

// and 

[2756:139822377088896] [info] jk_handler::mod_jk.c (2702): No body with status=500 
for worker=cfusion

更新 3 - 已解决

在删除所有代码的“违规”页面并简单地将其替换为一些纯文本并尝试加载该页面几次之后,我们意识到 ColdFusion 没有加载实时页面。它正在加载页面的缓存编译版本,通常可以在名为<cf-root>/cfusion/wwwroot/WEB-INF/cfclasses 的子文件夹中找到。删除(或重命名)子文件夹解决了这个问题。

【问题讨论】:

  • 这取决于您的应用程序,很可能在您重新启动时,它正在尝试执行一些挂起的任务,这会占用您所有的 CPU。
  • 有没有办法找出该任务可能是什么?
  • 试试jstack 看看JVM在做什么。
  • 分析器应该有帮助,visualvm 与 jdk 一起提供。
  • @bayou.io,试过了,但没有安装 jstack。服务器上的java是用ColdFusion打包的。有没有办法自己安装?

标签: java mysql amazon-web-services coldfusion-10 ubuntu-13.04


【解决方案1】:

您可能希望提供线程转储,其中一些以几秒的间隔进行,以及 gc 日志。

可以使用 jstack(您的 jdk 的 bin 目录中提供的工具)生成线程转储,并且必须预先激活垃圾收集器日志。

【讨论】:

  • 这个工具似乎不起作用:blogs.coldfusion.com/post.cfm/…。我按照说明进行操作,但看起来这些函数根本没有返回任何输出。
  • 很抱歉,我对 ColdFusion 一点也不熟悉。如果您不确定 tempDirectory 的位置并且使用的是基于 linux 的系统,您可以尝试使用以下命令搜索 threaddump 文件:find / -name threaddump*。在 Oracle 的 JVM 上,您还可以使用 kill -3 将线程转储输出到 JVM 的标准错误,但我不能保证 ColdFusion
  • 我明白了。感谢您的时间。为了确保我没有失去理智,我将脚本改为输出到浏览器页面而不是文件,并且没有任何内容输出到浏览器页面。
  • 您仍然可以尝试按照建议安装 jstack,但我也从未这样做过,所以无论如何您只能靠自己了,抱歉!祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 2018-07-05
  • 2015-10-05
  • 2019-09-06
  • 1970-01-01
  • 2016-01-28
相关资源
最近更新 更多