หนึ่งในเมตริกหลัก ซึ่งช่วยประเมินประสิทธิภาพของระบบจัดเก็บข้อมูลที่มีอยู่หรือที่ออกแบบคือ IOPS (Input/Output Operations Per Second) อย่างง่ายๆ IOPS คือจำนวนการดำเนินการอ่าน/เขียนกับที่จัดเก็บ ดิสก์ หรือระบบไฟล์ต่อหน่วยเวลา ยิ่งตัวเลขนี้ใหญ่ ยิ่งประสิทธิภาพของที่จัดเก็บของคุณสูง (พูดตรงๆ ค่า IOPS ต้องพิจารณาพร้อมกับลักษณะเฉพาะประสิทธิภาพที่จัดเก็บอื่นๆ เช่น latency, throughput เป็นต้น)
ในบทความนี้ เราจะดูหลายวิธีในการวัดประสิทธิภาพการจัดเก็บข้อมูล (IOPS, latency, throughput) ใน Windows (คุณสามารถใช้คู่มือนี้สำหรับฮาร์ดดิสก์ท้องถิ่น SSD, โฟลเดอร์เครือข่าย SMB, โวล्यุม CSV หรือ LUN บนที่จัดเก็บ SAN/iSCSI)
การบันทึก Storage I/O โดยใช้ตัวนับประสิทธิภาพดิสก์ใน Windows
คุณสามารถประเมินภาระงาน I/O ของที่จัดเก็บปัจจุบันใน Windows โดยประมาณโดยใช้ตัวนับประสิทธิภาพดิสก์ที่สร้างในจาก Performance Monitor เพื่อรวบรวมข้อมูลตัวนับเหล่านี้:
- เริ่ม Perfmon;
- สร้าง Data Collector Set ใหม่ และเลือก Create manually;

- เลือกเช็คบ็อกซ์ Create data logs -> Performance counter;

- ตอนนี้ในคุณสมบัติของชุดการรวบรวมข้อมูลใหม่ ให้เพิ่มตัวนับประสิทธิภาพต่อไปนี้สำหรับอ็อบเจ็กต์ Physical Disk (คุณสามารถเลือกตัวนับสำหรับดิสก์เฉพาะหรือสำหรับดิสก์ท้องถิ่นทั้งหมดที่มี):
- Avg. Disk Sec./Transfer
- Avg. Disk Queue Length
- Avg Disk Bytes/Transfer
- Disk Bytes/sec
- Disk Transfers/sec
- Split IO/sec
- คุณสามารถเปลี่ยนคุณสมบัติการรวบรวมข้อมูลอื่นๆ ได้ โดยค่าเริ่มต้น ค่าตัวนับถูกรวบรวมทุก 15 วินาที เพื่อแสดงประสิทธิภาพดิสก์แบบเรียลไทม์ คุณต้องเพิ่มตัวนับ Perfmon ที่ระบุในส่วน Monitoring Tools -> Performance Monitor

- เหลือเพียงเริ่มรวบรวมข้อมูลตัวนับประสิทธิภาพ (เลือก Start) และรอการรวบรวมข้อมูลเพียงพอสำหรับการวิเคราะห์ หลังจากนั้น คลิกขวาที่ชุดตัวเก็บข้อมูลของคุณและเลือก Stop;

- เพื่อดูข้อมูลประสิทธิภาพที่รวบรวม ไปที่ Perfmon -> Reports -> User Defined -> Data_Disk_IO —> check_the_last_set โดยค่าเริ่มต้น ข้อมูลดิสก์แสดงเป็นกราฟ;
- ใช้ Ctrl + G เพื่อสลับไปโหมด Report

