ColdFusion调度程序线程吃CPU

Gar*_*ton 13 coldfusion jvm cpu-usage tomcat7

我已经在开发盒上运行CF10,Windows 7,64位.每隔一分钟左右,CF10的CPU使用率将在大约20秒内上升到100%并再次下降.这很规律.

我发现很难诊断出这个问题.我已经看到了关于客户端变量清除,日志记录,监控和各种方式的讨论 - 但我已经把这些全部转为无济于事.

使用VisualVM,我设法将问题跟踪到"调度程序"线程.我有5个处于等待状态.每个都会定期运行,从而大大提高CPU的性能.采取线程转储,似乎所有这些线程都在调用java.io.WinNTFileSystem.getBooleanAttributes- 我已经看过几次提到的可能存在问题.

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

查看temp文件夹,我可以看到已经创建了许多EH Cache文件夹,我认为这些文件夹与查询缓存有关.我运行的应用程序相当广泛地使用它.我认为清除临时文件夹可能会提高性能,但它没有任何效果.

值得注意的是,如果我在没有实际调用任何应用程序的情况下启动CF服务,则不会出现问题.这可能表明问题出在应用程序本身,但它们不会在生产中造成任何问题 - 仅限于此框.也没有设置任何计划任务.

下面是导致高CPU的一个线程的示例.我很感激任何帮助来诊断这个线程正在做什么和为什么,以及如何可能阻止它使用这么多资源.

"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)
Run Code Online (Sandbox Code Playgroud)

我的环境:

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

问题出现在多个版本的JVM上 - 此版本目前用于使监控可用.

我的java设置:

  • 最小堆大小:512mb
  • 最大堆大小:1024mb

    -server -XX:MaxPermSize参数=512米-XX:+ UseParallelGC -Xbatch -Dcoldfusion.home = {application.home} -Dcoldfusion.rootDir = {application.home} -Dcoldfusion.libPath = {application.home}/lib中-Dorg. apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER =真-Dcoldfusion.jsafe.defaultalgo = FIPS186Random -XX:+ HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote.port = 8701 -Dcom.sun.management.jmxremote.ssl =假-Dcom.sun.management .jmxremote.authenticate = FALSE

如果我说我明白了所有这些设置的作用,我会撒谎!很抱歉,如果您是那些认为所有CF开发人员都应该是Java应用程序堆栈专家的人之一.我不是.任何帮助,非常感谢.;)

J.T*_*.T. 2

今天,我使用 FusionReactor 6 解决了这个问题。我们用来this.javaSettings热加载 java 类文件。from使用指定的手表编号WatchInterval。在我们的例子中,我将其降低到一秒。this.javaSettingsDirectoryWatcher

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

例子:

This.javaSettings       = {
          loadPaths                 = ["\externals\lib\"]
        , loadColdFusionClassPath   = true
        , reloadOnChange            = true
        , watchInterval             = 1
};
Run Code Online (Sandbox Code Playgroud)

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