为什么我的Python应用程序因“系统”/内核CPU时间而停滞不前
首先,我不确定是否应将此作为Ubuntu问题发布或在此处.
但我猜它更像是一个 Python问题,而不是一个OS问题. 我的Python应用程序在64核AMD服务器上运行在Ubuntu之上. 为了调试这个,我使用了流行的psutil Python包,我在一个单独的线程中每0.2秒注销一次CPU统计数据. 当暂停发生时,我的调试日志记录在我的许多进程’线程上显示非常高的’系统'(即内核)CPU时间. 例如.我看到CPU时间如下(通常每0.2秒)然后突然大幅跳跃 Process user | Process system | OS system % | OS idle % 19.9 | 10.5 | 6 | 74 5.6 | 2.3 | 4 | 87 6.8 | 1.7 | 11 | 75 4.6 | 5.5 | 43 | 52 0.5 | 26.4 | 4 | 90 我不知道为什么在匹配高流程系统使用之前报告一行高OS系统使用情况. 发生这种情况时,我还记录了我的进程的每个线程的CPU信息. 在使用多处理池(它用于短脉冲串)之后,这种暂停通常似乎很接近,但每次使用池时都不会发生. 问题:如何确定操作系统’系统’/内核时间突然出现的原因?为什么会在Python应用程序中发生? 更重要的是:任何想法为什么会发生这种情况以及如何避免它? 笔记: >不幸的是,它以root用户身份运行(不幸的是它必须用于相机库) 解决方法
好.我有自己的问题的答案.是的,我需要3个多月的时间才能做到这一点.
它似乎是Python中的GIL颠簸,这是大规模“系统”CPU峰值和相关暂停的原因.这是一个good explanation of where the thrashing comes from.那个演讲也指出了我正确的方向. Python 3.2 introduced a new GIL implementation避免这种颠簸.结果可以通过一个简单的线程示例显示(摘自上面的演示文稿): from threading import Thread import psutil def countdown(): n = 100000000 while n > 0: n -= 1 t1 = Thread(target=countdown) t2 = Thread(target=countdown) t1.start(); t2.start() t1.join(); t2.join() print(psutil.Process().cpu_times()) 在我的Macbook Pro with Python 2.7.9中,它使用14.7秒的“用户”CPU和13.2秒的“系统”CPU. Python 3.4使用15.0的’user'(略多)但只有0.2s的’system’. 因此,GIL仍然存在,它仍然只运行与代码是单线程时一样快,但它避免了Python 2的所有GIL争用,表现为内核(‘系统’)CPU时间.我认为,这种争论正是造成原始问题的原因. 更新 发现CPU问题的另一个原因是OpenCV / TBB.完整记录在SO question中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |