Warum fällt die zufällige Schreibleistung der SD-Karte für die Datensatzgröße 8-128 kB unter die Leistung der Datensatzgröße 4 kB ab?

15

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:

Leistungseinbußen bei SD-Karten für zufälliges Schreiben beim Testen mit iozone und 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:

Leistungseinbußen bei SD-Karten für zufälliges Schreiben beim Testen mit iozone und einer Dateigröße von 500 MB

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:

  1. Legen Sie die Karte in Raspberry Pi Model B ein
  2. Booten Sie das System
  3. Einloggen über SSH
  4. Starten Sie den iozone-Testlauf
  5. 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.

Produkt-IDs / Artikelnummern aus den Verpackungen der getesteten Karten

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

Nimmerland
quelle
1
Das ist eine interessante Frage. Wurden die von Ihnen gemeldeten Ergebnisse über mehrere Läufe oder nur über einen einzelnen Lauf gemittelt? Ich wäre gespannt, wie unterschiedlich die Ergebnisse sind.
1
Als Ergebnis der logischen Neuzuordnung und des Abnutzungsgradabgleichs ergibt diese Behauptung in der Frage "Beispielsweise auf einer SD-Karte mit einer Segmentgröße von 4 MB führt das Schreiben von 4 kB Daten an zufälligen Stellen zu einem Schreibverstärkungsfaktor von 1024." ist falsch.
Ben Voigt
1
Nach meiner Erfahrung beim Testen der Leistung haben Sie bei Tests in kleinerem Maßstab alle möglichen Optimierungen und Caches getroffen. Insbesondere könnte ich glauben, dass Hersteller mit langsamerem Flash diese Optimierungen benötigen würden, um Dateisystemaktualisierungen effizient zu handhaben, aber dies kann nicht bewiesen werden, da für alle Controller keine öffentliche Dokumentation vorliegt. Ich stelle jedoch fest, dass Sie nur eine 50-MB-Datei verwenden. Haben Sie versucht, viel größeren Dateien (gemäß den "Ausführungsregeln" in iozone.org/docs/IOzone_msword_98.pdf ) entgegenzuwirken?
1
Unter der Annahme, dass Sie keinen Unterschied feststellen, habe ich nach weiteren Daten zu diesem Thema gesucht. Es sieht so aus, als hätte Linaro org ähnliche Untersuchungen durchgeführt . Insbesondere der besonders große SLC-Cache kann Ihre sehr schnellen Ergebnisse erklären. Und die FAT32-Optimierungen würden speziell auf kleine Schreibvorgänge abzielen.
1
Ja - ich habe dieses Problem bereits auf der Seite entdeckt ... Ich denke, dass Ihnen beim FAT32 etwas fehlt: Die Karten sind "für die Zugriffsmuster optimiert, die bei FAT32 beobachtet werden" und nicht nur für FAT32. Ein typisches Zugriffsmuster für FAT besteht darin, eine neue Datei zu schreiben. Dazu müssen die Dateidaten gestreamt und ein FAT-Update durchgeführt werden. Das FAT-Update wird normalerweise eine kleine Anzahl von Blöcken umfassen. Wenn ich eine FTL schreibe, möchte ich daher alle Schreibvorgänge optimieren, die kleiner als meine Seitengröße sind, um die FAT-Leistung zu verbessern.

Antworten:

4

Struktur der SD-Kartenzellen:

In der Festkörperelektronik ist eine Zelle ein Speicherelement, das ein oder mehrere Informationsbits speichern kann, wobei die Anzahl der Bits pro Zelle von der verwendeten Technologie abhängt. (SLC / MLC / DC)

Hersteller verwenden unterschiedliche Technologien im Flash-Speicher, um die Struktur zu verwalten. Die am häufigsten verwendeten Strukturen sind TLC und MLC, da diese Technologien, insbesondere TLC, kostengünstiger sind.

Diese technischen Informationen sind für SD-Karten und USB-Sticks nur schwer erhältlich. Die Hersteller haben dies in Bezug auf andere Flash-ähnliche Technologien als SSD entschieden, bei denen diese Informationen fast immer bereitgestellt werden.

Dies hat direkten Einfluss auf die Lebensdauer der Hardware, aber auch auf die Geschwindigkeit.

SLC, Single Level Cell (1 Bit)

Generally 100000 write erase cycles
Erase time: 1-2.5ms

MLC, Multilevel Cell (2 oder mehr Bits)

Anywhere from 3000 to 15000 write erase cycles
Erase time: 2.5-3.5ms

DC, Triple Level Cell (3 Bits)

Anywhere from 1000 to 5000 write/erase cycles
Erase time: 4-5ms

Hinweis :

Da die Zellen in einigen Fällen 1, 2 oder 3 Bits enthalten können, muss Ihr SD-Karten-Controller-Chip abhängig von der Datensatzgröße und der Zellenkapazität mehr Zugriffszyklen ausführen.

Ihre Samsung-Karten verwenden wahrscheinlich eine SLC-Technologie oder sie verfügen über einen leistungsstarken Controller-Chip.

Anmerkung 2 :

Ich habe einige Tests wie Sie mit Partitionen Ext4 Blockgröße 4 KB und 1 KB, aber ohne großen Unterschied versucht

intika
quelle
Die Samsung-Karten und die Verbatim-Karte sind Verbraucherprodukte, und in den letzten Jahren war der SLC-Speicher in solchen Geräten nicht üblich. Die Samsung-Karten sind MB-MP16D und MB-MS16D und die wörtliche Karte ist die Artikelnummer 44007 .
Neverland
Möglicherweise sind die Spezifikationen einiger Controller verfügbar. Ich kann die SD-Karten öffnen und überprüfen, welche Controller diese Karten enthalten, aber ich kann die microSD-Karten nicht öffnen. Gibt es eine Möglichkeit, die Produkt-ID / Nummer der Controller von SD-Karten per Software auszulesen?
Neverland,