在 Python 中测试期间的 CPU 利用率?

Posted

技术标签:

【中文标题】在 Python 中测试期间的 CPU 利用率?【英文标题】:CPU utilization during testing in Python? 【发布时间】:2021-03-28 14:04:54 【问题描述】:

我想在测试我的 ML 模型期间(在调用 predict 期间)获取 cpu 使用情况。这是我目前正在做的事情。 p是当前进程:

start = p.cpu_percent(interval=1)
y_hat = clf.predict(X_test)
print(abs(p.cpu_percent(interval=None) - start)) # prints cpu usage (%)

这是正确的方法还是有更好的方法来实现这一点?

【问题讨论】:

我喜欢在模型运行时在终端中运行 htoptop 以监控使用情况。 我也对此进行了研究,对于特定的函数调用(在数据集上测试)执行此操作的命令是什么?另外,这不应该与使用 psutil 的上述相同吗? 我不确定具体的命令,但你可以寻找正在运行的python 可执行文件。您的示例不等效,因为您正在拍摄 cpu 百分比的两个快照(之前和之后),但您没有得到 cpu 百分比 during 预测。一种可能的解决方案是在单独的线程中定期运行 cpu_percent() 我编辑了我的问题中的代码,我相信它可以捕获调用预测期间的 cpu 使用情况? 如果你的 cpu_percent 函数返回所有进程的总 CPU 使用率,从运行后的使用量中减去运行前的原始使用量(你在做什么)应该可以工作。 【参考方案1】:

    使用psutil建议使用psutil.virtual_memory()

    import psutil
    mem = psutil.virtual_memory()
    print(mem)
    svmem(total=10367352832, available=6472179712, percent=37.6, used=8186245120, free=2181107712, active=4748992512, inactive=2758115328, buffers=790724608, cached=3500347392, shared=787554304, slab=199348224)
    
    THRESHOLD = 100 * 1024 * 1024  # 100MB
    if mem.available <= THRESHOLD:
         print("warning")
    
    # you can convert that object to a dictionary 
    dict(psutil.virtual_memory()._asdict())
    

    psutil.cpu_times(percpu=False) 以命名元组的形式返回系统 CPU 时间。

     import psutil
     print(psutil.cpu_times())
     #scputimes(user=17411.7, nice=77.99, system=3797.02, idle=51266.57, iowait=732.58,      irq=0.01, softirq=142.43, steal=0.0, guest=0.0, guest_nice=0.0)
    

    os.times() 返回当前的全局处理时间。返回值是一个有五个属性的对象

    import os 
    
     curr_gp_times = os.times()      
     print(curr_gp_times) 
     # posix.times_result(user=0.03, system=0.01, children_user=0.0, children_system=0.0, elapsed=17370844.95)
    

编辑这可能更接近您正在寻找的内容:

    psutil.cpu_times(percpu=False) 以命名元组的形式返回系统 CPU 时间。每个属性代表 CPU 在给定模式下花费的秒数。

    user:普通进程在用户模式下执行所花费的时间;在 Linux 上,这还包括访客时间

    系统:进程在内核模式下执行所花费的时间

    空闲:无所事事的时间

      import psutil
      psutil.cpu_times()
      # scputimes(user=17411.7, nice=77.99, system=3797.02, idle=51266.57, iowait=732.58, irq=0.01, softirq=142.43, steal=0.0, guest=0.0, guest_nice=0.0)
    

【讨论】:

感谢您的回复! virtual_memory().percent 不是与 ram 使用相关联吗? 似乎来自他的链接。 2 和 3 应该得到 CPU 使用率,但请记住它们返回的是时间而不是百分比。 Yurrofian,它以字节为单位返回使用情况,如文档中所述,实际上有一些警告,具体取决于它建议检查此 Github 文件的操作系统:github.com/giampaolo/psutil/blob/master/scripts/meminfo.py MEMORY ------ 总计: 9.7G 可用 : 4.9G 百分比 : 49.0 使用 : 8.2G 免费 : 1.4G 活动 : 5.6G 非活动 : 2.1G 缓冲区 : 341.2M 缓存 : 3.2 我实际上添加了第四种可能性【参考方案2】:

假设您想在程序中使用内置函数执行此操作,Python 的 resource 模块可能对您有用 here。如果您能够安装软件包,psutil 是一个很好的 option(由 Federico 建议)。

在您的程序之外,有很多方法可以获取任意进程的 CPU 使用率。如果你在 *nux 上并且更喜欢命令行,top 和类似的命令应该可以完成这项工作。在图形界面上,我个人更喜欢 KSysGuard(我在 Kubuntu 上)。 Gnome 系统监视器也可以工作。在 Windows 上,任务管理器就足够了。

编辑:psutil 似乎返回了全局用法。如果您只想使用您的进程,您最好使用resourceos.times,但如果您想要总 CPU 利用率(包括其他进程)psutil 是一个更强大的解决方案。

resource 中的 CPU 时间:

import resource

resource.getrusage()[0]  # Returns the time in seconds in user mode
# Note that this time accumulates while the program runs,
# so you might want to save its previous value each time you take a measurement

【讨论】:

以上是关于在 Python 中测试期间的 CPU 利用率?的主要内容,如果未能解决你的问题,请参考以下文章

Python测试进阶——Python程序监控指定进程的CPU和内存利用率

如何在负载测试期间测量 CPU 和内存

在编译期间估计相对 CPU 使用率

在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析

Python的多线程和多进程模块对比测试

如何查看Linux的CPU负载