在 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 (%)
这是正确的方法还是有更好的方法来实现这一点?
【问题讨论】:
我喜欢在模型运行时在终端中运行htop
或 top
以监控使用情况。
我也对此进行了研究,对于特定的函数调用(在数据集上测试)执行此操作的命令是什么?另外,这不应该与使用 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
似乎返回了全局用法。如果您只想使用您的进程,您最好使用resource
或os.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和内存利用率