Perfmon: The Complete Guide to Windows Performance Monitoring

Automating Performance Data Collection with Perfmon Scripts

Collecting performance data consistently is essential for diagnosing issues, capacity planning, and proving system baselines. Windows Performance Monitor (Perfmon) provides rich counters across CPU, memory, disk, network, and application layers. Automating Perfmon via scripts ensures reliable, repeatable collection with minimal manual effort. This article shows practical, actionable steps to set up automated data collection using built-in Windows tools and PowerShell.

1. Plan what to collect

  • Identify goals: troubleshooting, capacity planning, SLA verification, or baseline creation.
  • Select counters: common choices include Processor(_Total)\% Processor Time, Memory\Available MBytes, PhysicalDisk(Total)\Avg. Disk sec/Transfer, Network Interface\Bytes Total/sec, and application-specific counters (e.g., .NET CLR Memory).
  • Decide sample interval and duration: short interval (5–15s) for diagnostics, longer (60–300s) for baselines.
  • Storage and retention: estimate disk usage (counters × interval × retention) and choose output format (binary .blg for efficiency, CSV for easy parsing).

2. Create a Data Collector Set (DCS) manually (one-time setup)

  1. Open Performance Monitor (perfmon.exe) → Data Collector Sets → User Defined → New → Data Collector Set.
  2. Choose Create manually (Advanced)Performance counter → Add chosen counters and set sample interval.
  3. Configure log format (.blg, .csv, or .txt), output location, and maximum size or circular logging.
  4. Save and test by starting the DCS. Verify generated logs with Performance Monitor or Logman/Relog.

3. Automate with Logman (built-in command-line)

Logman is ideal for scripting DCS creation and scheduling.

Create a collector:

Code

logman create counter MyPerfData -c “\Processor(_Total)\% Processor Time” “\Memory\Available MBytes” -si 15 -o C:\PerfLogs\MyPerfData -f BIN
  • -si 15 sets 15s sample interval.
  • -f BIN creates a binary .blg. Use -f CSV for CSV.

Start, stop, and delete:

Code

logman start MyPerfData logman stop MyPerfData logman delete MyPerfData

Schedule via Task Scheduler:

  1. Create a scheduled task to run logman start MyPerfData at boot or a specified time.
  2. Create another task to stop after the desired run duration, or use -rf (runfrom) with duration options in logman where applicable.

4. Automate with PowerShell (recommended)

PowerShell offers readability and integration with other automation.

Create and start a collector:

powershell

\(Name</span><span> = </span><span class="token" style="color: rgb(163, 21, 21);">"MyPerfData"</span><span> </span><span></span><span class="token" style="color: rgb(54, 172, 170);">\)Output = “C:\PerfLogs</span>\(Name</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span> </span><span></span><span class="token" style="color: rgb(54, 172, 170);">\)Counters = @( ’\Processor(_Total)\% Processor Time’, ’\Memory\Available MBytes’, ’\PhysicalDisk(Total)\Avg. Disk sec/Transfer’, ’\Network Interface(*)\Bytes Total/sec’ ) \(Interval</span><span> = 15 </span> <span></span><span class="token" style="color: rgb(0, 128, 0); font-style: italic;"># Create</span><span> </span><span>logman create counter </span><span class="token" style="color: rgb(54, 172, 170);">\)Name -c \(Counters</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">-</span><span class="token" style="color: rgb(57, 58, 52);">si</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)Interval -o \(Output</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">-</span><span>f BIN </span> <span></span><span class="token" style="color: rgb(0, 128, 0); font-style: italic;"># Start</span><span> </span><span>logman </span><span class="token" style="color: rgb(57, 58, 52);">start</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)Name

Stop and delete:

powershell

logman stop \(Name</span><span> </span><span>logman delete </span><span class="token" style="color: rgb(54, 172, 170);">\)Name

Wrap in a script to:

  • Accept parameters (name, output path, counters, interval, duration).
  • Create timestamped folders for each run.
  • Rotate or archive old logs.
  • Send logs to a network share or central collector.

Sample script snippet with duration and timestamped output: “`powershell param( [string]\(Name = "MyPerfData", [int]\)Interval = 15, [int]\(DurationMinutes = 60 )</p> <p>\)Timestamp = (Get-Date).ToString(‘yyyyMMdd-HHmmss’) $Output = “C:\Perf

Comments

Leave a Reply