关于psutil记录主/子进程资源:内存最大值与CPU/IO累积值的确认
确认psutil监控多进程资源的正确记录方式
嘿,你的思路完全在线!针对你提到的三个资源监控维度,我帮你确认并补充点细节:
1. 最大内存使用量:必须用 max(mem_usage, new_data)
psutil返回的内存数据(比如memory_info().rss)是当前时间点的瞬时值,而我们要的是进程生命周期内的峰值内存占用。所以每次轮询时,必须把新获取的数值和之前记录的最大值做比较,保留更大的那个——这样最终得到的才是该进程运行期间的真实内存峰值。
给你个简单的实现片段参考:
import psutil import time def track_process_max_memory(pid): max_rss = 0 process = psutil.Process(pid) while process.is_running(): try: current_rss = process.memory_info().rss # 物理内存占用,单位字节 max_rss = max(max_rss, current_rss) time.sleep(1) except psutil.NoSuchProcess: break return max_rss / (1024 * 1024) # 转换为MB返回
这里用rss(Resident Set Size)是最常用的物理内存指标,如果你需要监控虚拟内存,可以换成vms,逻辑完全一致。
2. CPU时间:记录最后一组数据完全正确
psutil的cpu_times()返回的user(用户态时间)和system(内核态时间)都是累积计数器,从进程启动开始一直累加直到进程终止。所以进程结束前的最后一次读取值,就是该进程整个生命周期消耗的总CPU时间。不需要在轮询时累加,直接取最后一次的结果就好。
示例代码:
def get_process_total_cpu_time(pid): process = psutil.Process(pid) while process.is_running(): time.sleep(1) try: cpu_stats = process.cpu_times() return cpu_stats.user + cpu_stats.system # 总CPU时间,单位秒 except psutil.NoSuchProcess: return 0.0
3. IO数据:同样只需记录最后一组数据
和CPU时间逻辑一致,psutil的io_counters()返回的read_bytes、write_bytes等指标也是累积值,统计的是从进程启动到当前的总IO字节数。所以进程结束时的最后一次读取,就是该进程全程的IO总量,不需要额外累加。
注意:部分系统(比如Windows)可能不支持进程级IO统计,调用io_counters()会抛出NotImplementedError,建议代码里加上异常处理:
def get_process_total_io(pid): process = psutil.Process(pid) while process.is_running(): time.sleep(1) try: io_stats = process.io_counters() return {"read_mb": io_stats.read_bytes / (1024*1024), "write_mb": io_stats.write_bytes / (1024*1024)} except (psutil.NoSuchProcess, NotImplementedError): return {"read_mb": 0.0, "write_mb": 0.0}
另外补充:主进程的资源监控逻辑和子进程完全一致——内存要跟踪最大值,CPU和IO取最后一次的累积值就可以。
内容的提问来源于stack exchange,提问作者Solti
相关产品推荐
相关产品推荐

