如何用python获取准确的进程CPU和内存使用情况?

问题描述 投票:0回答:4

我正在尝试创建进程监视器,但将我的结果与 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 或者是否有更准确的方法来获取数据?

python psutil
4个回答
9
投票

我认为您误解了 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 来调用它。


1
投票

就像@Axeltherabbit 在他的评论中提到的那样,任务管理器抓取给定名称下的所有进程,而 psutils 抓取单个进程。 psutils 是正确的,任务管理器超出范围并决定获取所有进程。


0
投票

我认为这应该更准确?

    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)

0
投票

你找到解决办法了吗?我也面临同样的问题。

© www.soinside.com 2019 - 2024. All rights reserved.