监视子进程/我可以获取进程组的TotalProcessorTime吗?

时间:2009-05-14 19:19:58

标签: c# windows process worker-processes

有没有办法让 Process.TotalProcessorTime 反映一个进程 PLUS 它产生的任何进程?

或者,我如何验证进程(或它的后代)是否仍在“主动”运行?


我的应用程序正在生成一个外部进程并等待它退出。使用样本数据需要5-20 分钟才能完成;我没有猜测合理的最大超时时间。所以我的应用程序会定期检查另一个进程的 Process.TotalProcessorTime 值,以确保它不断上升。

这很好用,但我发现这个过程只是一个“包装器”,它产生一个子进程,从而产生一些消耗所有CPU时间的其他子进程。

我发现 TotalProcessorTime 在100%CPU利用率的几分钟后才返回一小部分秒。

2 个答案:

答案 0 :(得分:0)

您可以使用性能计数器来检索父流程,如下所示:

PerformanceCounter pc = new PerformanceCounter("Process", 
    "Creating Process Id", " windbg");
Process p = Process.GetProcessById((int)pc.RawValue);

拥有该信息可以监视系统中的进程,维护整个进程树的结构并计算树的TotalProcessorTime。希望有所帮助

答案 1 :(得分:0)

我没有实现这一点,但已经弄清楚它是如何工作的。这很乏味,但并不是那么复杂。

  1. 每隔几秒钟产生一个后台线程:

    • 构建流程树(有关代码的简化版本,请参阅this answer),
    • 如果进程已退出,则终止(监视器线程)。
    • 按PID维护累计CPU使用情况的哈希值,
    • 按所有流程维护所有值的总和,
    • 保持线程最后一次触发时总和的差异。
  2. 这应该允许调用代码轻松检查进程(树) 没有挂起( I / O绑定进程可能在这里有问题,但这不适用 对我来说)。

  3. 这一切似乎都不困难,可能的例外是监控线程没有(直接)生成进程的CPU使用率。

    如果/当我实现代码时,我会更新此答案,但可能需要很长时间。