Python监控Unix子进程:CPU时间显示为0的原因排查
问题原因解析
1. 原代码CPU时间显示为0的本质原因
调用subprocess.Popen()后,子进程仅完成启动初始化,尚未真正执行核心计算逻辑,此时通过resource.getrusage()获取的usage_end与启动前的usage_start差值几乎为0,导致计算出的CPU时间(用户态+内核态时间总和)显示为0。而你看到的2秒内存数据,是因为内存采样逻辑在Popen后立刻启动,此时子进程已占用内存但CPU尚未进入密集计算阶段,采样仅持续了短暂时间就因提前终止而只留下少量记录,和实际进程4秒的运行周期不匹配。
2. 移至等待循环后内存记录增多的原因
当将usage_end的获取逻辑移至进程等待循环(如while proc.poll() is None:)之后,内存采样逻辑会和等待循环绑定:只要子进程未结束,循环就持续执行,内存采样也会按设定的间隔不断采集数据。之前的代码中,Popen后立即获取usage_end,采样逻辑可能在子进程还未完成运行时就停止了,而现在会覆盖子进程整个4秒的运行周期,采样次数自然增加,记录数量也就变多了。
额外注意点
- CPU时间统计:若要准确获取子进程的CPU时间,需使用
resource.getrusage(resource.RUSAGE_CHILDREN)(针对子进程统计),且必须等待子进程完全退出后再调用,才能得到完整的用户态+内核态时间总和,这与你之前观察到的4秒统计值一致。 - 内存采样频率:记录数量直接由采样间隔和子进程运行时长决定,比如采样间隔设为1秒,4秒的运行周期会产生4-5条内存记录,和你调整代码后的结果匹配。
内容的提问来源于stack exchange,提问作者amk
相关产品推荐
相关产品推荐

