คำตอบสั้น ๆ: ตั้ง Data Collector Set เก็บข้อมูลย้อนหลัง แล้วอ่านตัวนับที่บอกได้จริงว่าคอขวดอยู่ที่ CPU หน่วยความจำ ดิสก์ หรือเครือข่าย
คู่มือนี้อธิบาย Performance Monitor ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
เมื่อผู้ใช้แจ้งว่าระบบช้าเมื่อวานตอนบ่าย การเปิด Task Manager ดูตอนนี้ไม่ช่วยอะไร สิ่งที่ต้องมีคือข้อมูลที่เก็บไว้ตลอดเวลาเพื่อย้อนดูได้ Performance Monitor ทำได้และมีอยู่ใน Windows Server ทุกเครื่องโดยไม่ต้องติดตั้งเพิ่ม
คู่มือนี้ตั้งระบบเก็บข้อมูลอัตโนมัติ แล้วอธิบายตัวนับที่มีความหมายจริง พร้อมเกณฑ์ตัดสินว่าค่าเท่าไรถือว่าผิดปกติ ซึ่งเป็นส่วนที่หาคำตอบได้ยากที่สุด
สิ่งที่ต้องเตรียม
- Windows Server และสิทธิ์ Administrator
- พื้นที่ดิสก์สำหรับเก็บข้อมูล ประมาณ 1-2 GB ต่อเดือน
ขั้นตอนที่ 1: ดูค่าปัจจุบันอย่างเร็ว
Get-Counter '\Processor(_Total)\% Processor Time'
Get-Counter '\Memory\Available MBytes'
Get-Counter '\PhysicalDisk(_Total)\Avg. Disk sec/Read'
# เก็บตัวอย่างต่อเนื่อง
Get-Counter -Counter '\Processor(_Total)\% Processor Time',
'\Memory\Available MBytes',
'\PhysicalDisk(_Total)\Avg. Disk sec/Transfer' `
-SampleInterval 2 -MaxSamples 30
ขั้นตอนที่ 2: ตัวนับที่ควรดูและเกณฑ์ตัดสิน
CPU
\Processor(_Total)\% Processor Timeเกิน 85% ต่อเนื่องเกิน 10 นาทีถือว่าตึง\System\Processor Queue Lengthเกินจำนวนคอร์คูณสองถือว่ามีงานรอคิว\Processor(_Total)\% Privileged Timeเกิน 25% แปลว่าเวลาหมดไปกับงานของเคอร์เนล มักเกี่ยวกับไดรเวอร์หรือเครือข่าย
หน่วยความจำ
\Memory\Available MBytesควรเหลือมากกว่า 10% ของ RAM ทั้งหมด\Memory\Pages/secเกิน 1000 ต่อเนื่องคือสัญญาณว่าหน่วยความจำไม่พอ\Paging File(_Total)\% Usageเกิน 70% ควรเพิ่ม RAM
ดิสก์ ซึ่งมักเป็นคอขวดที่แท้จริง
\PhysicalDisk(_Total)\Avg. Disk sec/Readบน SSD ควรต่ำกว่า 0.010 วินาที ถ้าเกิน 0.025 คือช้าผิดปกติ\PhysicalDisk(_Total)\Avg. Disk sec/Writeเกณฑ์เดียวกัน\PhysicalDisk(_Total)\Current Disk Queue Lengthเกิน 2 ต่อดิสก์หนึ่งใบคือมีคิวสะสม
เครือข่าย
\Network Interface(*)\Bytes Total/secเทียบกับความเร็วการ์ด เกิน 70% ควรพิจารณาเพิ่ม\Network Interface(*)\Output Queue Lengthควรเป็น 0 ตลอด
ขั้นตอนที่ 3: สร้าง Data Collector Set
$counters = @(
'\Processor(_Total)\% Processor Time'
'\Processor(_Total)\% Privileged Time'
'\System\Processor Queue Length'
'\Memory\Available MBytes'
'\Memory\Pages/sec'
'\Paging File(_Total)\% Usage'
'\PhysicalDisk(_Total)\Avg. Disk sec/Read'
'\PhysicalDisk(_Total)\Avg. Disk sec/Write'
'\PhysicalDisk(_Total)\Current Disk Queue Length'
'\Network Interface(*)\Bytes Total/sec'
'\LogicalDisk(C:)\% Free Space'
)
$counters | Out-File C:\PerfLogs\counters.txt -Encoding ASCII
logman create counter "TDC-Baseline" `
-cf C:\PerfLogs\counters.txt `
-si 00:00:15 `
-o "C:\PerfLogs\TDC-Baseline" `
-f bincirc -max 500 `
-v mmddhhmm
logman start "TDC-Baseline"
logman query "TDC-Baseline"
ตัวเลือก -f bincirc -max 500 คือเขียนวนทับเมื่อไฟล์ถึง 500 MB ทำให้ดิสก์ไม่เต็มแม้เก็บต่อเนื่องเป็นเดือน และ -si 00:00:15 คือเก็บตัวอย่างทุก 15 วินาที ซึ่งละเอียดพอสำหรับงานทั่วไปโดยไม่กินทรัพยากรมาก
ตั้งให้เริ่มเองทุกครั้งที่บูต
$action = New-ScheduledTaskAction -Execute 'logman.exe' -Argument 'start "TDC-Baseline"'
$trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -TaskName "Start PerfMon Baseline" -Action $action `
-Trigger $trigger -User "SYSTEM" -RunLevel Highest
ขั้นตอนที่ 4: อ่านข้อมูลย้อนหลัง
# แปลงเป็น CSV เพื่อเปิดใน Excel
relog "C:\PerfLogs\TDC-Baseline\*.blg" -f CSV -o C:\PerfLogs\report.csv
# ดึงเฉพาะช่วงเวลาที่มีปัญหา
relog "C:\PerfLogs\TDC-Baseline\*.blg" -b "24/09/2026 13:00:00" -e "24/09/2026 15:00:00" `
-f CSV -o C:\PerfLogs\incident.csv
# ดึงเฉพาะตัวนับที่สนใจ
relog "C:\PerfLogs\TDC-Baseline\*.blg" -c "\Processor(_Total)\% Processor Time" `
-f CSV -o C:\PerfLogs\cpu.csv
อ่านด้วย PowerShell โดยตรงก็ได้
$data = Import-Counter "C:\PerfLogs\TDC-Baseline\*.blg"
$data.CounterSamples |
Where-Object Path -like "*% Processor Time*" |
Measure-Object CookedValue -Average -Maximum