我们正在运行一个Windows服务,每5秒检查一个文件夹中的文件,如果找到则使用NLog记录一些信息。
我已经尝试了ASP.NET: High CPU usage under no load的建议而没有成功。
当服务刚刚启动时,几乎没有任何CPU使用率。几个小时后,我们看到CPU峰值达到100%,经过一些等待后,cpu图看起来像:
我尝试了http://blogs.technet.com/b/sooraj-sec/archive/2011/09/14/collecting-data-using-xperf-for-high-cpu-utilization-of-a-process.aspx中描述的步骤来生成有关正在发生的事情的信息:
我不知道从哪里继续。任何帮助表示赞赏
答案 0 :(得分:1)
谁写了这个Windows服务?是你还是第三方?
对我来说,每隔5秒检查一次文件夹的变化听起来真的很可疑,也许是导致这种大幅减速的主要原因。
如果你做得对,你可以在发生时立即更改目录,但在这样做的时候几乎没有CPU时间。
这篇Microsoft文章通过使用函数FindFirstChangeNotification
,FindNextChangeNotification
,ReadDirectoryChangesW
和WaitForMultipleObjects
来解释如何做到这一点:Obtaining Directory Change Notifications。
答案 1 :(得分:1)
经过大量挖掘后,它与此有关:
该服务有一个私有对象X,其属性为Y
每次启动服务时,X都会传递给业务逻辑。有Y使用,最后处理。然后垃圾收集器将等待,直到X被释放,这将在服务重新启动之前永远不会发生。每次激活服务时都会导致额外的GC等待线程。