วิธีตรวจสอบประสิทธิภาพของฮาร์ดไดรฟ์ (ผ่านเทอร์มินัลหรือ GUI) ความเร็วในการเขียน ความเร็วในการอ่าน ขนาดแคชและความเร็ว ความเร็วแบบสุ่ม
วิธีตรวจสอบประสิทธิภาพของฮาร์ดไดรฟ์ (ผ่านเทอร์มินัลหรือ GUI) ความเร็วในการเขียน ความเร็วในการอ่าน ขนาดแคชและความเร็ว ความเร็วแบบสุ่ม
คำตอบ:
hdparm
เป็นจุดเริ่มต้นที่ดี
sudo hdparm -Tt /dev/sda
/dev/sda:
Timing cached reads: 12540 MB in 2.00 seconds = 6277.67 MB/sec
Timing buffered disk reads: 234 MB in 3.00 seconds = 77.98 MB/sec
sudo hdparm -v /dev/sda
จะให้ข้อมูลเช่นกัน
dd
จะให้ข้อมูลเกี่ยวกับความเร็วในการเขียน
หากไดรฟ์ไม่ได้มีระบบไฟล์ (และเพียงแล้ว ) of=/dev/sda
การใช้งาน
มิฉะนั้นให้ติดตั้งบน / tmp แล้วเขียนจากนั้นลบไฟล์เอาต์พุตทดสอบ
dd if=/dev/zero of=/tmp/output bs=8k count=10k; rm -f /tmp/output
10240+0 records in
10240+0 records out
83886080 bytes (84 MB) copied, 1.08009 s, 77.7 MB/s
gnome-disks
มีอะไรมากกว่าที่คุณต้องการ
/dev/urandom
เช่นเดียวกับ/dev/zero
อินพุตdd
เมื่อทำการทดสอบ SSD เนื่องจากความสามารถในการบีบอัดข้อมูลอาจมีผลอย่างมากต่อความเร็วในการเขียน
/tmp
ระบบแฟ้มมักจะใช้ ramdisk วันนี้ ดังนั้นการเขียนถึง/tmp
ดูเหมือนจะเป็นการทดสอบหน่วยความจำของคุณไม่ใช่ระบบย่อยดิสก์ของคุณ
Suominen นั้นถูกต้องเราควรใช้การซิงค์บางชนิด แต่มีวิธีที่ง่ายกว่า conv = fdatasync จะทำงาน:
dd if=/dev/zero of=/tmp/output conv=fdatasync bs=384k count=1k; rm -f /tmp/output
1024+0records in
1024+0 records out
402653184 bytes (403 MB) copied, 3.19232 s, 126 MB/s
ฉันจะไม่แนะนำให้ใช้/dev/urandom
เพราะเป็นซอฟต์แวร์ที่ใช้และช้าเหมือนหมู ดีกว่าที่จะรับข้อมูลแบบสุ่มบน ramdisk ในการทดสอบฮาร์ดดิสก์แบบสุ่มนั้นไม่สำคัญเพราะทุก ๆ ไบต์จะเขียนตามที่เป็นอยู่ (เช่นกันใน ssd กับ dd) แต่ถ้าเราทดสอบพูล zfs ที่มีค่าศูนย์บริสุทธิ์หรือข้อมูลสุ่มมีความแตกต่างด้านประสิทธิภาพอย่างมาก
มุมมองอื่นจะต้องมีการรวมเวลาซิงค์; ระบบไฟล์ที่ทันสมัยทั้งหมดใช้การแคชกับการทำงานของไฟล์
ในการวัดความเร็วดิสก์และไม่ใช่หน่วยความจำเราต้องซิงค์ระบบไฟล์เพื่อกำจัดเอฟเฟกต์แคช สามารถทำได้อย่างง่ายดายโดย:
time sh -c "dd if=/dev/zero of=testfile bs=100k count=1k && sync"
ด้วยวิธีการที่คุณได้รับผลลัพธ์:
sync ; time sh -c "dd if=/dev/zero of=testfile bs=100k count=1k && sync" ; rm testfile
1024+0 records in
1024+0 records out
104857600 bytes (105 MB) copied, 0.270684 s, 387 MB/s
real 0m0.441s
user 0m0.004s
sys 0m0.124s
ดังนั้นดิสก์ datarate มีเพียง 104857600 / 0.441 = 237772335 B / s -> 237MB / s
ที่ต่ำกว่า 100MB / s ต่ำกว่าการแคช
การเปรียบเทียบที่มีความสุข
หากคุณต้องการตรวจสอบดิสก์อ่านและเขียนความเร็วแบบเรียลไทม์คุณสามารถใช้เครื่องมือไอโซโทป
สิ่งนี้มีประโยชน์ในการรับข้อมูลที่แน่นอนเกี่ยวกับการทำงานของดิสก์สำหรับแอพพลิเคชั่นหรืองานเฉพาะ ผลลัพธ์จะแสดงความเร็วในการอ่าน / เขียนต่อกระบวนการและความเร็วในการอ่าน / เขียนรวมสำหรับเซิร์ฟเวอร์นั้นใกล้เคียงกันtop
มาก
ในการติดตั้ง iotop:
sudo apt-get install iotop
วิธีเรียกใช้:
sudo iotop
fio
หากคุณต้องการความถูกต้องคุณควรใช้ มันต้องอ่านคู่มือ ( man fio
) แต่มันจะให้ผลลัพธ์ที่ถูกต้อง โปรดทราบว่าเพื่อความแม่นยำคุณต้องระบุสิ่งที่คุณต้องการวัด ตัวอย่างบางส่วน:
ความเร็วในการอ่านตามลำดับพร้อมบล็อกขนาดใหญ่ (ควรใกล้กับหมายเลขที่คุณเห็นในข้อมูลจำเพาะสำหรับไดรฟ์ของคุณ):
fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=read --size=500m --io_size=10g --blocksize=1024k --ioengine=libaio --fsync=10000 --iodepth=32 --direct=1 --numjobs=1 --runtime=60 --group_reporting
ความเร็วในการเขียนลำดับต่อเนื่องกับบล็อกขนาดใหญ่ (ควรใกล้กับหมายเลขที่คุณเห็นในข้อมูลจำเพาะสำหรับไดรฟ์ของคุณ):
fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=write --size=500m --io_size=10g --blocksize=1024k --ioengine=libaio --fsync=10000 --iodepth=32 --direct=1 --numjobs=1 --runtime=60 --group_reporting
สุ่ม 4K อ่าน QD1 (นี่คือจำนวนที่สำคัญสำหรับประสิทธิภาพการทำงานในโลกแห่งความเป็นจริงเว้นแต่คุณจะรู้ดีกว่าอย่างแน่นอน):
fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=randread --size=500m --io_size=10g --blocksize=4k --ioengine=libaio --fsync=1 --iodepth=1 --direct=1 --numjobs=1 --runtime=60 --group_reporting
ผสมสุ่ม 4K อ่านและเขียน QD1 ด้วยการซิงค์ (นี่คือหมายเลขกรณีที่แย่ที่สุดที่คุณควรคาดหวังจากไดรฟ์ของคุณโดยปกติแล้วจะน้อยกว่า 1% ของตัวเลขที่แสดงในแผ่นข้อมูลจำเพาะ):
fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=randrw --size=500m --io_size=10g --blocksize=4k --ioengine=libaio --fsync=1 --iodepth=1 --direct=1 --numjobs=1 --runtime=60 --group_reporting
เพิ่ม--size
อาร์กิวเมนต์เพื่อเพิ่มขนาดไฟล์ การใช้ไฟล์ขนาดใหญ่อาจลดจำนวนที่คุณได้รับโดยขึ้นอยู่กับเทคโนโลยีของไดรฟ์และเฟิร์มแวร์ ไฟล์ขนาดเล็กจะให้ผลลัพธ์ "ดีเกินไป" สำหรับสื่อการหมุนได้เนื่องจากหัวอ่านไม่จำเป็นต้องเคลื่อนย้ายสิ่งนั้นมากนัก หากอุปกรณ์ของคุณใกล้จะว่างเปล่าการใช้ไฟล์ที่ใหญ่พอที่จะเติมไดรฟ์จนเต็มจะทำให้คุณได้รับพฤติกรรมที่แย่ที่สุดสำหรับการทดสอบแต่ละครั้ง ในกรณีของ SSD ขนาดไฟล์ไม่สำคัญเท่าไหร่
อย่างไรก็ตามโปรดทราบว่าสำหรับสื่อเก็บข้อมูลบางขนาดของไฟล์นั้นไม่สำคัญเท่ากับจำนวนไบต์ทั้งหมดที่เขียนในช่วงเวลาสั้น ๆ ตัวอย่างเช่น SSD บางตัวอาจมีประสิทธิภาพเร็วขึ้นอย่างมีนัยสำคัญเมื่อมีบล็อกที่ถูกลบล่วงหน้าหรืออาจมีพื้นที่แฟลช SLC ขนาดเล็กที่ใช้เป็นแคชการเขียนและการเปลี่ยนแปลงประสิทธิภาพเมื่อแคช SLC เต็ม เป็นอีกตัวอย่างหนึ่ง Seagate SMR HDD มีพื้นที่แคช PMR ประมาณ 20 GB ซึ่งมีประสิทธิภาพสูง แต่เมื่อเต็มแล้วการเขียนโดยตรงไปยังพื้นที่ SMR อาจลดประสิทธิภาพลง 10% จากต้นฉบับ และวิธีเดียวที่จะเห็นการลดลงของประสิทธิภาพนี้คือการเขียน 20+ GB ให้เร็วที่สุดเท่าที่จะทำได้ แน่นอนว่าทั้งหมดนี้ขึ้นอยู่กับปริมาณงานของคุณ: หากการเข้าถึงการเขียนของคุณเต็มไปด้วยความล่าช้าที่ยาวนานซึ่งทำให้อุปกรณ์ล้างแคชภายใน ลำดับการทดสอบที่สั้นกว่าจะสะท้อนให้เห็นถึงประสิทธิภาพที่แท้จริงของคุณดีขึ้น หากคุณต้องการทำ IO จำนวนมากคุณต้องเพิ่มทั้งสองอย่าง--io_size
และ--runtime
พารามิเตอร์ โปรดทราบว่าสื่อบางประเภท (เช่นอุปกรณ์แฟลชส่วนใหญ่) จะได้รับการสึกหรอเพิ่มเติมจากการทดสอบดังกล่าว ในความคิดของฉันหากอุปกรณ์ใดไม่ดีพอที่จะไม่ทำการทดสอบชนิดนี้มันไม่ควรใช้เพื่อเก็บข้อมูลที่มีค่าในกรณีใด ๆ
นอกจากนี้อุปกรณ์ SSD คุณภาพสูงบางรุ่นอาจมีอัลกอริธึมการปรับระดับการสึกหรอที่ชาญฉลาดยิ่งขึ้นซึ่งแคช SLC ภายในมีสมาร์ทเพียงพอที่จะแทนที่ข้อมูลในสถานที่ที่ถูกเขียนใหม่ในระหว่างการทดสอบ มีขนาดเล็กกว่าแคช SLC ทั้งหมด) สำหรับอุปกรณ์ดังกล่าวขนาดไฟล์จะเริ่มมีความสำคัญอีกครั้ง หากคุณต้องการปริมาณงานจริงของคุณควรทดสอบด้วยขนาดไฟล์ที่คุณเห็นในชีวิตจริง มิฉะนั้นตัวเลขของคุณอาจดูดีเกินไป
โปรดทราบว่าfio
จะสร้างไฟล์ชั่วคราวที่จำเป็นในการเรียกใช้ครั้งแรก มันจะเต็มไปด้วยข้อมูลแบบสุ่มเพื่อหลีกเลี่ยงการรับตัวเลขที่ดีเกินไปจากอุปกรณ์ที่โกงโดยการบีบอัดข้อมูลก่อนที่จะเขียนลงในที่เก็บข้อมูลถาวร ไฟล์ชั่วคราวจะถูกเรียกfio-tempfile.dat
ในตัวอย่างข้างต้นและเก็บไว้ในไดเรกทอรีการทำงานปัจจุบัน ดังนั้นคุณควรเปลี่ยนเป็นไดเรกทอรีที่ติดตั้งบนอุปกรณ์ที่คุณต้องการทดสอบก่อน
หากคุณมี SSD ที่ดีและต้องการที่จะเห็นตัวเลขที่สูงยิ่งขึ้นเพิ่มขึ้น--numjobs
ดังกล่าวข้างต้น ที่กำหนดภาวะพร้อมกันสำหรับการอ่านและการเขียน ตัวอย่างข้างต้นทั้งหมดได้numjobs
ตั้งค่าไว้เพื่อ1
ให้การทดสอบเกี่ยวกับการอ่านและการเขียนกระบวนการเธรดเดี่ยว (อาจเป็นไปได้กับชุดคิวด้วยiodepth
) SSD ระดับไฮเอนด์ (เช่น Intel Optane) ควรได้รับตัวเลขสูงแม้จะไม่เพิ่มขึ้นnumjobs
มาก (เช่น4
ควรจะเพียงพอที่จะได้รับข้อมูลจำเพาะสูงสุด) แต่ SSD "Enterprise" บางตัวต้องการไป32
- 128
เพื่อรับข้อมูลจำเพาะเนื่องจากเวลาแฝงภายในของสิ่งเหล่านั้น อุปกรณ์สูงกว่า แต่ปริมาณงานโดยรวมนั้นไม่ได้บ้า
max_sectors_kb
คุ้มค่าที่น้อยกว่า ฉันเปลี่ยนคำสั่งตัวอย่างข้างต้นเพื่อใช้ขนาดบล็อก 1 MB เพราะดูเหมือนว่าจะทำงานกับฮาร์ดแวร์ในโลกแห่งความจริง และฉันยังทดสอบว่าfsync
ไม่สำคัญสำหรับการอ่าน
iodepth
เพื่อ1
สำหรับการเข้าถึงแบบสุ่มว่าเพราะโปรแกรมโลกแห่งความจริงมักจะใช้อัลกอริทึม / ตรรกะที่ไม่ได้ทำงานที่มีความลึกใด ๆ ที่สูงกว่า 1. เป็นผลให้ถ้าความลึกดังกล่าวเป็น "ต่ำเกินไป" อุปกรณ์ I / O ของคุณไม่ดี เป็นความจริงที่อุปกรณ์ SSD บางตัวจะได้รับประโยชน์จากความลึกที่สูงกว่า 32 อย่างไรก็ตามคุณสามารถชี้ไปที่ปริมาณงานในโลกแห่งความเป็นจริงที่ต้องมีการเข้าถึงการอ่านและสามารถรักษา iodepth ได้สูงกว่า 32 หรือไม่? TL; DR: ถ้าคุณต้องการทำซ้ำหมายเลขอ้างอิงการอ่านสูงอย่างไม่น่าเชื่อด้วยอุปกรณ์ latency สูงให้ใช้iodepth=256 --numjobs=4
แต่อย่าคาดหวังว่าจะเห็นตัวเลขดังกล่าวเป็นของจริง
bonnie ++ เป็นเครื่องมือวัดประสิทธิภาพสูงสุดที่ฉันรู้จักสำหรับ linux
(ขณะนี้ฉันกำลังเตรียมลินุกซ์ livecd ที่ทำงานกับ bonnie ++ เพื่อทดสอบเครื่องที่ใช้ windows ของเราด้วย!)
มันจะดูแลแคช, ซิงค์, ข้อมูลแบบสุ่ม, ตำแหน่งสุ่มบนดิสก์, การอัพเดตขนาดเล็ก, การอัพเดตขนาดใหญ่, การอ่าน, การเขียนและอื่น ๆ เปรียบเทียบกับ usbkey, harddisk (rotary), solid-state drive และ ram-based ระบบไฟล์สามารถให้ข้อมูลมากสำหรับมือใหม่
ฉันไม่รู้ว่ามันรวมอยู่ใน Ubuntu แต่คุณสามารถรวบรวมจากแหล่งที่มาได้อย่างง่ายดาย
ความเร็วในการเขียน
$ dd if=/dev/zero of=./largefile bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 4.82364 s, 223 MB/s
ขนาดบล็อกจริง ๆ แล้วค่อนข้างใหญ่ คุณสามารถลองด้วยขนาดที่เล็กกว่าเช่น 64k หรือ 4k
ความเร็วในการอ่าน
เรียกใช้คำสั่งต่อไปนี้เพื่อล้างแคชหน่วยความจำ
$ sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"
ตอนนี้อ่านไฟล์ที่สร้างขึ้นในการทดสอบการเขียน:
$ dd if=./largefile of=/dev/null bs=4k
165118+0 records in
165118+0 records out
676323328 bytes (676 MB) copied, 3.0114 s, 225 MB/s
คำแนะนำในการใช้ bonnie ++
bonnie++ -d [TEST_LOCATION] -s [TEST_SIZE] -n 0 -m [TEST_NAME] -f -b -u [TEST_USER]
bonnie++ -d /tmp -s 4G -n 0 -m TEST -f -b -u james
บิตเพิ่มเติมได้ที่: SIMPLE BONNIE ++ ตัวอย่าง
ตรวจสอบความสมบูรณ์ตรวจจับแฟลชไดรฟ์ปลอมและทดสอบประสิทธิภาพทั้งสามในภาพเดียว
เพิ่มเติมเกี่ยวกับคำตอบนี้