Warum ist meine SD-Karte langsam?

23

Meine SD-Karte scheint langsam zu laufen. Ich habe eine ADATA 16 GB SDHC Class 10-Karte. Ich habe die Kompatibilitätsliste überprüft, in der eine Karte mit ähnlichen Spezifikationen aufgeführt ist und die angibt, dass sie "funktioniert". Selbst einfache Aufgaben, wie das Auflisten eines Verzeichnisses in einem kleinen Verzeichnis, können beim ersten Anfordern einige Sekunden dauern. Gibt es Tools, mit denen ich überprüfen kann, welche Leistung meine SD-Karte erbringt? Kann ich auch Änderungen an der Konfiguration vornehmen, damit die SD-Karte schneller reagiert?

Ich verwende den Raspberry Pi als kopflose BitTorrent- Seedbox, sodass alles, worauf ich stoße, nur über die Befehlszeile ausgeführt wird. Ich verwende die 240/16 Aufteilung, um sicherzustellen, dass ich die maximale verfügbare Speicherkapazität habe.

Aktualisierung

Nachdem ich einige Tests durchgeführt hatte, die von @Krzysztof Adamski mit "dd" empfohlen wurden, erhielt ich einige gute Ergebnisse mit einer Lesegeschwindigkeit von 20 MB / s und einer Schreibgeschwindigkeit von etwa 10 MB / s. Es scheint jedoch immer noch einige Probleme mit der E / A-Geschwindigkeit zu geben. Beim Testen habe ich die "dd" -Befehle im Hintergrund ausgeführt und oben ausgeführt, um zu sehen, was los ist. Ich bemerkte, dass der "mmcqd" -Prozess ziemlich viel Prozessor beanspruchte, zwischen 5% und 10%. Ich habe mich im Internet umgesehen und festgestellt, dass viele Leute berichten, dass "mmcqd" einen beträchtlichen Teil der CPU verbraucht. Ich habe dann den folgenden Befehl ausgeführt, um das Lesen und Schreiben gleichzeitig zu testen

sudo dd if=/dev/mmcblk0 of=test.dat bs=1M count=1024

Bei der Ausführung dieses Befehls wurde ein Durchsatz von nur 977 kB / s erzielt, und "mmcqd" meldete alle 5 bis 10 Sekunden eine Prozessorauslastung zwischen 10% und 25%. Also habe ich noch ein paar Tests gemacht. Ich habe die folgenden zwei Befehle im Hintergrund ausgeführt und dann beobachtet, was oben los war.

sudo dd if=/dev/mmcblk0 of=/dev/null bs=1M count=1024 &
sudo dd if=/dev/zero of=test.dat bs=1M count=1024 &

In diesem Fall würde "mmcqd" einen Spitzenwert von etwa 35% der Prozessorauslastung aufweisen, der Durchsatz war jedoch mit etwa 7,5 MB / s beim Lesen und etwa 5,3 MB / s beim Schreiben viel besser.

Es scheint, dass hier ein Problem vorliegt, bei dem schwere Schreibvorgänge dazu führen, dass "mmcqd" das System blockiert. Dadurch verlangsamt sich der Übertragungsdämon auf fast Null, sobald die Geschwindigkeit zu hoch wird und auf die SD-Karte gewartet wird. Beim Ausführen von Transmission-Daemon sehe ich auch, dass die "mmcqd" -Verwendung ziemlich hoch wird.

Kibbee
quelle
Sind Sie sicher, dass die SD-Karte dieses Problem verursacht? Könnten Sie zuerst versuchen, eine andere Karte zu verwenden, um andere Teile des Systems auszuschließen?
Dawid Ferenczy Rogožan
Haben Sie Ihr Syslog- und Kernel-Log auf Nachrichten überprüft, die sich auf das mmc-Gerät beziehen? Einige Karten funktionieren im Raspberry Pi einfach nicht. Einige andere erfordern ein wenig Feineinstellung, um zuverlässig zu arbeiten.
Joppe
SD-Karten-Link ist umgezogen
ray023
1
@ Ray023 Danke. Ich habe den Link aktualisiert. In Zukunft können Sie die Frage einfach bearbeiten. Ich denke, weil Sie neu sind, wird die Bearbeitung nicht sofort übernommen, sondern für das Originalposter oder einen anderen hochrangigen Benutzer gespeichert, um sie zu genehmigen.
Kibbee

Antworten:

21

Lesegeschwindigkeit der Karte testen:

