Python 代码获取 Linux 中 CPU 使用率最高的应用程序列表[重复]

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

我正在编写一个 Python 脚本,它将为我们提供 Linux 中使用最高 CPU 的前 5 个应用程序或进程的列表。我可以使用

psutil
获取 CPU 使用率百分比,但我无法找到正在使用 CPU 的应用程序列表。

例如:对于 Ubuntu,我们可以执行

htop
来获取应用程序列表及其 cpu 百分比:

考虑到上图,从Python代码中我们应该能够得到如下结果:

[{
    "name": "vncserver",
    "cpu": 9.1
}, {
    "name": "vncserver",
    "cpu": 4.6
}, {
    "name": "dotnet",
    "cpu": 3.9
}, {
    "name": "htop",
    "cpu": 2.6
}, {
    "name": "td-agent",
    "cpu": 2.6
}]

有一些好的图书馆/文章我可以参考吗?

python cpu-usage psutil
1个回答
0
投票

这里是

cpu_percent()
获取确切进程的 CPU 使用率的方法。 但是
cpu_percent()
interval
小于 1 秒工作不正确

您可能会看到警告:

警告第一次使用 Interval = 0.0 或 None 调用此方法时,它将返回一个无意义的 0.0 值,您应该忽略该值。

这还不是完整的描述。实际上,如果您尝试在 1 秒内第二次调用

cpu_percent()
,它将再次返回错误值。所以你需要等待1秒或更长时间才能得到正确的值。

因为它循环所有进程需要很长时间,这里有两个解决方法

  1. 按某种规则过滤进程并仅获取您想要检查的进程的CPU使用率

  2. 异步运行进程循环。以下是如何做到这一点的示例:

import psutil
from psutil import Process
from awaits.awaitable import awaitable
import asyncio


@awaitable
def _worker(p: Process):
    try:
        return {
          'name': p.name(),
          'pid': p.pid,
          'commnd_line': p.cmdline(),
          'cpu_usage': p.cpu_percent(interval=1)
        }
    except Exception as e:
        print('ERROR:', e)
        return None


async def get_proc_info(p: Process):
    return await _worker(p)


async def scan_processes():
    tasks = []
    results = []

    for p in psutil.process_iter(attrs=None, ad_value=None):
        tasks.append(asyncio.create_task(get_proc_info(p)))

    for task in tasks:
        results.append(await task)

    return [i for i in results if i]

procs = asyncio.run(scan_processes())

sorted_procs = sorted(procs, key=lambda i: i['cpu_usage'])

print('High load TOP 3 are:')
print('1', sorted_procs[-1]['name'] + f' [{sorted_procs[-1]["pid"]}]', sorted_procs[-1]['cpu_usage'])
print('2', sorted_procs[-2]['name'] + f' [{sorted_procs[-2]["pid"]}]', sorted_procs[-2]['cpu_usage'])
print('3', sorted_procs[-3]['name'] + f' [{sorted_procs[-3]["pid"]}]', sorted_procs[-3]['cpu_usage'])
print('...')

print('Most tiny one is')
print(len(sorted_procs), sorted_procs[0]['name'] + f' [{sorted_procs[0]["pid"]}]', sorted_procs[0]['cpu_usage'])

输出将类似于:

ERROR: psutil.AccessDenied (pid=0, name='kernel_task')
ERROR: psutil.AccessDenied (pid=658, name='CrashReporterSup')
ERROR: psutil.AccessDenied (pid=659, name='fcconfig')
ERROR: psutil.ZombieProcess process still exists but it`s a zombie (pid=698, name='uname')
ERROR: psutil.AccessDenied (pid=85270, name='login')
High load TOP 3 are:
1 python3.9 [11030] 97.0
2 com.apple.WebKit.WebContent [10747] 31.6
3 python3.7 [83425] 11.5
...
Most tiny one is
402 loginwindow [204] 0.0
© www.soinside.com 2019 - 2024. All rights reserved.