我有一个多线程进程。每个线程都受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关键字的误用,这些默认值是不确定的。
结论了解您的警告!尽可能多地消除它们! 感谢。
答案 0 :(得分:0)
对于像这样的非显而易见的问题,您还应该使用实际采样CPU中底层硬件计数器的分析器。我熟悉的大多数分析器使用内核提供的统计信息而不是底层的HW计数器。在Windows中尤其如此。 (原因在于部分遗留,部分原因是Windows希望其内核统计信息独立于硬件.PAPI API尝试解决此问题,但仍然相对较新。)
最好的剖析之一是英特尔的VTune。是的,我为英特尔工作,但内部HPC人员也使用VTune。不幸的是,它的成本。如果您是学生,可以享受折扣。如果没有,则有试用期。
您可以在software.intel.com找到许多优化和性能问题诊断信息。以下是optimization和profiling的指针。即使您没有使用x86架构,这些技术仍然有效。
关于可能是什么问题,缓慢的退化是奇怪的。
如果您使用的是x86架构,请考虑在英特尔论坛中提交问题(例如“英特尔®集群和HPC技术”和“软件调优,性能优化和平台监控”)。
让我们知道你最终发现了什么。