gpt4 book ai didi

ColdFusion 调度程序线程占用 CPU

转载 作者:行者123 更新时间:2023-12-03 08:18:11 25 4
gpt4 key购买 nike

我在 64 位 Windows 7 开发箱上运行了 CF10。
每隔一分钟左右,CF10 的 CPU 使用率将在大约 20 秒内飙升至 100%,然后又回落。这是很规律的。

我发现很难诊断这个问题。我已经看到有关客户端变量清除、日志记录、监控和各种事情的讨论 - 但我已经将这些都关闭了,但无济于事。

使用 VisualVM,我设法将问题跟踪到“调度程序”线程。我有 5 个处于等待状态。每个都会定期运行,从而显着提高 CPU。
进行线程转储,似乎所有这些线程都在调用 java.io.WinNTFileSystem.getBooleanAttributes - 我见过几次提到的潜在问题。

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

查看临时文件夹,我可以看到已经创建了很多 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)

我的环境:
  • Win 7 64 位
  • CF10 更新 12
  • JDK 1.8.0_11

  • 该问题出现在多个版本的 JVM 上 - 此版本当前用于使监控可用。

    我的 java 设置:
  • 最小堆大小:512mb
  • 最大堆大小:1024mb

    -server -XX:MaxPermSize=512m -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=true -Dcoldfusion.jsafe.defaultalgo=FIPS186Random -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote.port=8701 -Dcom.sun.management.jms.luselfalse .jmxremote.authenticate=false

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

    最佳答案

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

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

    例子:

    This.javaSettings       = {
    loadPaths = ["\externals\lib\"]
    , loadColdFusionClassPath = true
    , reloadOnChange = true
    , watchInterval = 1
    };

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

    关于ColdFusion 调度程序线程占用 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25744018/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com