Cluster-Ausrichtung und Karten-Performance
In meinem
Artikel über das Formatieren
(im Moment nur als Englische Fassung) habe ich bereits die
Cluster-Ausrichtung
erwähnt.
In den meisten Fällen muss man sich darüber aber keine Gedanken machen:
Viele Karten-Standards - ganz besonders SD und SDHC -
haben bereits strenge Regeln, wie die Karte formatiert werden
soll, um die Cluster auszurichten. Viele Karten werden
durch nicht ausgerichtete Cluster kaum beeinflusst,
aber es scheint ein paar Ausnahmen zu geben.
Um die naheliegende Frage zu beantworten: Ich habe keine
speziellen Tools zum Formatieren, ich bearbeite die
Partitionstabelle und die Sektoren des Dateisystems mit
einem Hex-Editor.
Warum ist die Cluster-Ausrichtung so Wichtig?
Flash-Speicherkarten sind Random-Access Speichermedien
mit einer Sektorgröße von 512 Bytes. Aber das ist nur
die logische Repräsentation nach außen. Flash-Speicher
kann Byte für Byte ausgelesen werden, muss aber vor
dem Schreiben gelöscht werden. Dieser Löschvorgang
wirkt auf eine gesamte Speicherseite, die damit
"blitzartig" gelöscht wird, daher der
Name Flash-Speicher. Selbst wenn man nur ein einziges
Bit ändern möchte, muss eine Speicherseite gelesen,
gelöscht, und verändert zurückgeschrieben werden.
Die Größe solch einer Seite entspricht einer
Zweierpotenz größer oder gleich 512 Bytes,
meinen Beobachtungen und Messungen zufolge in
den meisten Fällen wohl ein Wert im Bereich von 4kB bis 32kB.
Wenn die Schreibgröße kleiner als die Seitengröße
ist, muss trotzdem die gesamte Speicherseite geflasht
und zurückgeschrieben werden.
Wenn ein Schreibvorgang über eine Seitengrenze hinweg erfolgt,
müssen beide Speicherseiten gelesen, geflasht, und
zurückgeschrieben werden. Der Speicher-Controller
könnte zwar aufeinanderfolgende nicht-ausgerichtete
Schreibvorgänge zu einer Folge von ausgerichteten
Schreibvorgängen kombinieren, aber es scheint
Controller zu geben, bei denen die Schreibperformance
durch nicht-ausgerichtete Schreibvorgänge stark leidet.
Dies bedeutet, dass man die beste Leistung erhält,
wenn Cluster 2
(der erste Cluster im Dateisystem) an einer
Seitengrenze ausgerichtet ist, und die Clustergröße
der Seitengröße oder einem ganzzahligen Vielfachen
davon entspricht.
Auslegung der Dateisysteme auf Speicherkarten
Außer für CompactFlash scheint es bestimmte Regeln
zu geben, wie eine Speicherkarte formatiert werden soll.
Die folgende Aufstellung basiert auf einer detaillierten
Analyse der Dateisysteme von ungefähr 100 Speicherkarten.
Ich habe keinen Zugriff auf die entsprechenden Spezifikationen,
die Dokumente scheinen nur den Mitgliedern der jeweiligen
Speicherkarten-Organisation zugänglich zu sein.
Die Basis ist natürlich die FAT-Spezifikation von Microsoft
(fatgen103.doc). Dieses Dokument beschreibt aber nur die
empfohlenen Standardkonfigurationen, und weist auf die Risiken hin,
wenn von dieser Konfiguration im Rahmen der Spezifikation
abgewichen wird.
- CompactFlash Karten
Dies sind die einzigen Karten ohne besondere oder seltsame
Regeln. Die meisten CF-Karten haben einen "klassischen"
Partitionsstart bei CHS 0/1/1, und Karten mit mehr als 256MB
verwenden ein Mapping von C/16/63. In vielen Fällen ist
am Ende ein kleiner ungenutzer Bereich aufgrund von
Extended Translation und/oder der alten (und seltsamen)
"Last Cylinder" Regel.
Normalerweise haben alle Dateisystem-Parameter ihre
Standard-Werte, und Cluster 2 ist mehr oder weniger
gut ausgerichtet. Mit einem Partitions-Anfang von LBA 63
und einem FAT16-Dateisystem mit Standard-Werten beginnt
Cluster 2 an einer 1kB-Grenze.
- SD Karten
Durch das Register-Layout könnten die meisten
SD Karten auf C/16/32 gemappt werden. Gewöhnlich
wird aber LBA mit einem Mapping von C/255/63 verwendet,
was in den meisten Fällen zu einem ungeraden
Partitions-Ende führt (also keine Zylindergrenze).
Der Startpunkt der Partition ist auf einen bestimmten
Wert gelegt, so dass Cluster 2 in den meisten
Fällen bei Adresse 0x40000, 0x50000 oder 0x60000 beginnt,
also einer 64kB-Grenze.
- SDHC Karten
Es sieht so aus, als hätten SDHC Karten den
Beginn der Partition auf
LBA 8192 (0x400000) gesetzt. Durch erhöhen von BPB_RsvdSecCnt
von 32 (der Standardwert für FAT32) auf einen viel höheren Wert,
wird die Adresse von Cluster 2
auf die Adresse 0x800000 verschoben, ein Offset von 8MB.
Die Clustergröße beträgt dabei 32kB.
- MMC
MMC verwenden ein Mapping von C/16/32 oder
Extended Translation mit einem Partitionsbeginn bei
CHS 0/1/1 (LBA 32). Bei MMC mit 512MB oder weniger
ist BPB_RsvdSecCnt etwas höher, um
Cluster 2 an die Adresse 0x48000 zu verschieben.
Für MMC mit 1GB oder oder 2GB liegen keine Daten vor,
aber durch Erhöhen der Clustergröße kann dieses
Layout auch für diese Kartengrößen beibehalten werden.
Die einzige 4GB MMCplus die ich bisher zu sehen
bekommen habe, war im "SDHC-Stil"
partitioniert und mit FAT32 bei 32kB Clustergröße
formatiert.
- Memory Sticks
Die meisten Memory Sticks haben am Ende
einen kleinen ungenutzten Bereich aufgrund von
Extended Translation und/oder der "Last Cylinder"
Regel. Die Größe kann auf C/16/32 gemappt werden, aber
der Beginn der Partition ist auf einen bestimmten Wert
verschoben, um Cluster 2 auszurichten:
Ein Vielfaches von 64kB für größere Karten, oder
ein Vielfaches von 16kB für kleinere Karten.
Die Clustergröße scheint auf
16kB für Memory Sticks bis 64MB festgelegt, und auf 32kB für Memory
Sticks mit 256MB oder größer. Der Wert für 128MB Memory Sticks
ist mangels Beispieldaten nicht bekannt.
- SmartMedia und xD-Picture Cards
Während andere Karten der gleichen
beworbenen Größe leicht unterschiedliche
tatsächliche Größe aufweisen, ist die Größe
von SmartMedia und xD auf 1000 Sektoren
multipliziert mit einer Zweierprotenz
festgelegt, also beispielsweise
16.000 Sektoren für 8MB Karten bis hin zu 4.096.000 Sektoren
für 2GB Karten.
SmartMedia und xD können auf C/16/32 gemappt werden,
aber die Karten haben den Start der Partition so
gelegt, dass Cluster 2 auf ein
Vielfaches von 16kB fällt. SmartMedia und xD von 32MB bis 1GB
verwenden auch eine Clustergröße von 16kB.
Im Gegensatz zu anderen Karten ist die Anzahl der
Einträge im FAT 16 Stammverzeichnis auf 256
anstatt dem Standardwert von 512 festgelegt.
Das spart 8kB Platz, der Grund dafür ist nicht bekannt.
Nach dem Durchlesen und Verstehen der oben aufgeführten
Beobachtungen sollte es offensichtlich sein,
warum Speicherkarten niemals außerhalb eines
speziell für den entsprechenden Speicherkarten-Typ
vorgesehenen Geräts formatiert werden sollten.
Ungewöhnliche Karten-Konfigurationen
Wie oben aufgezeigt, sind CompactFlash die einzige
Kartenfamilie ohne spezielle Regeln bezüglich der
Formatierung und der Ausrichtung der Cluster.
Bei den meisten CF-Karten hat die Ausrichtung der
Cluster auch keine nennenswerten Auswirkungen,
aber insbesondere SanDisk CF-Karten haben offensichtlich
einen Controller, bei dem nicht ausgerichtete Cluster
zu einer deutlichen Reduzierung der Geschwindigkeit
führen können.
Es kommt aber noch schlimmer: Es gibt Karten mit
Standard-Formatierung und nicht ausgerichteten
Clustern, bei denen der Controller angepasst ist,
um mit der nun gegebenen Position von Cluster 2
beste Leistung zu erzielen.
Bei einer Formatierung mit regulär ausgerichteten
Clustern erzielt man dann eine Reduzierung anstatt
einer Erhöhung der Geschwindigkeit!
Die folgende Liste ist nur eine kurze Zusammenfassung, weitere
Information zu den erreichten Geschwindigkeiten folgt...
- SanDisk Extreme IV CF 4GB
Meine SanDisk Extreme IV CF 4GB zeigt die
beste Schreibperformance ab einem Offset von 1536 Bytes
und Vielfachen von 2kB, also Adressen die auf 0x600 oder
0xE00 enden. Bei werksseitiger Formatierung
hat Cluster 2 die Adresse 0xFFE00, hier liegt
also eine bewusste Konfiguration des Controllers vor.
- SanDisk Extreme III CF 16GB
Meine SanDisk Extreme III CF 16GB zeigt die
beste Schreibperformance ab einem Offset von 0
und Vielfachen von 32kB, also Adressen die auf 0x0000 oder
0x8000 enden. Bei werksseitiger Formatierung
hat Cluster 2 die Adresse 0x3DCE00, dadurch wird
also die Karte gebremst.
- SanDisk Extreme III CF 1GB
Meine SanDisk Extreme III CF 1GB zeigt die
beste Schreibperformance ab einem Offset von 1kB
und Vielfachen von 2kB, also Adressen die auf
0x400 oder 0xC00 enden. Bei werksseitiger Formatierung
hat Cluster 2 die Adresse 0x49400, hier liegt
also eine bewusste Konfiguration des Controllers vor.