เมื่อฉันตรวจสอบประสิทธิภาพการทำงานของการ์ด SD สำหรับการเขียนแบบสุ่มฉันสามารถดูประสิทธิภาพได้ค่อนข้างแย่สำหรับขนาดบันทึก 4 kB (ไม่น่าแปลกใจ) แต่สำหรับการ์ดหลาย ๆ ใบก็จะลดลงสำหรับขนาดบันทึกที่ใหญ่กว่าก่อนที่จะเพิ่มขึ้น ฉันวัดประสิทธิภาพการเขียนแบบสุ่มด้วย iozone v3.430 และทดสอบแฟลชการ์ดหลายรุ่นของผู้ผลิตหลายราย นี่คือคำสั่ง iozone ฉันใช้วัดขนาดไฟล์ 50 MB:
iozone -RaeI -i 0 -i 1 -i 2 -y 4k -q 1M -s 50m -o -f /tmp/testfile
นี่คือผลลัพธ์ที่มีขนาดไฟล์ 50 MB:
คำถาม: อะไรคือสาเหตุที่ประสิทธิภาพการเขียนแบบสุ่มที่มีขนาดเร็กคอร์ดที่ 8, 16, 32, 64 และ 128 kB นั้นช้ากว่าขนาดเรคคอร์ด 4 kB?
Peter Brittain แนะนำให้ทดสอบด้วยขนาดไฟล์ที่ใหญ่กว่าดังนั้นฉันจึงลองด้วยขนาดไฟล์ 500 MB นี่คือผลลัพธ์ที่ได้:
ประสิทธิภาพโดยรวมแย่ลง แต่ปรากฏการณ์ยังคงเกิดขึ้น
พาร์ติชันถูกจัดชิดกับขอบเขต 4 MB ระบบไฟล์ ext4 ที่มีขนาดบล็อก 4 kB พาร์ติชันที่ใช้สำหรับการทดสอบเริ่มต้นคือ mmcblk0p2
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 953.7M 0 loop /mnt/sdb1
mmcblk0 179:0 0 14.9G 0 disk
├─mmcblk0p1 179:1 0 56M 0 part /boot
├─mmcblk0p2 179:2 0 7.8G 0 part /
└─mmcblk0p3 179:3 0 7G 0 part /mnt/mmcblk0p3
$ cat /etc/fstab | grep mmcblk0p2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
$ sudo fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 15.9 GB, 15931539456 bytes
4 heads, 16 sectors/track, 486192 cylinders, total 31116288 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000981cb
Device Boot Start End Blocks Id System
/dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA)
/dev/mmcblk0p2 122880 16506879 8192000 83 Linux
/dev/mmcblk0p3 16506880 31115263 7304192 83 Linux
$ mount | grep ext4 | grep root
/dev/root on / type ext4 (rw,noatime,data=ordered)
# tune2fs -l /dev/mmcblk0p2 | grep Block
Block count: 2048000
Block size: 4096
Blocks per group: 32768
อัปเดต 1:เป็นที่ชัดเจนว่าประสิทธิภาพสำหรับการเขียนแบบสุ่มโดยเฉพาะอย่างยิ่งสำหรับขนาดบันทึกขนาดเล็กนั้นต่ำกว่าอย่างมากเมื่อเทียบกับการเขียนตามลำดับ เซลล์หน่วยความจำของที่จัดเก็บข้อมูลแฟลช NAND ถูกจัดกลุ่มเป็นหน้าต่างๆและที่เรียกว่าบล็อกลบ ขนาดหน้าโดยทั่วไปคือ 4, 8 หรือ 16 kB แม้ว่าตัวควบคุมจะสามารถเขียนหน้าเดียวได้ แต่ข้อมูลไม่สามารถเขียนทับได้โดยไม่ต้องถูกลบออกก่อนและบล็อกการลบเป็นหน่วยที่เล็กที่สุดที่หน่วยความจำแฟลช NAND สามารถลบได้ ขนาดบล็อกการลบโดยทั่วไปอยู่ระหว่าง 128 kB ถึง 2 MB ในการ์ด SD ที่ทันสมัยบล็อกการลบจำนวนเล็กน้อยจะรวมกันเป็นหน่วยที่มีขนาดใหญ่กว่าซึ่งเรียกว่ากลุ่มการจัดสรรหรือหน่วยการจัดสรรหรือเซ็กเมนต์ ขนาดเซ็กเมนต์ปกติคือ 4 MBแต่ละการดำเนินการเขียนบนหน่วยเก็บข้อมูลส่งผลให้เกิดการดำเนินการอ่าน - แก้ไข - เขียนสำหรับกลุ่มทั้งหมด ตัวอย่างเช่นในการ์ด SD ที่มีขนาดเซ็กเมนต์ 4 MB การเขียนข้อมูล 4 kB ไปยังตำแหน่งสุ่มส่งผลให้เกิดปัจจัยการขยายการเขียน 1024 ตัวควบคุมของการ์ด SD ใช้เลเยอร์การแปล สำหรับการดำเนินการ I / O ใด ๆ การแปลจากที่อยู่เสมือนไปยังที่อยู่ทางกายภาพจะดำเนินการโดยผู้ควบคุม หากข้อมูลภายในส่วนใดส่วนหนึ่งจะถูกเขียนทับชั้นการแปลจะทำการแมปที่อยู่เสมือนของส่วนนั้นไปยังที่อยู่ทางกายภาพอื่นที่ถูกลบ ส่วนทางกายภาพเก่าถูกทำเครื่องหมายว่าสกปรกและอยู่ในคิวเพื่อทำการลบ หลังจากนั้นเมื่อถูกลบจะสามารถนำกลับมาใช้ใหม่ได้ ตัวควบคุมของการ์ด SD มักจะแคชกลุ่มเดียวหรือหลายส่วนเพื่อเพิ่มประสิทธิภาพของการดำเนินการเขียนแบบสุ่มหากการ์ด SD จัดเก็บระบบไฟล์รูทจะเป็นประโยชน์ถ้าคอนโทรลเลอร์ของการ์ดสามารถแคชส่วนที่มีการดำเนินการเขียนส่วนที่เก็บเมตาดาต้าสำหรับระบบไฟล์และ (ถ้า ว่าง) เจอร์นัลของระบบไฟล์ ดังนั้นประสิทธิภาพการเขียนแบบสุ่มของการ์ด SD ขึ้นอยู่กับขนาดบล็อกลบขนาดเซกเมนต์และจำนวนเซกเมนต์แคชควบคุม แต่ทั้งหมดนี้ไม่ได้อธิบายว่าทำไมประสิทธิภาพการเขียนแบบสุ่มที่มีขนาดเร็กคอร์ดที่ 8, 16, 32, 64 และ 128 kB นั้นช้ากว่าเช่นเดียวกับขนาดบันทึก 4 kB
อัปเดต 2 (ตอบกลับ myaut):ภาพหน้าจอของตารางเป็นงานของฉันเอง ปัจจุบันฉันเขียนบทความ / บทความเกี่ยวกับกลุ่มคอมพิวเตอร์บอร์ดเดียวเพราะเป็นตัวเลือกที่น่าสนใจสำหรับการจัดหาทรัพยากรให้กับโครงการนักศึกษาและนักวิจัย ในบริบทนี้ฉันยังตรวจสอบประสิทธิภาพของ CPU ที่เก็บข้อมูลและอินเทอร์เฟซเครือข่ายของโหนดเดียว ฉันซื้อการ์ด SD ที่ผ่านการทดสอบทั้งหมดแล้ว ในหนึ่งในการ์ดที่ฉันติดตั้ง (คัดลอกผ่าน dd) Raspian Wheezy (เวอร์ชั่น 2014-06-20) หลังจากที่ฉันกำหนดการตั้งค่าเครือข่ายและติดตั้งแพ็คเกจเพิ่มเติม (เช่น iozone) ฉันก็อปปี้การ์ด SD ทั้งหมดไปยังการ์ด SD อื่น ๆ ทั้งหมด
อัปเดต 3 (คำตอบสำหรับ Gabriel Southern):ผลลัพธ์มาจากการวิ่งครั้งเดียว ขั้นตอนคือ:
- ใส่การ์ดลงใน Raspberry Pi รุ่น B
- บูตระบบ
- เข้าสู่ระบบผ่าน SSH
- เริ่มการทดสอบการทำงานของ iozone
- หยุดระบบและลองใช้การ์ด SD อื่น
การ์ดบางอันฉันลองหลายครั้งเพื่อตรวจสอบอีกครั้ง มีการเปลี่ยนแปลงเพียงเล็กน้อย ปรากฏการณ์นี้เกิดขึ้นตลอดเวลายกเว้นการ์ด Samsung สองการ์ดและการ์ด Verbatim หนึ่งใบ
อัปเดต 4:ในขณะนี้ฉันพยายามค้นหาผู้ติดต่อกับ บริษัท ที่ผลิตตัวควบคุมแฟลช NAND (Samsung, SanDisk, Toshiba ... ) เพื่อขอคำตอบที่ชัดเจน SanDisk มีฟอรัม ฉันขอคำอธิบายที่นั่น ฉันยังส่งคำขอไปยังฝ่ายสนับสนุนด้านเทคนิคของ Kingston
อัปเดต 5:ขนาดบล็อกลบและขนาดการจัดสรร (เซ็กเมนต์) จะไม่รับผิดชอบต่อปรากฏการณ์ ผมทดสอบขนาดลบบล็อกของ SD การ์ดทั้งหมดที่มีpritcsd.pyกำปั้นเครื่องมือในเครื่องอ่านบัตรภายในของโน้ตบุ๊ค ThinkPad x240 และสุดท้ายกับราสเบอร์รี่ Pi Erase block size of mmcblk0 is 65536 bytes
รุ่นบีสำหรับบัตรทั้งหมดผลลัพธ์คือ: ขนาดเซกเมนต์จะเท่ากันสำหรับการ์ด SD ที่ทดสอบแล้วทั้งหมด มันคือ 4 MB ข้อมูลนี้สามารถพบได้ในไฟล์ /sys/class/mmc_host/mmc0/mmc0*/preferred_erase_size
มันค่อนข้างพิเศษในความคิดของฉันว่าการ์ดเหล่านี้มีขนาดบล็อกลบและขนาดเซ็กเมนต์เดียวกัน ในระหว่างนี้ฉันได้รวบรวม ID ผลิตภัณฑ์ / หมายเลขรายการจากหีบห่อของการ์ดทดสอบ พวกเขาอยู่ที่นี่
อัปเดต 6:การสนับสนุนทางเทคนิคของ KINGSTON เขียนถึงฉันว่าคอนโทรลเลอร์ของการ์ด KINGSTON ที่ทดสอบแล้ว (และการ์ดอื่น ๆ ส่วนใหญ่น่าจะเหมาะ) สำหรับไฟล์ขนาด 4 kB การใช้คอนโทรลเลอร์ที่แน่นอนนั้นเป็นความลับ คำตอบจาก Kingston คือคำตอบที่ดีที่สุดที่ฉันได้รับ SanDisk ไม่ตอบสนองต่อคำร้องขอการสนับสนุนของฉันและฉันไม่พบผู้ติดต่อจาก Sony, Samsung หรือ Verbatim