Wenn ich die Leistung von SD-Karten auf zufälliges Schreiben überprüfe, sehe ich, dass die Leistung bei einer Datensatzgröße von 4 KB ziemlich schlecht ist (dies ist nicht überraschend), aber bei mehreren Karten sinkt sie sogar bei größeren Datensatzgrößen, bevor sie zunimmt. Ich habe die zufällige Schreibleistung mit iozone v3.430 gemessen und mehrere Flashkarten verschiedener Hersteller getestet. Dies ist der iozone-Befehl, mit dem ich die Dateigröße von 50 MB gemessen habe:
iozone -RaeI -i 0 -i 1 -i 2 -y 4k -q 1M -s 50m -o -f /tmp/testfile
Dies sind die Ergebnisse mit einer Dateigröße von 50 MB:
Frage: Aus welchem Grund ist die Zufallsschreibleistung bei einer Datensatzgröße von 8, 16, 32, 64 und 128 kB langsamer als bei einer Datensatzgröße von 4 kB?
Peter Brittain schlug vor, mit einer größeren Dateigröße zu testen, daher habe ich es auch mit einer Dateigröße von 500 MB versucht. Das sind die Ergebnisse:
Die Gesamtleistung wurde schlechter, aber das Phänomen tritt immer noch auf.
Partitionen sind an 4-MB-Grenzen ausgerichtet. Das Dateisystem ist ext4 mit einer Blockgröße von 4 kB. Die für die Teststarts verwendete Partition ist 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
Update 1: Es ist klar, dass die Leistung beim zufälligen Schreiben, insbesondere bei kleinen Datensatzgrößen, im Vergleich zum sequentiellen Schreiben erheblich geringer ist. Die Speicherzellen des NAND-Flash-Speichers sind in Seiten und sogenannte Löschblöcke gruppiert. Typische Seitengrößen sind 4, 8 oder 16 kB. Obwohl der Controller einzelne Seiten schreiben kann, können die Daten nicht überschrieben werden, ohne dass sie zuerst gelöscht werden, und ein Löschblock ist die kleinste Einheit, die ein NAND-Flash-Speicher löschen kann. Die Größe des Löschblocks liegt normalerweise zwischen 128 kB und 2 MB. Bei modernen SD-Karten wird eine kleine Anzahl von Löschblöcken zu größeren Einheiten gleicher Größe kombiniert, die als Zuordnungsgruppen oder Zuordnungseinheiten oder Segmente bezeichnet werden. Die übliche Segmentgröße beträgt 4 MB.Jede Schreiboperation auf dem Speicher führt zu einer Lese-Änderungs-Schreiboperation für ein gesamtes Segment. Beispielsweise führt das Schreiben von 4 kB Daten auf eine SD-Karte mit einer Segmentgröße von 4 MB zu einem Schreibverstärkungsfaktor von 1024. Die Controller von SD-Karten implementieren eine Übersetzungsschicht. Für jede E / A-Operation führt die Steuerung eine Übersetzung von einer virtuellen in eine physikalische Adresse durch. Wenn Daten innerhalb eines Segments überschrieben werden sollen, ordnet die Übersetzungsschicht die virtuelle Adresse des Segments einer anderen gelöschten physikalischen Adresse zu. Das alte physische Segment wird als verschmutzt markiert und zum Löschen in die Warteschlange gestellt. Wenn es später gelöscht wird, kann es wiederverwendet werden. Die Controller von SD-Karten zwischenspeichern normalerweise ein einzelnes oder mehrere Segmente, um die Leistung von Zufallsschreibvorgängen zu erhöhen.Wenn auf den SD-Karten ein Root-Dateisystem gespeichert ist, ist es von Vorteil, wenn der Controller der Karte die Segmente zwischenspeichern kann, in denen die Schreibvorgänge ausgeführt werden, die Segmente, in denen die Metadaten für das Dateisystem gespeichert sind, und (falls vorhanden) verfügbar) das Journal des Dateisystems. Folglich hängt die Zufallsschreibleistung einer SD-Karte von der Löschblockgröße, der Segmentgröße und der Anzahl der Segmente ab, die der Controller zwischenspeichert. Dies alles erklärt jedoch nicht, warum die Zufallsschreibleistung mit einer Datensatzgröße von 8, 16, 32, 64 und 128 kB langsamer ist als mit einer Datensatzgröße von 4 kB.
Update 2 (Antwort an myaut): Der Screenshot der Tabelle ist meine eigene Arbeit. Derzeit schreibe ich einen Artikel / eine Arbeit über Cluster von Einplatinencomputern, da diese eine interessante Option für die Bereitstellung von Ressourcen für studentische Projekte und Forscher darstellen. In diesem Zusammenhang untersuchte ich auch die Leistung der CPU, des Speichers und der Netzwerkschnittstelle eines einzelnen Knotens. Ich habe alle getesteten SD-Karten gekauft. Auf einer der Karten habe ich Raspian Wheezy (Version 2014-06-20) installiert (über dd kopiert). Nachdem ich die Netzwerkeinstellungen konfiguriert und einige zusätzliche Pakete (z. B. iozone) installiert hatte, kopierte ich die gesamte SD-Karte auf alle anderen SD-Karten.
Update 3 (Antwort auf Gabriel Southern): Die Ergebnisse stammen aus einzelnen Läufen. Das Verfahren war:
- Legen Sie die Karte in Raspberry Pi Model B ein
- Booten Sie das System
- Einloggen über SSH
- Starten Sie den iozone-Testlauf
- Halten Sie das System an und versuchen Sie es mit einer anderen SD-Karte
Einige der Karten habe ich mehrmals versucht, zu überprüfen. Es gab nur wenig Abwechslung. Das Phänomen tritt die ganze Zeit auf, außer bei zwei Samsung-Karten und einer Verbatim-Karte.
Update 4: Momentan versuche ich, einen Ansprechpartner für ein Unternehmen zu finden, das NAND-Flash-Controller (Samsung, SanDisk, Toshiba ...) herstellt, um dort nach einer konkreten Antwort zu fragen. SanDisk hat ein Forum. Ich bat dort um eine Erklärung. Ich habe auch eine Anfrage an den technischen Support von Kingston geschickt.
Update 5: Die Größe des Löschblocks und der Zuordnungseinheit (Segment) sind nicht für das Phänomen verantwortlich. Getestet habe ich die Löschblockgröße aller SD - Karten mit der pritcsd.py Werkzeug Faust in dem internen Kartenleser eines ThinkPad X240 Notebook und schließlich mit einem Raspberry Pi Modell B. Für alle Karten der Ausgabe lautet: Erase block size of mmcblk0 is 65536 bytes
. Auch die Segmentgröße ist für alle getesteten SD-Karten gleich. Es ist 4 MB. Diese Informationen finden Sie in der Datei /sys/class/mmc_host/mmc0/mmc0*/preferred_erase_size
. Es ist meiner Meinung nach ziemlich außergewöhnlich, dass alle diese Karten die gleiche Löschblockgröße und Segmentgröße haben. In der Zwischenzeit habe ich die Produkt-IDs / Artikelnummern aus den Verpackungen der getesteten Karten entnommen. Hier sind sie.
Update 6: Der technische Support von Kingston hat mir mitgeteilt, dass die Controller der getesteten Kingston-Karten (und höchstwahrscheinlich der anderen Karten) für Dateien mit einer Größe von 4 kB optimiert sind. Die genaue Implementierung des Controllers ist vertraulich. Die Antwort von Kingston ist die beste, die ich bekommen habe. SanDisk hat nie auf meine Support-Anfrage geantwortet und ich konnte keinen Kontakt von Sony, Samsung oder Verbatim finden