我们有一个长时间运行的高性能操作,运行了 6 个小时。上次运行时,半夜发生了一些事情,持续了 5 分钟,性能急剧下降,并导致几次超时。我怀疑是其他进程启动并重击了 CPU 或类似情况。
经过搜索,这个网站上的建议是使用 ProcessMonitor 来监控 CPU。但是,它似乎只能在运行时捕获流量,而且它是一个桌面应用程序。我的 Windows 服务器实例在空闲 10 分钟后会将您踢出,由组策略控制,我无法更改它,所以我不能使用桌面应用程序进行监控。
我需要监控 24 小时内的 CPU 使用率。我只对进程名称和 CPU 使用率 (%) 感兴趣,这样我就可以找出到底是什么在起作用,并破坏了系统。
因为你被踢出去了,所以我确实需要一些可以作为 Windows 服务运行的东西。
有没有什么办法可以做到这一点(使用 ProcessMonitor 或类似的工具 - Windows 服务器肯定内置了一些东西?)作为服务,这样我就不需要登录到远程桌面,还是我必须找到某种鼠标移动脚本并让我的电脑整晚开着?
编辑:
性能监视器看起来很有前途。很难找到如何配置它来满足我的需要。
我制作了一个自定义数据收集器 cpu 和进程 ID:
我想要做的是能够看到特定时间每个进程的 CPU 使用情况,就像您在任务管理器中所做的那样,但还可以使用图表并查看监控期间任何时间点的快照。
所以我可以看到 24 小时的图表,看到出现峰值的点,单击它,然后查看是哪个过程导致了它。
我甚至不相信我的上述配置,如果我让它工作的话,会告诉我进程名称,它会说进程ID,如果结果是guid或类似的,那可能也没有帮助,特别是如果进程启动和停止并且当我去调查时没有仍在运行。
答案1
答案2
使用 Daniel K 的性能监视器的建议,我找到了如何做到这一点。
- 加载性能监视器
- 转至‘数据收集器集’
- 展开“用户定义”
- 创建一个新的“数据集”
- 选择手动创建(高级),注意如果不删除则无法更改名称,因此现在请使其合理
- 按下一步,选择“创建数据日志”和“性能计数器”
- 按下一步,按添加。
- 左上角,展开“进程”,单击“%处理器时间”以及您可能需要的任何其他内容。
- 左下角,点击“”
- 点击“添加 >>”按钮并按确定
- 选择合适的采样间隔,然后继续按“下一步”直至到达向导的结束。
- 您可以通过右键单击数据收集器集并按“开始”来开始收集,或者转到其属性并设置计划。我发现我的数据收集器在没有设置停止条件的情况下在 30 分钟后停止工作,但这可能是一个异常。
- 数据收集完成后,展开“报告”>“用户定义”>“您的数据集”
- 双击打开它。
- 请注意,底部显示“% 处理器时间”,实例为“_Total”。默认情况下,它显示总 CPU 使用率。这包括“空闲时间”,因此它将始终在 100% 左右。
- 单击图表上方顶部栏上的绿色 + 按钮(不在顶部窗口中)
- 单击左上角的“进程”,然后在底部您可以选择要查看的单个进程,或者选择“”并按添加。
- 单击“确定”,您将看到每个进程的 CPU 使用率的详细图表。
答案3
如果 Windows 性能计数器对您不起作用(实际上,它们有一些令人讨厌的限制),您可以使用专用的指标收集和可视化解决方案。这可能有点过头了,但也许仍然是您工具包的一个有价值的补充。
我可以推荐使用 Prometheus 作为这种情况下的指标解决方案。
- 普罗米修斯是存储数据的数据库。将其安装在某台机器上(可以与您正在监控的机器相同)。最简单的安装选项可能是 Linux 上的 Docker 容器,但对于短暂的一次性使用,您可以将其作为 exe 运行。它有一个用于查询数据的 Web GUI。
- wmi_导出器是数据收集代理。安装它并确保启用每个进程的指标在安装时(您需要提供相关参数)。
- 在 Prometheus 配置文件中将 wmi_exporter 定义为目标。这将使 Prometheus 从导出器中提取数据(我相信默认间隔是每 60 秒)。
接下来是最难的部分。Prometheus 是一个数据库 - 你可以使用 Web GUI 查询原始数据,但 GUI 不太用户友好,如果你不习惯处理时间序列数据,PromQL 查询语言可能不直观。我建议从查询irate(wmi_process_cpu_time_total[5m])
开始。这将为你提供每个进程每秒实时 CPU 时间的图表。
irate
将为您提供最后两个数据点之间的数据。如果您想要平滑平均值,rate
请使用将用作5m
平均周期(irate
仅将其用作最大限制)。
Prometheus 是一个功能强大的指标系统,需要花些功夫才能理解。但是,从长远来看,它可以很好地帮助您使自动化系统可观察。
附注:Prometheus 通常部署在格拉法纳作为可视化 GUI(取代基本的 Prometheus 内置 GUI)。但是,如果只是进行一些快速故障排除,则不需要它。
附注。流程输出者和node_exporter是 Linux 中与 WMI 导出器相同的版本。