CPU利用率随时间降低

时间:2015-11-27 20:16:17

标签: c++ cpu-usage dllimport dllexport openfst

我有一个多线程进程。每个线程都受CPU限制(执行计算)并且还使用大量内存。根据资源监视器,该过程从100%cpu利用率开始,但几个小时后,cpu利用率开始缓慢降低。 24小时后,它会在90-95%之间下降。

问题是 - 我应该寻找什么,以及我可以使用哪些最知名的方法来调试它?

其他信息:

我有足够的RAM - 大部分都没有在任何特定时刻使用过。 根据perfmon - 记忆不会增长(所以我不认为它会泄漏)。 代码是.Net和本机c ++的混合,有些数据来回编组。 我在几台不同的机器(具有24个逻辑核心的服务器)上看到了这一点 我在perfmon中看到的一件事 - 随着CPU利用率的降低,修改后的页面列表字节数指标会随着时间的推移而增加。

修改1 使用的第三方库之一是openfst。看起来它与该库的一些误用非常相关。 具体来说,我注意到我有以下警告: 警告LNK4087:CONSTANT关键字已过时;使用DATA

修改2

由于这个问题已经结束,并且没有重新开放,我会写下我的发现,以及如何在问题正文中解决问题(对不起)给未来的用户。 原来有一个openfst.def文件,它定义了消费应用程序/ dll所使用的所有openfst FLAGS_ *符号。我必须修复那些使用关键字" DATA"而不是" CONSTANT" (CONSTANT已经过时,因为它有风险 - 更多信息:https://msdn.microsoft.com/en-us/library/aa271769(v=vs.60).aspx)。 之后 - 没有观察到CPU利用率的降低。修改后的页面列表字节不再增加"指示符。我怀疑它与FLAGS的默认值(特别是垃圾收集标志 - FLAGS_fst_default_cache_gc)有关,由于openfst.def文件中CONSTANT关键字的误用,这些默认值是不确定的。

结论了解您的警告!尽可能多地消除它们! 感谢。

1 个答案:

答案 0 :(得分:0)

对于像这样的非显而易见的问题,您还应该使用实际采样CPU中底层硬件计数器的分析器。我熟悉的大多数分析器使用内核提供的统计信息而不是底层的HW计数器。在Windows中尤其如此。 (原因在于部分遗留,部分原因是Windows希望其内核统计信息独立于硬件.PAPI API尝试解决此问题,但仍然相对较新。)

最好的剖析之一是英特尔的VTune。是的,我为英特尔工作,但内部HPC人员也使用VTune。不幸的是,它的成本。如果您是学生,可以享受折扣。如果没有,则有试用期。

您可以在software.intel.com找到许多优化和性能问题诊断信息。以下是optimizationprofiling的指针。即使您没有使用x86架构,这些技术仍然有效。

关于可能是什么问题,缓慢的退化是奇怪的。

  • 您多久使用一次新内存或访问旧内存?以什么速度?如果速率非常慢,您可能仍然遇到放慢使用资源的情况,例如:页面。
  • 您的内存访问模式是什么?它会随着时间而改变吗?多快?也许你的内存访问模式随着时间的推移而蔓延,导致更多的缓存未命中。
  • 也许您对问题空间的划分是这样的,您已经进入了一个新的计算域,并且没有真正的病态。
  • 查看是否存在较长时间间隔内的定期维护活动,但这会导致周期性降级,例如每24小时一次。这听起来不像你的情况,因为你经历的是逐渐退化。

如果您使用的是x86架构,请考虑在英特尔论坛中提交问题(例如“英特尔®集群和HPC技术”和“软件调优,性能优化和平台监控”)。

让我们知道你最终发现了什么。