我正在尝试创建进程监视器,但将我的结果与 Windows 任务管理器进行比较时无法获得准确的结果。
我一直在使用 psutil,在查看整体 cpu 和内存使用情况时,它似乎工作正常,但对于单个进程来说似乎不太准确。内存使用率总是高于任务管理器,而 CPU 总是随机的。
我在初始化时使用
self.process = psutil.Process(self.pid)
设置进程一次,然后每秒调用一次下面的方法,任务管理器中的进程以恒定的 5.4% cpu 使用率和 130mb ram 运行,但是下面的代码产生:
CPU: 12.5375
Memory 156459008
CPU: 0.0
Memory 156459008
CPU: 0.0
Memory 156459008
CPU: 0.0
Memory 156459008
CPU: 12.5375
Memory 156459008
CPU: 0.0
Memory 156459008
CPU: 0.0
Memory 156459008
示例代码:
def process_info(self):
# I am calling this method twice because I read the first time gets ignored?
ignore_cpu = self.process.cpu_percent(interval=None) / psutil.cpu_count()
time.sleep(0.1)
process_cpu = self.process.cpu_percent(interval=None) / psutil.cpu_count()
# I also tried the below code but it was much worse than above
# for j in range(10):
# if j == 0:
# test_list = []
# p_cpu = self.process.cpu_percent(interval=0.1) / psutil.cpu_count()
# test_list.append(p_cpu)
# process_cpu = (sum(test_list)) / len(test_list)
# Memory is about 25mb higher than task manager
process_memory = self.process.memory_info().rss
print(f"CPU: {process_cpu}")
print(f"Memory: {process_memory}")
我是否错误地使用了 psutil 或者是否有更准确的方法来获取数据?
我认为您误解了 psutil.cpu_percent() 的输出。 返回一个浮点数,以百分比形式表示当前系统范围的 CPU 利用率。当时间间隔 > 0.0 时,将进程时间与时间间隔前后经过的系统 CPU 时间进行比较(阻塞)。当间隔为 0.0 或 None 时,将进程时间与自上次调用以来经过的系统 CPU 时间进行比较,并立即返回。这意味着第一次调用它时,它将返回一个有意义的 0.0 值,后续调用可以基于该值。在这种情况下,为了保证准确性,建议在调用之间至少间隔 0.1 秒调用此函数。
因此,如果您使用interval=0.1调用它,它将返回进程在最后0.1秒内运行的时间百分比。 如果您使用 Interval=None 调用它,它将返回自上次调用它以来进程运行的时间百分比。 因此,如果您连续调用两次且间隔=无,则第一次调用将返回自上次调用以来进程运行时间的百分比,第二次调用将返回进程运行时间的百分比自从你上次打电话以来。 因此,如果您想获取进程在最后 0.1 秒内运行的时间百分比,您应该使用 Interval=0.1 来调用它。
就像@Axeltherabbit 在他的评论中提到的那样,任务管理器抓取给定名称下的所有进程,而 psutils 抓取单个进程。 psutils 是正确的,任务管理器超出范围并决定获取所有进程。
我认为这应该更准确?
import psutil
for process in [psutil.Process(pid) for pid in psutil.pids()]:
try:
process_name = process.name()
process_mem = process.memory_percent()
process_cpu = process.cpu_percent(interval=0.5)
except psutil.NoSuchProcess as e:
print(e.pid, "killed before analysis")
else:
print("Name:", process_name)
print("CPU%:", process_cpu)
print("MEM%:", process_mem)
你找到解决办法了吗?我也面临同样的问题。