【问题标题】:High CPU Usage with no load无负载的高 CPU 使用率
【发布时间】:2012-12-11 09:58:23
【问题描述】:

我们正在运行一个 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 中描述的步骤来生成有关正在发生的事情的信息:

我不知道从哪里继续。任何帮助表示赞赏

【问题讨论】:

  • 该图像不是很有用,因为它不包含在哪里花费了多少时间的信息。所有这些都可能是冷代码。
  • 其实我做不到。实在是太多了。这就是为什么我试图使用一些工具来获取导致它的信息

标签: performance windows-services cpu


【解决方案1】:

谁编写了这个 Windows 服务?是你还是第三者?

对我来说,每 5 秒检查一次文件夹的更改听起来很可疑,这可能是您出现这种大幅减速的主要原因。

如果操作正确,您可以在目录更改发生时立即获取它们,而在此过程中几乎不会花费 CPU 时间。

这篇 Microsoft 文章解释了如何做到这一点:Obtaining Directory Change Notifications 使用函数 FindFirstChangeNotificationFindNextChangeNotificationReadDirectoryChangesWWaitForMultipleObjects

【讨论】:

  • 我们编写了windows服务。 5 秒的间隔确实很高,但不会导致问题。我已经能够使用 5 秒重现该行为。使用 500 秒来重现相同的行为花费了太长时间
【解决方案2】:

经过大量挖掘,它与此有关:

服务有一个私有对象 X 和属性 Y

每次触发服务时,都会将 X 传递给业务逻辑。有 Y 被使用并最终被丢弃。然后垃圾收集器将等到 X 被释放,这在服务重新启动之前永远不会发生。这会在每次触发服务时导致额外的 GC 等待线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多