我正在建立一个实用程序,该实用程序使用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
表现不佳?如果是这样,您知道其他工具可以更有效地解决我的问题吗?
答案 0 :(得分:1)
psutil作者在此处。
我怀疑其他工具能否做得更好。读取/ proc / pid / stat是用户空间应用程序获取那些进程信息的唯一方法,因此所有它们(ps,top等)基本上都做同样的事情:读取文件并进行解析。因此,我不希望一个人能比另一个人快得多。
通过使用oneshot(),您已经在告诉psutil避免多次读取该文件,因此您可能无法采取任何措施进一步提高该速度。考虑到您每秒要查询所有正在运行的进程的7个统计信息,因此自然会产生某种开销。如果top具有类似的CPU消耗,我不会感到惊讶。