如何使用Python查看CPU使用率、堆内存使用率、线程数及进程数
多进程程序的系统资源监控方法
针对多进程程序的CPU使用率、堆内存使用率、进程数及线程数监控,分操作系统和实现方式整理如下:
Linux/Unix 环境
命令行工具(快速排查)
- 查看进程数:用
ps过滤目标程序ps -ef | grep "你的程序名" | grep -v grep | wc -l - 查看线程数:针对单个进程查看线程
# 替换<PID>为目标进程ID ps -L -p <PID> | wc -l # 或者用htop(需先安装),按H键显示线程,直接查看每个进程的线程数 - 实时CPU/内存监控:
top:启动后按H显示线程,Shift+P按CPU使用率排序,Shift+M按内存排序;输入o可自定义列(比如添加THREAD列)htop:更直观的界面,默认显示进程的CPU、内存占比及线程数
- 堆内存细节:用
pmap查看进程内存分布,堆内存会标记为heappmap -x <PID> | grep heap - 批量进程监控:
pidstat可以按进程/线程维度采样# 每2秒采样一次,监控目标进程的CPU(含线程) pidstat -u -t -p <PID> 2 # 监控内存使用 pidstat -r -p <PID> 2
编程实现(自定义监控)
通过读取/proc文件系统实现:
- 线程数:读取
/proc/<PID>/stat的第20个字段 - CPU使用率:计算
/proc/<PID>/stat中的utime和stime两次采样的差值,结合系统总CPU时间换算 - 堆内存:解析
/proc/<PID>/maps文件,找到标记为[heap]的内存区域的大小
Windows 环境
图形化/命令行工具
- 任务管理器:打开后切换到「详细信息」,查看目标进程的「CPU」「内存(私有工作集)」列;右键进程选择「转到线程」可查看线程数
- 命令行查看进程/线程数:
# 查看目标程序的进程列表及内存 tasklist /fi "imagename eq 你的程序名.exe" # 查看线程数 wmic process where name='你的程序名.exe' get ProcessId,ThreadCount - 性能监视器(perfmon):
启动后添加计数器,选择「进程」类别下的「%处理器时间」「工作集」「线程数」,并指定目标程序的进程实例,可生成长期监控报表
编程实现
调用Win32 API:
CreateToolhelp32Snapshot:枚举进程和线程,统计进程数、线程数GetProcessMemoryInfo:获取进程内存信息,其中WorkingSetSize为驻留内存,堆内存可通过HeapWalk遍历进程堆统计GetProcessTimes:获取进程的用户态/内核态CPU时间,结合系统时间计算CPU使用率
跨平台编程实现(推荐)
用Python的psutil库可以轻松实现跨平台监控,无需关注系统差异:
import psutil import time def monitor_target(process_name): while True: # 筛选所有匹配的进程 target_procs = [ proc for proc in psutil.process_iter(['name', 'pid', 'cpu_percent', 'memory_info', 'num_threads']) if proc.info['name'] == process_name ] if not target_procs: print(f"未找到进程: {process_name}") time.sleep(5) continue print(f"\n=== [{time.strftime('%Y-%m-%d %H:%M:%S')}] 监控统计 ===") print(f"总进程数: {len(target_procs)}") total_cpu = 0.0 total_rss = 0.0 total_threads = 0 for proc in target_procs: try: cpu_pct = proc.info['cpu_percent'] mem_info = proc.info['memory_info'] thread_count = proc.info['num_threads'] total_cpu += cpu_pct total_rss += mem_info.rss total_threads += thread_count # 堆内存可通过memory_full_info获取(需足够权限) heap_mem = proc.memory_full_info().heap if hasattr(proc.memory_full_info(), 'heap') else "N/A" print(f"PID {proc.info['pid']}: CPU {cpu_pct}%, 驻留内存 {mem_info.rss/1024/1024:.2f} MB, 堆内存 {heap_mem/1024/1024:.2f} MB, 线程数 {thread_count}") except (psutil.NoSuchProcess, psutil.AccessDenied): continue print(f"总计: CPU {total_cpu}%, 总驻留内存 {total_rss/1024/1024:.2f} MB, 总线程数 {total_threads}") time.sleep(3) if __name__ == "__main__": # 替换为你的程序名称(比如linux下的可执行文件名,windows下的exe名) monitor_target("your_program_name")
内容的提问来源于stack exchange,提问作者Model Trainer
相关产品推荐
相关产品推荐

