ภาพรวม
บทความนี้จะอภิปรายวิธีตรวจสอบประสิทธิภาพของดิสก์หรืออาร์เรย์สตอเรจใน Linux IOPS (input/output operations per second) คือจำนวนการดำเนินการอินพุต/เอาต์พุตที่ระบบจัดเก็บข้อมูลทำได้ต่อวินาที (อาจเป็นดิสก์เดี่ยว อาร์เรย์ RAID หรือ LUN ในอุปกรณ์สตอเรจภายนอก) โดยทั่วไป IOPS หมายถึงจำนวนบล็อกที่สามารถอ่านหรือเขียนได้จากสื่อจัดเก็บ
ผู้ผลิตดิสก์ส่วนใหญ่ระบุค่า IOPS ตาม名義 แต่จริงๆ แล้วไม่ได้รับประกัน เพื่อเข้าใจประสิทธิภาพระบบสตอเรจของคุณก่อนเริ่มโครงการ ควรหาค่า IOPS สูงสุดที่สตอเรจของคุณรับมือได้
การใช้เครื่องมือ FIO (Flexible I/O) สำหรับการวัดประสิทธิภาพสตอเรจ
เพื่อวัดประสิทธิภาพ IOPS ของดิสก์ใน Linux สามารถใช้ fio (มีในที่เก็บ EPEL สำหรับ CentOS/RHEL) ติดตั้ง fio ใน RHEL หรือ CentOS โดยใช้ yum (dnf):
# yum install epel-release -y
# yum install fio -y
หรือ apt-get ใน Debian หรือ Ubuntu:
# apt-get install fio

จากนั้นระบุดิสก์ที่จะทดสอบ การทดสอบทำโดยการดำเนินการอ่าน/เขียนในไดเรกทอรีที่ดิสก์หรือ LUN ถูกแม้าท์
ลองทำการทดสอบประสิทธิภาพ IOPS ของดิสก์ในสถานการณ์โหลดดิสก์ต่างๆ (เลือกโหมดทดสอบตามตรรกะแอปที่โฮสต์และโครงสร้างพื้นฐานของโครงการ)
การทดสอบการดำเนินการอ่าน/เขียนแบบสุ่ม
เมื่อรันการทดสอบ จะสร้างไฟล์ 8 GB แล้ว fio จะอ่าน/เขียนบล็อก 4KB (ขนาดบล็อกมาตรฐาน) ด้วยอัตราส่วน 75/25% ตามจำนวนการดำเนินการอ่านและเขียน และวัดประสิทธิภาพ คำสั่งดังนี้:
# fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=testfio --bs=4k --iodepth=64 --size=8G --readwrite=randrw --rwmixread=75
ผมรันการทดสอบครั้งแรกบนอาร์เรย์ที่ประกอบด้วย SSD สองตัว และได้ผลลัพธ์ที่ดี:
- อ่าน: 3280MiB/s, IOPS เฉลี่ย 83000
- เขียน: 110MiB/s, IOPS เฉลี่ย 28000
เนื่องจากเรารันการทดสอบอ่าน/เขียนรวม ค่าสำหรับการทดสอบแยกจะสูงกว่า
เปรียบเทียบ ผมวัดประสิทธิภาพบนดิสก์ SATA:

- อ่าน: IOPS=430, BW=1.7 MiB/s
- เขียน: IOPS=143, BW=0.6 MiB/s
แน่นอน ผลลัพธ์ HDD แย่กว่า SSD
การทดสอบการดำเนินการอ่านแบบสุ่ม
เพื่อวัดประสิทธิภาพดิสก์สำหรับการอ่านแบบสุ่มอย่างเดียว ให้รันคำสั่ง:
# fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=testfio --bs=4k --iodepth=64 --size=8G --readwrite=randread
ส่วนท้ายของคำสั่งเปลี่ยนเป็น --readwrite=randread

