我已经让CF10运行在一个开发框上,Windows 7,64位。周期性地,每隔一分钟左右,CF10的CPU使用量就会猛增到100%,持续20秒左右,然后回落。很正常的。
我发现很难诊断出这个问题。我见过关于客户端变量清除、日志记录、监视和其他各种事情的讨论--但是我把这些都关掉了,但都没有用。
使用VisualVM,我已经成功地将问题跟踪到“调度程序”线程。我有5个在等待状态。每台电脑都会周期性地运行,大大提高CPU的速度。以线程转储为例,所有这些线程似乎都在调用java.io.WinNTFileSystem.getBooleanAttributes --我曾多次提到这一点,认为这可能是个问题。
更新:最近在另一个应用程序上玩onSessionEnd,发现scheduler-x线程似乎是ColdFusion的内部线程--我的onSessionEnd任务似乎总是在其中一个线程中运行。
在temp文件夹中,我可以看到很多EH缓存文件夹已经完成,我认为这与查询缓存有关。我运行的应用程序相当广泛地使用了这一点。我认为清除临时文件夹可能会提高性能,但没有产生任何效果。
值得注意的是,如果我在没有调用任何应用程序的情况下启动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)我的环境:
此问题发生在JVM的多个版本上--该版本目前用于提供监视。
我的java设置:
如果我说我知道所有这些设置都是干什么的,那我就是在撒谎!抱歉,如果你是那些认为所有CF开发人员都应该是Java应用程序栈专家的人之一。我不是。任何帮助,非常感谢。;)
发布于 2017-01-24 12:46:44
使用FusionReactor 6,我今天能够为我们解决这个问题。我们使用this.javaSettings来热加载java类文件。来自this.javaSettings的this.javaSettings在指定的表号上使用DirectoryWatcher。在我们的例子中,我已经把它降到了一秒。
我是如何解决这个问题的:我在FusionReactor中设置了一个断点,并且可以看到它一直在扫描我在this.javasettings中指定的目录之上的目录。这个目录有足够的文件和子文件夹,看起来就像一个DirectoryWatcher在创建下一个目录之前无法完成。如果ColdFusion只是停留在子文件夹上,我在this.javaSettings中指定了它,那么就不会有问题了。
示例:
This.javaSettings = {
loadPaths = ["\externals\lib\"]
, loadColdFusionClassPath = true
, reloadOnChange = true
, watchInterval = 1
};在上面的例子中,lib只有5个文件。然而,“外部”装载了一些东西。在断点上,它通常查看“外部”中的内容。
发布于 2015-03-18 15:10:20
是否有使用CFFILE标记运行的计划任务?他们往往是资源霸主。将它们旋转成自己的线程可能有助于CPU尖峰。
另一个想法是:
看着JVM,
•Min heap size: 512mb
•Max heap size: 1024mb它们建立了java虚拟机可用的最小和最大内存。
-server -XX:MaxPermSize=512m 这是用于java永久内存生成的内存量。
您已经为永久生成分配了一半JVM内存,尝试将最大堆大小提高到2048 up。并重新启动ColdFusion服务。根据您是否运行64位操作系统,它可能会更高。
https://stackoverflow.com/questions/25744018
复制相似问题