我有一个多线程的过程。每个线程都受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关键字的错误使用,它们是非确定性的。
结论了解您的警告!尽可能地消除它们! 谢谢。
使用一个分析器,在开始时取一个样本,当慢时候取一个样本,比较两者。 –
非常随机猜测 - 内存碎片导致内存管理需要更长的时间? – SergeyA
如果CPU使用率低于100%,这是因为SOMETHING阻止了您的进程运行。最有可能的是你实际上内存不足,需要交换。 –