วิธีเข้าใจตัวนับประสิทธิภาพการจัดเก็บที่รวบรวมโดย Perfmon? สำหรับการวิเคราะห์ประสิทธิภาพดิสก์/ที่จัดเก็บอย่างรวดเร็ว คุณต้องดูค่าของตัวนับต่อไปนี้อย่างน้อย 5 ตัว
เมื่อวิเคราะห์ข้อมูลตัวนับ แนะนำให้คุณเข้าใจการกำหนดค่าดิสก์ฟิสิกัล (ที่จัดเก็บ) ปัจจุบัน (ว่ามี RAID หรือ Stripe ใช้ จำนวนและประเภทดิสก์ ขนาดแคช เป็นต้น)
- Disk sec/Transfer – เวลาที่ต้องใช้ในการดำเนินการอ่าน/เขียนหนึ่งครั้งกับอุปกรณ์จัดเก็บหรือดิสก์ (disk latency) หากความล่าช้ามากกว่า 25 ms (0.25) แล้ว อาร์เรย์ดิสก์ไม่สามารถจัดการการดำเนินการ I/O ทันเวลา สำหรับเซิร์ฟเวอร์โหลดสูง ค่าความล่าช้าดิสก์ไม่ควรเกิน 10 ms (0.1);
- Disk Transfers/sec – (IOPS) จำนวนการดำเนินการอ่าน/เขียนต่อวินาที นี่คือตัวบ่งชี้หลักของความเข้มข้นการเข้าถึงดิสก์ (ค่า IOPS ประมาณสำหรับประเภทดิสก์ต่างๆ รายการที่ท้ายบทความ);
- Disk Bytes/Sec – Throughput ดิสก์รวม (อ่าน+เขียน) ต่อวินาที ค่าสูงสุดขึ้นอยู่กับประเภทดิสก์ (150-250 Mb/s – สำหรับดิสก์ HDD ทั่วไป และ 500-10000 สำหรับ SSD);
- Split IO/sec – ตัวบ่งชี้การแยกส่วนของดิสก์ เมื่อระบบปฏิบัติการต้องแยกการดำเนินการ I/O หนึ่งครั้งเป็นคำขอดิสก์หลายครั้ง อาจบ่งชี้ว่าแอปพลิเคชันขอบล็อกข้อมูลขนาดใหญ่เกินไปที่ไม่สามารถถ่ายโอนในครั้งเดียวได้;
- Avg. Disk Queue Length – จำนวนเฉลี่ยของคำขออ่าน/เขียนที่อยู่ในคิว สำหรับดิสก์เดี่ยว ความยาวคิวไม่ควรเกิน 2 สำหรับอาร์เรย์ RAID 4 ดิสก์ ค่าเกณฑ์ของความยาวคิวดิสก์คือ 8
DiskSpd: การทดสอบประสิทธิภาพดิสก์และ IOPS ใน Windows
Microsoft แนะนำให้ใช้ยูทิลิตี้ DiskSpd (https://aka.ms/diskspd) สำหรับสร้างโหลดบนดิสก์ (ที่จัดเก็บ) ระบบและวัดประสิทธิภาพของมัน นี่คือเครื่องมือบรรทัดคำสั่งที่สามารถดำเนินการ I/O กับเป้าหมายไดรฟ์ที่ระบุในหลายเธรด ผมใช้ DiskSpd บ่อยครั้งเพื่อวัดประสิทธิภาพที่จัดเก็บและรับความเร็วอ่าน/เขียนสูงสุดและ IOPS ที่พร้อมใช้งานจากเซิร์ฟเวอร์เฉพาะ (當然 คุณสามารถวัดประสิทธิภาพของที่จัดเก็บได้เช่นกัน ในกรณีนี้ diskspd จะถูกใช้เพื่อสร้างโหลดที่จัดเก็บ)
DiskSpd ไม่ต้องการการติดตั้ง เพียงดาวน์โหลดและแตกไฟล์ไปยังดิสก์ท้องถิ่น สำหรับระบบ x64 bit ใช้เวอร์ชัน diskspd.exe จากไดเรกทอรี amd64fre
ผมใช้คำสั่งต่อไปนี้เพื่อทดสอบประสิทธิภาพของดิสก์:
diskspd.exe –c50G -d300 -r -w40 -t8 -o32 -b64K -Sh -L E:\diskpsdtmp.dat > DiskSpeedResults.txt
สำคัญ. เมื่อใช้ diskspd.exe โหลดที่ค่อนข้างมากจะถูกสร้างบนดิสก์และ CPU ของระบบที่ทดสอบ เพื่อกำจัดการลดประสิทธิภาพสำหรับผู้ใช้ ไม่แนะนำให้เริ่มบนระบบการผลิตในชั่วโมงเร่งด่วน

-c50G– ขนาดไฟล์ 50 GB (ดีกว่าที่จะใช้ขนาดไฟล์ใหญ่ เพื่อไม่ให้พอดีกับแคชของคอนโทรลเลอร์ที่จัดเก็บ);-d300– ระยะเวลาทดสอบในวินาที;-r– การดำเนินการอ่าน/เขียนแบบสุ่ม (หากคุณต้องการทดสอบการเข้าถึงแบบลำดับ ใช้ –s);-t8– จำนวนเธรด;-w40– อัตราส่วนการเขียนต่อการอ่าน 40%/60%;-o32— ความยาวคิว;-b64K— ขนาดบล็อก;-Sh— ไม่ใช้แคช;-L— วัดความล่าช้า;E:\diskpsdtmp.dat– เส้นทางไฟล์ทดสอบ.
หลังจากการทดสอบความเครียดเสร็จสิ้น ค่าเฉลี่ยประสิทธิภาพการจัดเก็บสามารถได้รับจากตารางเอาต์พุต
ในการทดสอบของผม ได้ข้อมูลประสิทธิภาพต่อไปนี้ (ตรวจสอบตาราง Total IO):
- MiB/s — 241 (ประมาณ 252 Mb/s ดไม่เลว);
- IOPS — 3866 (ดีเยี่ยม!);
- ความล่าช้าเฉลี่ย — 66.206 ms (ความล่าช้าค่อนข้างสูง!)
คุณสามารถรับค่าแยกต่างหากสำหรับการอ่าน (ส่วน Read IO) หรือการเขียน (ส่วน Write IO)
หลังจากทดสอบดิสก์หรือ LUN ที่จัดเก็บหลายตัวโดยใช้ diskspd คุณสามารถเปรียบเทียบพวกมันหรือเลือกอาร์เรย์ที่มีประสิทธิภาพที่ต้องการสำหรับงานของคุณ
วิธีวัด IOPS Throughput และ Latency ของที่จัดเก็บโดยใช้ PowerShell
ผมพบสคริปต์ PowerShell (โดย Mikael Nystrom, Microsoft MVP) ซึ่งเป็นส่วนเสริมของยูทิลิตี้ SQLIO.exe (ชุดการทดสอบประสิทธิภาพที่จัดเก็บไฟล์)
หมายเหตุ ในธันวาคม 2015 Microsoft ประกาศสิ้นสุดการสนับสนุนเครื่องมือนี้และแทนที่ SQLIO ด้วยเครื่องมือที่ครอบคลุมมากขึ้น Diskspd และลบไฟล์การแจกจ่าย SQLIO จากเว็บไซต์ของมัน ดังนั้นคุณจะต้องค้นหา sqlio.exe เอง หรือดาวน์โหลดจากเว็บไซต์ของเรา (มันอยู่ในไฟล์เก็บถาวรพร้อมสคริปต์ PowerShell)
ดังนั้น ดาวน์โหลดไฟล์เก็บถาวรที่มี 2 ไฟล์: SQLIO.exe และ DiskPerformance.ps1 (disk_perf_iops.ZIP — 74 KB) และแตกไปยังโฟลเดอร์ใดๆ

ตัวอย่างการรันสคริปต์ PowerShell เพื่อประเมินประสิทธิภาพดิสก์และ IOPS:
.\DiskPerformance.ps1 -TestFileName test.dat –TestFileSizeInGB 1 -TestFilepath C:\temp -TestMode Get-LargeIO -FastMode True -RemoveTestFile True -OutputFormat Out-GridView

มาพิจารณาอาร์กิวเมนต์ของสคริปต์:
–TestFileName test.dat– ชื่อไฟล์ที่สร้างโดยเครื่องมือ FSUTIL;–TestFileSizeInGB 1– ขนาดไฟล์ทดสอบ ค่าที่เป็นไปได้คือ 1.5, 10, 50, 100, 500, 1,000 GB ขนาดไฟล์ต้องใหญ่กว่าขนาดแคชของระบบที่จัดเก็บ มิฉะนั้น IOPS จะวัดสำหรับข้อมูลแคช แทนที่จะเป็นดิสก์;-TestFilepath C:\Temp– ที่นี่คุณระบุดิสก์ที่จะวัดประสิทธิภาพ และโฟลเดอร์บนดิสก์ ที่จะสร้างไฟล์ทดสอบ คุณยังสามารถระบุเส้นทาง UNC ไปยังโฟลเดอร์ที่แชร์บนเครือข่าย (SMB);-TestMode Get-LargeIO– มีสองตัวเลือกการวัด input-output Get-SmallIO อนุญาตให้วัด IOPS และ Get-LargeIO วัดอัตราการถ่ายโอนข้อมูล ความแตกต่างระหว่างอาร์กิวเมนต์ SmallIO และ LargeIO อยู่ที่ขนาดบล็อก 8 KB และ 512 KB ขณะวัดอัตรา และประเภทการเข้าถึง Random หรือ Sequential ตามลำดับ;-FastMode True– ในโหมด Fastmode แต่ละการทดสอบรัน 10 วินาที มิฉะนั้นจะใช้เวลา 60 วินาที;-RemoveTestFile True– ลบไฟล์ทดสอบหลังจากการทดสอบเสร็จสิ้น;-OutputFormat Out-GridView– ผลลัพธ์การทดสอบสามารถแสดงได้ทั้งในคอนโซล PowerShell (Format-Table) หรือในหน้าต่างกราฟิกแยก (Out-Gridview)

ในกรณีของเรา (vmdk virtual disk บน VMFS datastore บน HP MSA 2040 ที่เชื่อมต่อผ่าน SAN ถูกใช้) อาร์เรย์ดิสก์แสดงค่า IOPS เฉลี่ยประมาณ 15,000 และอัตราการถ่ายโอนข้อมูล (throughput) ประมาณ 5 Gbit/s
ในตารางต่อไปนี้ แสดงค่า IOPS ประมาณสำหรับประเภทดิสก์ต่างๆ:
| Type | IOPS |
| SSD(SLC) | 6000 |
| SSD(MLC) | 1000 |
| 15K RPM | 175-200 |
| 10K RPM | 125-150 |
| 7.2K RPM | 50-75 |
| Raid5 of 6 drives with 10K RPM | 1000 |
ผมพบคำแนะนำบางอย่างสำหรับประสิทธิภาพดิสก์ใน IOPS สำหรับบริการ Microsoft ยอดนิยมบางอย่าง:
- Microsoft Exchange 2010 ด้วย 5,000 ผู้ใช้ แต่ละคนรับ 75 และส่ง 30 อีเมลต่อวัน จะต้องการ IOPS อย่างน้อย 3,750;
- Microsoft SQL 2008 Server ด้วย 3,500 SQL transactions per second (TPS) ต้องการ 28,000 IOPS;
- A common Windows application server สำหรับ 10-100 ผู้ใช้ ต้องการ 10-40 IOPS.