Es gibt zwei einfache Möglichkeiten, die Lesegeschwindigkeit zu testen (das Auflisten des Verzeichnisses ist nur eine Leseoperation):

  • mit dem Befehl dd:

    sudo dd if=/dev/mmcblk0 of=/dev/null bs=8M count=100

    Dadurch werden 800 MB Daten von Ihrer SD-Karte gelesen und in / dev / null verworfen. Wenn es zu lange dauert, können Sie count = 100 in count = 10 ändern, um nur 80 MB zu lesen. Nach Beendigung des Befehls sollte eine Nachricht mit Lesegeschwindigkeit gedruckt werden. Du solltest mindestens ein paar MB / s haben.

  • mit dem Befehl hdparm:

    sudo hdparm -t /dev/mmcblk0

    Dies sollte zu einer ähnlichen Geschwindigkeit führen wie der erste Befehl und mindestens ein paar MB / s betragen.

Schreibgeschwindigkeit der Karte testen:

Es gibt keine einfache Möglichkeit, die Schreibgeschwindigkeit zu testen. Dazu müssten Sie tatsächlich einige Daten auf die Karte schreiben. Wenn Sie dies auf niedriger Ebene (ohne Dateisystem) tun möchten, müssen Sie einige Daten auf der Karte überschreiben, und Sie möchten dies wahrscheinlich nicht tun. Dies ist möglich, wenn Sie eine Swap-Partition haben, die einfach deaktiviert (mit swapoff -a), mit dd (mit dd if=/dev/zero of=/dev/{yourswappartitionnanehare} bs=8M count=25) getestet und dann neu erstellt (mit mkswap /dev/{yourswappartitionnanehare}) werden kann.

Wenn Sie keine Swap-Partition haben, können Sie die Schreibgeschwindigkeit des Dateisystems auch mit dem Befehl dd testen:

dd if = / dev / zero von = / home / pi / testfile bs = 8M count = 25

Dadurch wird eine 200-MB-Datei in erstellt /home/pi/testfile. Sie können einen beliebigen anderen Dateinamen verwenden.

Anmerkungen:

  • Stellen Sie beim Testen der Geschwindigkeit sicher, dass keine anderen Programme auf Ihrem System ausgeführt werden (z. B. Torrent-Anwendungen usw.).
  • Nach dem Testen können Sie die Ausgabe des dmesgBefehls überprüfen, um festzustellen, ob Meldungen zu mmc subsystem vorliegen.
  • Stellen Sie sicher, dass Sie die aktuellste Firmware installiert haben. Es gibt Patches, unabhängig von der Geschwindigkeit der SD-Karte.
  • Möglicherweise möchten Sie auch einige ältere Firmwares überprüfen, da möglicherweise einige Regressionen vorliegen. Der einfachste (aber nicht der beste) Weg, dies zu tun, besteht darin, verschiedene Systemimages zu testen, die auf unterschiedlichen Daten basieren. Der schwierigere Weg ist die Verwendung von Github und das Auschecken früherer Versionen von Firmwaredateien.
Krzysztof Adamski
quelle
Meine Komplimente. Auf einem MacBook Air habe ich beim Schreiben einer IMG-Datei auf eine 4 GB SD-Karte der Klasse 6 1,4 MB / s erreicht. Ein Lesetest auf dem PI meldete 20 MB / Sekunde !?
ScrollerBlaster
Ich habe das gleiche Meine Lesegeschwindigkeit beträgt ungefähr 500 MB / s. Ich habe etwas falsch gemacht?
Darkest N2O
12

Für die Leistung der SD-Karte ist es sehr wichtig, ob der Zugriff sequentiell (wie bei dd) oder in kleinen Blöcken zufällig erfolgt. SD-Karten, insbesondere solche von hoher Klasse, scheinen für den sequentiellen Zugriff optimiert zu sein, was sich gut zum Speichern von Fotos oder Videos eignet. Für das Ausführen eines Betriebssystems der SD-Karte ist jedoch ein wahlfreier Zugriff wichtiger, da viele kleine Dateien gelesen und geschrieben werden. Ich würde vermuten, Bittorrent generiert auch etwas zufällige Zugriffe.

Diese beiden Diskussionsthreads enthalten viele SD-Karten-Benchmarks und -Diskussionen. Im Allgemeinen wurde festgestellt, dass die zufällige Schreibgeschwindigkeit für die Reaktionsfähigkeit des Betriebs eines Betriebssystems der Karte entscheidend ist. Diese Geschwindigkeit ist häufig viel niedriger als die Geschwindigkeit der sequentiellen Schreibvorgänge, die die Hersteller gerne melden. Die SD-Kartenklasse basiert auf sequentiellen Geschwindigkeiten, und niedrigere Klassen (4 oder 6) eignen sich möglicherweise besser für die Verwendung mit Himbeeren.

Das iozone- Tool misst die Geschwindigkeit vieler verschiedener Zugriffsmuster. Ich habe für die Erstellung iozone auf der Himbeere kurze Anleitung geschrieben hier .