เช่นที่กล่าวไว้ ประสิทธิภาพอ่าน/เขียนจะสูงกว่าถ้าวัดแยกกัน:
READ: IOPS=150k, BW=584MiB/s (612MB/s)
การทดสอบการดำเนินการเขียนแบบสุ่ม
เพื่อวัดประสิทธิภาพดิสก์สำหรับการเขียนแบบสุ่ม ให้รันคำสั่ง:
# fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=fiotest --bs=4k --iodepth=64 --size=8G --readwrite=randwrite
WRITE: IOPS=84.7k, BW=331MiB/s (347MB/s)
ประสิทธิภาพการเขียนบน SSD ที่ดีก็สูงมาก เช่นเดียวกับการทดสอบอ่าน ความแตกต่างเทียบกับการทดสอบผสมถึง 200-250 MiB/s และ 50000 IOPS
หากอ้างอิงเอกสารผู้ผลิตทางการ (เป็น Intel SSDs) สามารถกล่าวได้ว่าค่าเหล่านี้เป็นจริง
ตัวอย่างไฟล์กำหนดค่า Fio
Fio อนุญาตให้ตรวจสอบประสิทธิภาพดิสก์ด้วยคำสั่งโต้ตอบและด้วยไฟล์กำหนดค่าที่เตรียมไว้ล่วงหน้า เพื่อใช้ตัวเลือกนี้ ให้สร้างไฟล์:
# nano read.fio
และเพิ่มเนื้อหาต่อไปนี้:
[global] rw=randread size=8G filename=/tmp/testfio ioengine=libaio iodepth=4 invalidate=1 direct=1 [bgread] rw=randread iodepth=64
จากนั้นเริ่มการทดสอบ:
# fio read.fio
การทดสอบจะวัดประสิทธิภาพการอ่านของดิสก์ เพื่อทดสอบประสิทธิภาพการเขียน ใช้ไฟล์กำหนดค่าต่อไปนี้:
[global] rw=randwrite size=8G filename=/tmp/testfio ioengine=libaio iodepth=4 invalidate=1 direct=1 [bgwrite] rw=randwrite iodepth=64
การวัด Latency ของดิสก์ด้วย Ioping
นอกจาก IOPS แล้ว ยังมีพารามิเตอร์สำคัญอีกอย่างที่บ่งชี้คุณภาพสตอเรจคือ latency Latency คือความล่าช้าของคำขออินพุต/เอาต์พุตที่กำหนดเวลาในการเข้าถึงสตอเรจ (วัดเป็นมิลลิวินาที) ยิ่ง latency สูง แอปของคุณต้องรอนานเท่านั้นจึงจะได้ข้อมูลจากดิสก์ ค่า latency เกิน 20 ms สำหรับระบบจัดเก็บข้อมูลทั่วไปถือว่าแย่
เพื่อตรวจสอบ latency ของดิสก์ใน Linux ใช้เครื่องมือ ioping:
# yum install ioping -y
# apt-get install ioping
รันการทดสอบ latency สำหรับดิสก์ของคุณ (รัน 20 คำขอ):
# ioping -c 20 /tmp/
4 KiB <<< /tmp/ (ext4 /dev/md126p5): request=1 time=1.55 ms (warmup) ...................... 4 KiB <<< /tmp/ (ext4 /dev/md126p5): request=19 time=176.3 us (fast) 4 KiB <<< /tmp/ (ext4 /dev/md126p5): request=20 time=356.9 us --- /tmp/ (ext4 /dev/md126p5) ioping statistics --- 19 requests completed in 5.67 ms, 76 KiB read, 3.35 k iops, 13.1 MiB/s generated 20 requests in 19.0 s, 80 KiB, 1 iops, 4.21 KiB/s min/avg/max/mdev = 176.3 us / 298.7 us / 368.9 us / 45.7 us
ค่าเฉลี่ยคือ 298.7 us (ไมโครวินาที) ดังนั้น latency เฉลี่ยในกรณีนี้คือ 0.3 ms ซึ่งดีเยี่ยม
ค่า latency สามารถระบุเป็น us (ไมโครวินาที) หรือ ms (มิลลิวินาที) เพื่อแปลงจาก us เป็น ms ให้หารด้วย 1,000
ดังนั้น คุณสามารถทดสอบโหลดสตอเรจบนเซิร์ฟเวอร์ก่อนเปิดตัวโครงการและตรวจสอบค่าประสิทธิภาพสูงสุด อย่างไรก็ตาม การทดสอบไม่รับประกันว่าอาร์เรย์ดิสก์หรือดิสก์จะแสดงประสิทธิภาพเดียวกันตลอดเวลา แต่คุ้มค่าที่จะทดสอบในขั้นตอนเริ่มต้นของโครงการ เรียนรู้วิธีทดสอบ IOPS ใน Windows ได้จากบทความนี้