【发布时间】: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