【问题标题】:Efficiently retrieving stats for all running processes using `psutils`使用 psutils 有效地检索所有正在运行的进程的统计信息
【发布时间】:2018-08-22 08:23:30
【问题描述】:

我正在构建一个实用程序,它使用 Python 3.6.5 检索操作系统 (Centos 7) 上所有正在运行的进程的信息。

为此,我使用psutil 创建了以下函数:

def get_processes(self):
    fqdn = self.get_FQDN()
    process_infos = list()
    for proc in psutil.process_iter():
        proc_info = dict()
        with proc.oneshot():
            proc_info["pid"] = proc.pid
            proc_info["ppid"] = proc.ppid()
            proc_info["name"] = proc.name()
            proc_info["exe"] = proc.exe()  # Requires root access for '/proc/#/exe'
            proc_info["computer"] = fqdn
            proc_info["cpu_percent"] = proc.cpu_percent()

            mem_info = proc.memory_info()
            proc_info["mem_rss"] = mem_info.rss

            proc_info["num_threads"] = proc.num_threads()
            proc_info["nice_priority"] = proc.nice()
        process_infos.append(proc_info)
    return process_infos

我有一个调用此函数的一秒迭代,添加后我注意到我的应用程序 CPU 消耗从 ~1% 恶化到 ~10%。 分析器向我表明,我的大部分 CPU 时间都浪费在 psutil 的函数 _parse_stat_file 中,该函数解析 /proc/<pid>/stat 文件的内容。

根据psutils的文档,建议使用oneshot()函数来更高效的收集,但是你可以看到我已经使用了。

我在这里做错了吗?还是我注定要psutils 表现不佳?如果是这样,您知道其他可以更有效地解决我的问题的实用程序吗?

【问题讨论】:

    标签: python-3.x performance psutil


    【解决方案1】:

    psutil 作者在这里。

    我怀疑其他工具能否做得更好。读取 /proc/pid/stat 是用户空间应用程序获取这些进程信息的唯一方法,因此所有进程(ps、top 等)基本上都在做同样的事情:读取文件并解析它。因此,我不认为一个会比另一个快得多。

    通过使用 oneshot(),您已经告诉 psutil 避免多次读取该文件,因此您可能无法进一步加快速度。考虑到您每秒询问所有正在运行的进程的 7 个统计信息,因此很自然地期望某种开销。如果 top 有类似的 CPU 消耗,我不会感到惊讶。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2014-05-27
      相关资源
      最近更新 更多