首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ColdFusion调度程序线程占用CPU

ColdFusion调度程序线程占用CPU
EN

Stack Overflow用户
提问于 2014-09-09 11:55:33
回答 2查看 840关注 0票数 13

我已经让CF10运行在一个开发框上,Windows 7,64位。周期性地,每隔一分钟左右,CF10的CPU使用量就会猛增到100%,持续20秒左右,然后回落。很正常的。

我发现很难诊断出这个问题。我见过关于客户端变量清除、日志记录、监视和其他各种事情的讨论--但是我把这些都关掉了,但都没有用。

使用VisualVM,我已经成功地将问题跟踪到“调度程序”线程。我有5个在等待状态。每台电脑都会周期性地运行,大大提高CPU的速度。以线程转储为例,所有这些线程似乎都在调用java.io.WinNTFileSystem.getBooleanAttributes --我曾多次提到这一点,认为这可能是个问题。

更新:最近在另一个应用程序上玩onSessionEnd,发现scheduler-x线程似乎是ColdFusion的内部线程--我的onSessionEnd任务似乎总是在其中一个线程中运行。

在temp文件夹中,我可以看到很多EH缓存文件夹已经完成,我认为这与查询缓存有关。我运行的应用程序相当广泛地使用了这一点。我认为清除临时文件夹可能会提高性能,但没有产生任何效果。

值得注意的是,如果我在没有调用任何应用程序的情况下启动CF服务,问题就不会发生。这可能意味着问题在应用程序本身,但它们不会造成任何问题的生产-只有在这个盒子。也没有设置任何计划任务。

下面是一个导致高CPU的线程的例子。我希望能有任何帮助来诊断这个线程正在做什么,为什么,以及如何潜在地阻止它使用这么多资源。

代码语言:javascript
复制
"scheduler-2" - Thread t@84
   java.lang.Thread.State: RUNNABLE
    at java.io.WinNTFileSystem.getBooleanAttributes(Native Method)
    at java.io.File.isDirectory(File.java:849)
    at coldfusion.watch.Watcher.accept(Watcher.java:352)
    at java.io.File.listFiles(File.java:1252)
    at coldfusion.watch.Watcher.getFiles(Watcher.java:386)
    at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
    at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
    at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
    at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
    at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
    at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
    at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
    at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
    at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
    at coldfusion.watch.Watcher.checkWatchedDirectories(Watcher.java:166)
    at coldfusion.watch.Watcher.run(Watcher.java:216)
    at coldfusion.scheduling.ThreadPool.run(ThreadPool.java:211)
    at coldfusion.scheduling.WorkerThread.run(WorkerThread.java:71)

我的环境:

  • 赢7 64位
  • CF10更新12
  • JDK 1.8.0_11

此问题发生在JVM的多个版本上--该版本目前用于提供监视。

我的java设置:

  • 最小堆大小:512 Min
  • 最大堆大小:1024 Max -Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER=true -server -XX:MaxPermSize=512m -XX:+UseParallelGC -Xbatch -Dcoldfusion.home={application.home} -Dcoldfusion.rootDir={application.home} -Dcoldfusion.libPath={application.home}/lib -Dcoldfusion.jsafe.defaultalgo=FIPS186Random -Dcoldfusion.jsafe.defaultalgo=FIPS186Random -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote.port=8701 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

如果我说我知道所有这些设置都是干什么的,那我就是在撒谎!抱歉,如果你是那些认为所有CF开发人员都应该是Java应用程序栈专家的人之一。我不是。任何帮助,非常感谢。;)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-24 12:46:44

使用FusionReactor 6,我今天能够为我们解决这个问题。我们使用this.javaSettings来热加载java类文件。来自this.javaSettingsthis.javaSettings在指定的表号上使用DirectoryWatcher。在我们的例子中,我已经把它降到了一秒。

我是如何解决这个问题的:我在FusionReactor中设置了一个断点,并且可以看到它一直在扫描我在this.javasettings中指定的目录之上的目录。这个目录有足够的文件和子文件夹,看起来就像一个DirectoryWatcher在创建下一个目录之前无法完成。如果ColdFusion只是停留在子文件夹上,我在this.javaSettings中指定了它,那么就不会有问题了。

示例:

代码语言:javascript
复制
This.javaSettings       = {
          loadPaths                 = ["\externals\lib\"]
        , loadColdFusionClassPath   = true
        , reloadOnChange            = true
        , watchInterval             = 1
};

在上面的例子中,lib只有5个文件。然而,“外部”装载了一些东西。在断点上,它通常查看“外部”中的内容。

票数 2
EN

Stack Overflow用户

发布于 2015-03-18 15:10:20

是否有使用CFFILE标记运行的计划任务?他们往往是资源霸主。将它们旋转成自己的线程可能有助于CPU尖峰。

另一个想法是:

看着JVM,

代码语言:javascript
复制
•Min heap size: 512mb
•Max heap size: 1024mb

它们建立了java虚拟机可用的最小和最大内存。

代码语言:javascript
复制
-server -XX:MaxPermSize=512m 

这是用于java永久内存生成的内存量。

您已经为永久生成分配了一半JVM内存,尝试将最大堆大小提高到2048 up。并重新启动ColdFusion服务。根据您是否运行64位操作系统,它可能会更高。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25744018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档