使用`psutils`有效检索所有正在运行的进程的统计信息

时间:2018-08-22 08:23:31

标签: python-3.x performance psutil

我正在建立一个实用程序,该实用程序使用Python 3.6.5检索OS(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时间都浪费在_parse_stat_file函数oneshot()中,该函数解析psutil文件的内容。

根据/proc/<pid>/stat文档,建议使用{{3}}函数进行更有效的收集,但是如您所见,我已经在使用它。

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

1 个答案:

答案 0 :(得分:1)

psutil作者在此处。

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

通过使用oneshot(),您已经在告诉psutil避免多次读取该文件,因此您可能无法采取任何措施进一步提高该速度。考虑到您每秒要查询所有正在运行的进程的7个统计信息,因此自然会产生某种开销。如果top具有类似的CPU消耗,我不会感到惊讶。