Windows系统下如何通过编程方式监控测试应用的资源使用情况
Windows下进程性能监控的可编程实现方案
针对你需要在性能测试进程启动前开启监控、结束后汇总CPU/RAM/硬盘使用率的需求,以下是两种Windows环境下的实用可编程方案:
一、PowerShell脚本实现(无需额外安装工具)
PowerShell自带对Windows性能计数器的支持,能轻松实现进程监控、数据记录和可视化,完全符合你的需求。
脚本示例
# 配置参数 $processName = "your_target_process.exe" # 替换为被测进程的可执行文件名 $monitorInterval = 1 # 监控间隔(单位:秒) $outputCsv = "process_perf_data.csv" # 初始化监控数据容器 $metricsList = @() # 等待目标进程启动(进程未启动时持续等待) Write-Host "等待目标进程启动..." do { $targetProc = Get-Process -Name $processName -ErrorAction SilentlyContinue Start-Sleep -Seconds 1 } while (-not $targetProc) $procId = $targetProc.Id Write-Host "开始监控进程ID: $procId" # 持续监控直到进程结束 while (Get-Process -Id $procId -ErrorAction SilentlyContinue) { # 获取核心指标 $cpuUsage = [math]::Round((Get-Counter "\Process($processName)\% Processor Time").CounterSamples.CookedValue, 2) $ramUsageMB = [math]::Round((Get-Process -Id $procId).WorkingSet / 1MB, 2) $diskReadPerSec = [math]::Round((Get-Counter "\Process($processName)\IO Read Bytes/sec").CounterSamples.CookedValue, 2) $diskWritePerSec = [math]::Round((Get-Counter "\Process($processName)\IO Write Bytes/sec").CounterSamples.CookedValue, 2) $currentTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss" # 记录数据 $metricsList += [PSCustomObject]@{ Timestamp = $currentTime CPU_Usage_Percent = $cpuUsage RAM_Usage_MB = $ramUsageMB Disk_Read_Bytes_Sec = $diskReadPerSec Disk_Write_Bytes_Sec = $diskWritePerSec } # 实时控制台输出 Write-Host "$currentTime | CPU: $cpuUsage% | RAM: $ramUsageMB MB | 读盘: $diskReadPerSec B/s | 写盘: $diskWritePerSec B/s" Start-Sleep -Seconds $monitorInterval } # 保存数据到CSV文件 $metricsList | Export-Csv -Path $outputCsv -NoTypeInformation Write-Host "监控结束,原始数据已保存到: $outputCsv" # 可选:生成可视化图表 Add-Type -AssemblyName System.Windows.Forms.DataVisualization $chart = New-Object System.Windows.Forms.DataVisualization.Charting.Chart $chart.Size = New-Object System.Drawing.Size(800, 600) $chartArea = $chart.ChartAreas.Add("MainArea") # 添加CPU使用率曲线 $cpuSeries = $chart.Series.Add("CPU使用率") $cpuSeries.ChartType = [System.Windows.Forms.DataVisualization.Charting.SeriesChartType]::Line $metricsList | ForEach-Object { $cpuSeries.Points.AddXY($_.Timestamp, $_.CPU_Usage_Percent) } # 添加RAM使用率曲线(右侧Y轴) $ramSeries = $chart.Series.Add("RAM使用率") $ramSeries.ChartType = [System.Windows.Forms.DataVisualization.Charting.SeriesChartType]::Line $ramSeries.YAxisType = [System.Windows.Forms.DataVisualization.Charting.AxisType]::Secondary $metricsList | ForEach-Object { $ramSeries.Points.AddXY($_.Timestamp, $_.RAM_Usage_MB) } # 保存图表为图片 $chart.SaveImage("process_perf_chart.png", [System.Windows.Forms.DataVisualization.Charting.ChartImageFormat]::Png) Write-Host "监控图表已保存到: process_perf_chart.png"
使用说明
- 替换
$processName为你的目标进程名(比如notepad.exe) - 右键以管理员身份打开PowerShell,执行脚本:
.\monitor_process.ps1 - 脚本会自动等待进程启动,监控至进程结束后输出CSV数据和PNG图表
二、Python脚本实现(灵活度更高)
如果你熟悉Python,用psutil库可以更灵活地获取进程指标,配合matplotlib生成专业图表。
步骤1:安装依赖
pip install psutil matplotlib
脚本示例
import psutil import time import matplotlib.pyplot as plt from datetime import datetime # 配置参数 TARGET_PROCESS = "your_target_process.exe" # 替换为被测进程名 MONITOR_INTERVAL = 1 # 监控间隔(秒) OUTPUT_CSV = "process_perf_data.csv" # 等待目标进程启动 print("等待目标进程启动...") target_proc = None while not target_proc: for proc in psutil.process_iter(['name']): if proc.info['name'] == TARGET_PROCESS: target_proc = proc break time.sleep(1) proc_id = target_proc.pid print(f"开始监控进程ID: {proc_id}") # 初始化数据存储 timestamps = [] cpu_data = [] ram_data = [] disk_read_data = [] disk_write_data = [] # 持续监控直到进程退出 while psutil.pid_exists(proc_id): try: proc = psutil.Process(proc_id) # 获取指标 cpu_usage = proc.cpu_percent(interval=MONITOR_INTERVAL) ram_usage_mb = round(proc.memory_info().rss / (1024 * 1024), 2) io_stats = proc.io_counters() disk_read = io_stats.read_bytes disk_write = io_stats.write_bytes current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 记录数据 timestamps.append(current_time) cpu_data.append(cpu_usage) ram_data.append(ram_usage_mb) disk_read_data.append(disk_read) disk_write_data.append(disk_write) # 控制台输出 print(f"{current_time} | CPU: {cpu_usage}% | RAM: {ram_usage_mb}MB | 累计读盘: {disk_read}B | 累计写盘: {disk_write}B") except psutil.NoSuchProcess: break # 保存数据到CSV with open(OUTPUT_CSV, 'w', encoding='utf-8') as f: f.write("Timestamp,CPU_Usage_Percent,RAM_Usage_MB,Disk_Read_Total_Bytes,Disk_Write_Total_Bytes\n") for t, c, r, dr, dw in zip(timestamps, cpu_data, ram_data, disk_read_data, disk_write_data): f.write(f"{t},{c},{r},{dr},{dw}\n") print(f"监控结束,原始数据已保存到: {OUTPUT_CSV}") # 生成可视化图表 fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8)) # CPU使用率图表 ax1.plot(timestamps, cpu_data, color='blue', label='CPU使用率(%)') ax1.set_title('CPU使用率趋势') ax1.set_ylabel('CPU %') ax1.legend() ax1.tick_params(axis='x', rotation=45) # RAM使用率图表 ax2.plot(timestamps, ram_data, color='green', label='RAM使用率(MB)') ax2.set_title('RAM使用率趋势') ax2.set_xlabel('时间戳') ax2.set_ylabel('RAM (MB)') ax2.legend() ax2.tick_params(axis='x', rotation=45) plt.tight_layout() plt.savefig('process_perf_chart.png') print(f"监控图表已保存到: process_perf_chart.png") plt.show()
使用说明
- 替换
TARGET_PROCESS为目标进程名 - 运行脚本:
python monitor_process.py - 脚本会自动等待进程启动,监控至进程结束后生成CSV数据和可视化图表
关键注意事项
- 进程匹配:如果存在多个同名进程,脚本会监控第一个找到的进程;若需要精确匹配,可改为通过进程ID指定(提前获取或让用户输入)
- 权限问题:部分系统进程需要管理员权限才能获取完整指标,运行脚本时请以管理员身份启动
- 磁盘IO指标:PowerShell版本输出的是每秒IO速率,Python版本输出的是累计IO字节数,若需要每秒速率,可计算相邻两次数据的差值
内容的提问来源于stack exchange,提问作者Haris_007
相关产品推荐
相关产品推荐

