如何在不等待 1 秒的情况下对进程的 CPU 使用情况进行采样
Posted
技术标签:
【中文标题】如何在不等待 1 秒的情况下对进程的 CPU 使用情况进行采样【英文标题】:How can i sample cpu usage of processes without waiting 1 second 【发布时间】:2014-08-25 15:40:25 【问题描述】:我正在尝试对所有正在运行的进程的 CPU 使用情况进行采样,但在所有解决方案中,我发现需要休眠 1 秒,这是一个问题,因为我想尽快对其进行采样以更新远程服务。 我还尝试使用 WMI 查询 Win32_PerfFormattedData_PerfProc_Process 使用“PercentProcessorTime”。但它返回错误的值(是每个处理器吗?)
【问题讨论】:
您是坚持使用 WMI 还是可以考虑 P/Invoke 方法? 值得一试,用P/Invoke怎么做? 您想要特定进程或整个系统的平均 CPU 使用率吗? 您正在尝试采样 时间。这需要时间,以便您可以对其进行采样。 每个正在运行的进程 【参考方案1】:这是不可能的,等待足够长的时间来获取下一个样本是必要的。处理器只处于两种状态之一。它要么正在执行代码,要么尽可能快地运行。或者它被 HLT 指令完全停止,当操作系统的线程调度程序找不到任何工作要做时会发生这种情况。每秒 64 次,时钟中断将其从停止状态唤醒,调度程序开始查看是否有任何东西准备好运行。
性能计数器告诉您自上次对计数器采样以来处理器运行全孔的频率与停止频率。如果您等待的时间不够长,那么数字的准确性就会开始受到影响。如果您等待的时间少于 16 毫秒,则只能测量 0 或 100%。 Nyquist-Shannon 采样定理的软件版本。
在样本之间等待 1 秒是样板文件,这就是您在 Perfmon.exe 和 Taskmgr.exe 中看到的内容
【讨论】:
请注意 taskmgr 可以使用 0.5 秒作为样本之间的间隔。以上是关于如何在不等待 1 秒的情况下对进程的 CPU 使用情况进行采样的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 sleep() 的情况下使用 ontimer 函数延迟进程?
如何在不使用 Spark SQL 的情况下对 Spark 中的数据帧进行排序?