【问题标题】:Monitoring a sub-process / can I get TotalProcessorTime for a Process group?监控子流程/我可以获得流程组的 TotalProcessorTime 吗?
【发布时间】:2009-05-14 19:19:58
【问题描述】:

有没有办法获得反映一个进程的 Process.TotalProcessorTimePLUS它产生的任何进程?

另外,我如何验证进程(或其后代)是否仍在“积极”运行?


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

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

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

【问题讨论】:

    标签: c# windows process worker-processes


    【解决方案1】:

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

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

    有了这些信息,您就可以监控系统中的进程、维护整个进程树的结构并计算树的 TotalProcessorTime。希望有帮助

    【讨论】:

      【解决方案2】:

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

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

        • 构建流程树(参见this answer 了解代码的简化版本),
        • 如果进程已退出,则终止(监控线程)。
        • 按 PID 维护累积的 CPU 使用率的哈希,
        • 维护所有进程的所有值的总和,
        • 保持总和与上次线程触发时的差值。
      2. 这应该允许调用代码轻松检查进程(树)是否 未挂起(I/O 绑定进程可能在此处出现问题,但这并不适用 对我来说)。

      这似乎并不困难,除了获取监控线程(直接)未生成的进程的 CPU 使用率之外。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-13
        • 2019-01-28
        • 1970-01-01
        • 2021-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多