【问题标题】:How to get RAM and CPU time consumption ? Python App on Linux如何获取 RAM 和 CPU 时间消耗? Linux 上的 Python 应用程序
【发布时间】:2022-01-15 19:20:55
【问题描述】:

我正在尝试使用PsutilMemory_Profiler 在 Linux 嵌入式环境中获取我的 Python 应用程序的 CPU 消耗和 RAM 消耗的值。问题是我无法完成它,或者更准确地说,我认为我不完全理解我得到的结果。我发现 Psutil 对方法返回的值非常不清楚,所以我不知道在我的情况下应该使用什么。

我已经写了这个,但我认为这不能给我我真正想要的东西:

f = open("mem_info.txt", "w") 
txt = "Memory RAM : " + str(process.memory_info().vms) + " bytes"
txt3 = "RAM details : " + str(virtual_memory())
txt2 = "Memory Percent : " + str(process.memory_percent(memtype="vms")) + " %"
txt4 = "CPU Time  : " + str(process.cpu_times()) + " s"
TXT = txt + "\n" + txt2 + "\n\n" + txt3 + "\n\n" + txt4 + "\n"
f.write(TXT)
f.close()

输出:

Memory RAM : 605085696 bytes
Memory Percent : 19.297597042513864 %

RAM details : svmem(total=3135549440, available=2531147776, percent=19.3, used=417918976, free=104349696, active=1263509504, inactive=1590898688, buffers=13201408, cached=2600079360, shared=17809408, slab=109674496)

CPU Time  : pcputimes(user=0.54, system=0.07, children_user=6.99, children_system=0.34, iowait=0.61) s

有人可以告诉我是否应该使用其他方法吗?或者如果我使用了正确的,我应该看什么结果?我应该对 CPU Time 中打印的不同结果求和吗?但是,如果我这样做了,那就太渴望使用 CPU 的时间了……请帮助我! :(

【问题讨论】:

    标签: python linux psutil


    【解决方案1】:

    您也可以使用 top 命令来获得最准确的统计数据

    直接在你的shell中运行“top”来获得像windows任务管理器一样的交互式视图

    OR 用于将输出保存到 txt 文件中的命令行

    top -n 1 -b > top-output.txt

    您可以通过将其保存为 shell 脚本来执行此操作,

    相当广泛的文档,包含在几乎所有 Linux 发行版中

    https://man7.org/linux/man-pages/man1/top.1.html
    

    【讨论】:

    • 感谢您的建议!我也想这样做,但我使用的是嵌入式设备,所以我只能为它打开一个终端。而且我不认为我可以在不幸运行我的应用程序时使用 top 。如果我在控制台中运行它,我将无法在它仍在运行时执行 top ...这就是为什么我宁愿寻找一些 python 库,它可以让我同时运行我的应用程序和库的方法一行中的终端或直接在我的应用中添加一些代码来对其进行分析。
    • 您可以从中创建一个shell脚本..并将其设置在crontab上,这样它就可以每分钟在后台执行您在cron中定义的模式,任何干预,同样可以用来监控环境的文件。
    【解决方案2】:

    https://psutil.readthedocs.io/en/latest/index.html?highlight=oneshot#psutil.Process.oneshot

    实用程序上下文管理器,可显着加快同时检索多个进程信息的速度。可以使用相同的例程获取内部不同的进程信息(例如 name()、ppid()、uids()、create_time() 等),但只返回一个值,其他值被丢弃。当使用这个上下文管理器时,内部例程被执行一次(在下面的例子中,name()),感兴趣的值被返回,其他的被缓存。共享相同内部例程的后续调用将返回缓存值。退出上下文管理器块时会清除缓存。建议是在每次检索有关该过程的多个信息时使用它。如果你幸运的话,你会得到一个地狱般的加速。

    我运行了这个:

    import psutil
    import time
    
    p = psutil.Process(pid=10500)
    with p.oneshot():
        while p.status() == 'running':
            print(p.name())  # execute internal routine once collecting multiple info
            print(p.cpu_times())  # return cached value
            print(p.memory_info().vms)  # return cached value
            print(p.cpu_percent())  # return cached value
            print(p.create_time())  # return cached value
            print(p.ppid())  # return cached value
            print(p.status())  # return cached value
            time.sleep(1)
    

    在多线程 python.exe 上(我在 Windows 上)。它返回有关进程的信息,并且在与资源监视器比较时似乎是准确的。你的输出有什么不明白的地方?

    另外,关于cpu_times()

    以命名元组的形式返回系统 CPU 时间。每个属性代表 CPU 在给定模式下花费的秒数。属性 可用性因平台而异:

    user:普通进程在用户模式下执行所花费的时间;在 Linux 上 这也包括客人时间
    系统:进程花费的时间 在内核模式下执行
    idle:无所事事的时间

    要查找进程 ID(在本例中,我们正在寻找 Python 脚本),请使用:

    {p.pid: p.info for p in psutil.process_iter() if p.info['name'] == 'python.exe'}
    

    user:在用户模式下花费的时间。
    system: 在内核模式下花费的时间。

    所以请务必使用 pid,当您正在运行用户程序时,您将寻找 user 输出。

    这是我使用此答案中第一个单元格中的代码监视多线程 python.exe 的两次迭代的输出:

    python.exe
    pcputimes(user=8.546875, system=20.046875, children_user=0.0, children_system=0.0)
    436965376
    0.0
    1642441782.2310572
    15272
    running
    python.exe
    pcputimes(user=8.546875, system=20.046875, children_user=0.0, children_system=0.0)
    436965376
    100.1
    1642441782.2310572
    15272
    running
    python.exe
    pcputimes(user=8.546875, system=20.046875, children_user=0.0, children_system=0.0)
    436965376
    100.0
    1642441782.2310572
    15272
    running
    

    cpu_percent > 100,因为我有多个内核。我应该注意的一件事是 user 在这个循环中不会改变。我在一个 jupyter 笔记本单元中运行,只有当我停止单元并重新启动它时它才会改变。因此,使用 psutil 库需要进行一些修改。

    【讨论】:

    • 感谢您的回答!关于 cpu_time,如果我想知道我的应用程序消耗的 CPU 时间总量,我想知道具体看什么。我实际上对那些分隔值“用户”、“系统”等没有用处。所以我想知道是否有其他方法,或者我是否应该计算所有返回值的总和,或者我的应用程序消耗的总 cpu 时间是否只是返回值之一?...
    • 此外,即使使用您建议的代码,cpu_percent 也只能返回 0%,并且无法打印其他内容。我已经尝试了不同的方法,将perpu 设置为truefalse,在打印一个值之前调用它一次,因为第一个调用应该是0,但无论如何它仍然返回零。你也得到这个输出吗?
    • @Lalastro 第一次迭代总是给我 0,但之后我得到一个 cpu_percent。确保使用 pid。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    相关资源
    最近更新 更多