2015-11-27 53 views
4

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

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

附加信息:

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

编辑1 使用的第三方库之一是openfst。看起来这与图书馆的一些误用非常相关。 具体来说,我注意到我有以下警告: 警告LNK4087:CONSTANT关键字已过时;利用数据

编辑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关键字的错误使用,它们是非确定性的。

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

+0

使用一个分析器,在开始时取一个样本,当慢时候取一个样本,比较两者。 –

+0

非常随机猜测 - 内存碎片导致内存管理需要更长的时间? – SergeyA

+1

如果CPU使用率低于100%,这是因为SOMETHING阻止了您的进程运行。最有可能的是你实际上内存不足,需要交换。 –

回答

0

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

其中一个最好的分析器是英特尔的VTune。是的,我为英特尔工作,但内部HPC人员也使用VTune。不幸的是,它的成本。如果你是学生,有折扣。如果没有,则有试用期。

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

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

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

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

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

相关问题