Frepa
quelle
2
Interessante Antwort. Schön.
Jivings
sehr interessant, da ich gerade 4x klasse 10 gekauft habe ... verdammt! :-(
BerggreenDK
@ BerggreenDK : Vielleicht nutzt du die Karten in Zukunft gut für einen anderen Zweck und bist dann vielleicht froh, dass du Karten der Klasse 10 gekauft hast.
Neverland
1
Die zufällige Schreibgeschwindigkeit sollte bei typischen Aufgaben wie der Startsequenz oder der Verzeichnisliste nur geringe Auswirkungen haben. Selbst für Torrents sind Testergebnisse mit 4-KB-Schreibvorgängen irrelevant: Typische Blockgrößen liegen bei etwa 1 MB. Wenn Sie keinen freien Arbeitsspeicher haben, gruppiert der Festplatten-Cache diese in noch größere sequenzielle Schreibvorgänge.
Dmitry Grigoryev
0

Du schreibst "bittorrent" und das löst meine Vermutung / Antwort aus.

Das Torrent-Protokoll empfängt Pakete in zufälliger Reihenfolge von zufälligen Seedern.

Sobald Sie beginnen, Torrent auf einem Dateisystem zu verwenden, wird es ziemlich fragmentiert. Dies wird die Leistung stark beeinträchtigen.

Soweit ich weiß, läuft die SDCARD mit FAT / FAT32 und ist noch schlimmer für die Fragmentierung.

So finden Sie einen Weg, um Ihre SDCARD zu defragmentieren, oder kopieren Sie alle Dateien von ihr und installieren Sie das Betriebssystem neu.

Wenn Sie eine LOT schreiben (wie es die Bittorrent-Engine tun wird), wird Ihre SDCARD schneller zerrissen als bei normaler Verwendung. Ich sage nicht, dass es falsch ist, es zu tun. Aber - das könnte der Grund für Ihr Problem sein.

Ich wünschte, es gäbe einen Torrent-Client, der die heruntergeladenen Dateien automatisch an einen anderen Ort überträgt / verschiebt, sobald der Download + "reservierte Upload-Zeit" abgeschlossen ist.

Dann würde das Defragmentieren viel schneller gehen.

BerggreenDK
quelle
Wie wirkt sich die Fragmentierung auf SD-Karten aus? Ich dachte, Fragmentierung sei nur ein Problem bei sich drehenden Festplatten, da sich die Datei auf nicht sequenziellen Sektoren befände und der Schreib- / Lesekopf sich überall bewegen musste, um auf eine Datei zuzugreifen. Bei Festkörperspeichern wie SD-Karten ist dies kein Problem. Ich stimme Ihnen jedoch in Bezug auf die Anzahl der von bittorrent verursachten Schreibaktionen zu. Ich denke, das hat viel mit dem Problem zu tun. Kombinieren Sie das mit der geringen Menge an Speicher auf dem RPi (meins hat 256 MB) und es scheint ein Rezept für langsamen Festplattenzugriff zu sein. Auch SD-Karten sind im Allgemeinen langsam.
Kibbee
Nun, die FAT / FAT32-Struktur ist schlecht und langsam, sobald Sie anfangen, viele Fragmente von Dateien zu haben. Und die kleine Himbeere hat nicht zu viel Kraft, um sich mit ihr zu bewegen. Also alles, was ihm in den Weg kommt, verlangsamt es. Aber es ist nur meine Vermutung. Ich habe keine Fakten dazu.
BerggreenDK
1
Das RPi verwendet nicht einmal FAT / FAT32. Das Dateisystem ist EXT4.
Kibbee
3
Die Antwort hat insofern einen guten Punkt, als Bittorrent wahrscheinlich Daten in zufälliger Reihenfolge in kleine Stücke in Dateien schreibt. Diese Art des zufälligen Schreibens ist auf SD-Karten sehr ineffizient. Aber ich glaube nicht, dass Defragmentierung helfen würde. Tatsächlich wird FAT auf dem Pi verwendet, jedoch nur für die Bootpartition.
Frepa
1
@Kibbee: Siehe meine Antwort unter raspberrypi.stackexchange.com/questions/8850/…, um zu verstehen, warum SD-Karten eigene Fragmentierungsprobleme haben. Viele Softwaretechniken, mit denen eine Fragmentierung der physischen Festplatte vermieden werden kann (z. B. das Zuweisen von Dateien vorab), sind bei SD-Karten unbrauchbar, da Sektoren platziert (oder verschoben) werden, wenn Daten darauf geschrieben werden, und nicht, wenn sie zugewiesen werden.
Supercat