【问题标题】:Windows based C++ application consumes more CPU over time基于 Windows 的 C++ 应用程序随着时间的推移消耗更多的 CPU
【发布时间】:2014-10-22 08:35:26
【问题描述】:

我们在 Windows 上有一个基于 C++ 的多线程应用程序,它使用 WinPCAP 库实时捕获网络数据包,然后处理这些数据包以监控网络。此应用程序旨在运行 24x7。我们的应用程序很容易消耗 7-8 GB 的 RAM。

我们正在观察的问题: 假设应用程序正在监控 100Mbps 的网络流量并消耗 60% 的 CPU。我们观察到,当应用程序持续运行较长时间(如一两天)时,应用程序的 CPU 消耗会增加到 70-80%,即使它仍在处理 100 Mbps 流量(做相同的工作量) .

我们尝试使用 ProcessExplorer 将此问题调试到线程级别,并注意到数据包捕获线程随着时间的推移开始消耗更多 CPU。即使重新启动应用程序后,此问题也未解决。只有重新启动机器才能解决问题。

我们观察到,在夜间运行期间,此问题在 Windows 2012 R2 Server 操作系统上很容易重现。在 Windows 7 中,该问题会在几天后发生。

知道是什么原因造成的吗?

提前致谢

【问题讨论】:

  • 不知道。查看xperfRandom thinks it's great.
  • PerfView
  • 重新启动应用程序没有帮助,所以可能不是内存泄漏。系统资源泄漏情况如何:寻找随时间增长的句柄数。
  • 可能是 WinPcap 驱动程序中的错误,甚至可能是网络驱动程序中的错误。
  • 克里斯,我也会尽量留意句柄数

标签: c++ windows multithreading cpu-usage packet-capture


【解决方案1】:

内存分配呢?因为您正在使用大量内存,所以这可能是内存碎片问题,因此如果您对缓冲区进行多次分配/重新分配,这当然会导致处理器查找和分配可用空间的主要成本。

【讨论】:

  • 好吧,我们在具有足够 RAM(例如 16GB 或更多)的系统上运行该应用程序。我们正在使用内存池;尽管经常发生分配/取消分配。如果是这样的话,是不是应该重启应用就解决了?
  • 内存碎片可能发生在操作系统级别,所以我认为在应用程序级别上你可以做的事情比你已经做的要多。最终你应该分配一个巨大的内存段并拥有自己的内存管理器......
  • 感谢 IFeelGood.. 我将尝试探索内存碎片部分。有没有办法在停止我的应用程序后对 RAM 进行碎片整理并重新运行它只是为了验证它是否是由于内存碎片引起的。机器重新启动肯定会对 RAM 进行碎片整理。我想在不重启机器的情况下试一试。
  • 据我所知这是不可能的。最终检查“硬页面错误”并尝试禁用分页内存。我的机器有 16Gb,我没有它。我想试一试。
  • 我检查了“hard faults/sec”,这些都是 0。我仍然需要检查禁用分页内存。我在想是否有更简单的应用程序来测试这种现象。
【解决方案2】:

我终于找到了上述行为的原因:它是导致它的 winpcap 代码。替换之后,我们没有观察到这种行为。

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 2018-01-14
    • 2013-03-11
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多