Perché la mia scheda SD è lenta?


23

La mia scheda SD sembra funzionare lentamente. Ho una scheda SDATA Classe 10 ADATA 16 GB. Ho controllato l' elenco di compatibilità che elenca una scheda con specifiche simili e afferma che "funziona". Anche semplici compiti come ottenere un elenco di directory in una piccola directory possono richiedere alcuni secondi la prima volta che lo richiedo. Esistono strumenti che posso usare per verificare che tipo di prestazioni sto ottenendo dalla mia scheda SD? Inoltre, ci sono delle modifiche alla configurazione che posso fare per far sì che la scheda SD risponda più velocemente?

Sto usando il Raspberry Pi come seedbox BitTorrent senza testa , quindi tutto ciò che sto correndo è in esecuzione sulla riga di comando. Sto usando la suddivisione 240/16 per assicurarmi di avere la massima quantità di memoria disponibile.

aggiornamenti

Dopo aver eseguito alcuni test come raccomandato da @Krzysztof Adamski con "dd", ho ricevuto dei buoni risultati ottenendo una velocità di lettura di 20 MB / se una velocità di scrittura di circa 10 MB / s. Tuttavia, sembra che si verifichino ancora problemi di velocità I / O. Durante il test, ho eseguito i comandi "dd" in background, e ho eseguito top, per vedere cosa stava succedendo. Ho notato che il processo "mmcqd" stava prendendo un bel po 'di utilizzo del processore, tra il 5% e il 10%. Mi sono guardato intorno su Internet e ho trovato molti casi di persone che riferivano che "mmcqd" consumava un bel po 'della CPU. Ho quindi eseguito il seguente comando per testare la lettura e la scrittura allo stesso tempo

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

Durante l'esecuzione di questo comando ho ottenuto un throughput di soli 977 kB / s e "mmcqd" ha riportato un utilizzo del processore compreso tra il 10% e il 25% ogni 5-10 secondi, dopodiché sarebbe tornato a zero. Quindi, ho fatto qualche altro test. Ho eseguito i seguenti due comandi in background, quindi ho visto cosa stava succedendo in alto.

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 questo caso "mmcqd" raggiungerebbe un picco di circa il 35% di utilizzo del processore, ma la velocità effettiva è molto migliore a circa 7,5 MB / s per la lettura e circa 5,3 MB / s per la scrittura.

Sembra che ci sia un qualche tipo di problema qui in cui le scritture pesanti causano il blocco del "mmcqd". Questo fa sì che il daemon di trasmissione rallenti quasi a zero non appena la velocità aumenta troppo in attesa della scheda SD. Quando eseguo il daemon di trasmissione vedo anche che l'utilizzo di "mmcqd" è piuttosto elevato.


Sei sicuro che la scheda SD causi questo problema? Potresti prima provare a usare un'altra carta per escludere altre parti del sistema?
Dawid Ferenczy Rogožan,

Hai controllato il registro syslog e il kernel per i messaggi relativi al dispositivo mmc? Alcune carte semplicemente non funzionano nel Raspberry Pi. Alcuni altri richiedono un po 'di modifiche per funzionare in modo affidabile.
Joppe,

Il collegamento della scheda SD è stato spostato
ray023

1
@ Ray023 Grazie. Ho aggiornato il link. In futuro, puoi semplicemente modificare la domanda. Penso che, poiché sei nuovo, la modifica non verrà eseguita immediatamente, ma verrà salvata per l'approvazione del poster originale o di un altro utente di alto livello.
Kibbee,

Risposte:


21

Test velocità di lettura della carta:

Esistono due semplici modi per testare la velocità di lettura (l'elenco delle directory è solo un'operazione di lettura):

  • usando il comando dd:

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

    Questo leggerà 800 MB di dati dalla tua scheda SD e li scarterà su / dev / null. Se impiega troppo tempo, puoi cambiare count = 100 per count = 10 per leggere solo 80 MB. Al termine del comando, dovrebbe stampare un messaggio con velocità di lettura. Dovresti ottenere almeno un paio di MB / s.

  • usando il comando hdparm:

    sudo hdparm -t /dev/mmcblk0

    Questo dovrebbe darti un risultato di velocità simile al primo comando e dovrebbe anche essere almeno un paio di MB / s.

Test velocità di scrittura della carta:

Non esiste un modo semplice per testare la velocità di scrittura in quanto per farlo dovresti effettivamente scrivere alcuni dati sulla scheda. Se vuoi farlo a basso livello (omettendo il filesystem) dovresti sovrascrivere alcuni dati sulla scheda e probabilmente non vorrai farlo. Questo può essere fatto se si dispone di una partizione di swap in quanto può essere facilmente disattivata (con swapoff -a), testata con dd (con dd if=/dev/zero of=/dev/{yourswappartitionnanehare} bs=8M count=25) e quindi ricreata (con mkswap /dev/{yourswappartitionnanehare}).

Se non hai la partizione di swap, puoi testare la velocità di scrittura del filesystem anche usando il comando dd:

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

Questo creerà file da 200 MB in /home/pi/testfile. Puoi usare qualsiasi altro nome file che desideri.

Gli appunti:

  • Durante la verifica della velocità, assicurarsi che nessun altro programma sia in esecuzione nel sistema (come l'applicazione torrent, ecc.).
  • Dopo il test, è possibile controllare l'output del dmesgcomando per vedere se ci sono messaggi sul sottosistema mmc.
  • Assicurati di aver installato il firmware più aggiornato. Di tanto in tanto ci sono patch indipendentemente dalla velocità della scheda SD.
  • Potresti anche voler controllare alcuni firmware più vecchi poiché potrebbero esserci delle regressioni. Il modo più semplice per farlo (ma non il migliore) è testare diverse immagini di sistema che si basano su date diverse. Il modo più difficile è usare github e verificare le versioni storiche dei file del firmware.

I miei complimenti. Su un MacBook Air ho 1,4 MB / sec durante la scrittura di un file img su una scheda SD da 4 GB di classe 6. Un test di lettura sul PI ha riportato 20 MB / secondo !?
ScrollerBlaster,

Ho la stessa cosa. La mia velocità di lettura è di circa 500 MB / sec. Sto sbagliando qualcosa?
N2O più oscuro,

12

Per le prestazioni della scheda SD è molto importante che l'accesso sia sequenziale (come con dd) o casuale in piccoli blocchi. Le schede SD, in particolare quelle di alta classe, sembrano essere ottimizzate per l'accesso sequenziale, il che è utile per la memorizzazione di fotografie o video. Tuttavia, per eseguire un sistema operativo della scheda SD l'accesso casuale è più importante, poiché molti file di piccole dimensioni vengono letti e scritti. Immagino che il bittorrent generi anche accessi in qualche modo casuali.

Questi due thread di discussione contengono molti benchmark e discussioni sulla scheda SD. In generale, la velocità di scrittura casuale è risultata decisiva per la reattività nell'esecuzione di un sistema operativo della scheda. Questa velocità è spesso molto più bassa della velocità delle scritture sequenziali, che è la velocità che i produttori vogliono segnalare. La classe della scheda SD si basa su velocità sequenziali e le classi inferiori (4 o 6) potrebbero in effetti essere più adatte all'uso del lampone.

Lo strumento iozone misura la velocità di molti diversi schemi di accesso. Ho pubblicato brevi istruzioni per la compilazione di iozone sul lampone qui .


2
Risposta interessante. Ben fatto.
Jivings,

molto interessante dato che ho appena comprato 4x classe 10 ... dang! :-(
BerggreenDK,

@ BerggreenDK : Forse in futuro usi bene le carte per uno scopo diverso e poi forse sarai felice di aver acquistato carte di classe 10.
Neverland,

1
La velocità di scrittura casuale dovrebbe avere scarso effetto in attività tipiche come la sequenza di avvio o l'elenco delle directory. Anche per i torrent, i risultati dei test con scritture 4KB sono irrilevanti: le dimensioni tipiche dei blocchi sono di circa 1 MB e, a meno che non si disponga di RAM libera, la cache del disco li raggrupperà in scritture sequenziali ancora più grandi.
Dmitry Grigoryev l'


0

Scrivi "bittorrent" e questo fa scattare la mia ipotesi / risposta.

Il protocollo torrent riceve i pacchetti in ordine casuale da seeders casuali.

Una volta che inizi a utilizzare torrent su qualsiasi filesystem, diventa piuttosto frammentato. Ciò danneggerà le prestazioni alla grande.

Da quello che so della SDCARD, è in esecuzione FAT / FAT32 e anche peggio per la gestione della frammentazione.

Quindi trova un modo per deframmentare la tua SDCARD o copia tutti i file da essa e quindi reinstalla il sistema operativo.

Infine, scrivere un LOTTO (come farà il motore bittorrent) strapperà la tua SDCARD più rapidamente del normale utilizzo. Non dico che è sbagliato farlo, infatti avevo considerato di somigliarmi. Ma - questo potrebbe essere il motivo del tuo problema.

Vorrei che ci fosse un client torrent che trasferisse / sposta automaticamente i file scaricati su un'altra destinazione una volta completato il download + "tempo di caricamento riservato".

Quindi la deframmentazione andrebbe molto più veloce.


Come si applica la frammentazione alle schede SD? Pensavo che la frammentazione fosse solo un problema sui dischi rotanti, perché il file si sarebbe trovato in settori non sequenziali, facendo sì che la testina di lettura / scrittura dovesse spostarsi ovunque per accedere a un file. Su memoria a stato solido come schede SD, questo non è un problema. Tuttavia, concordo con te sul numero di azioni di scrittura causate da bittorrent. Penso che questo abbia molto a che fare con il problema. Combina questo con la piccola quantità di memoria sull'RPi (il mio ha 256 MB) e sembra essere una ricetta per l'accesso al disco lento. Anche le schede SD sono lente in generale.
Kibbee,

Bene, la struttura FAT / FAT32 è cattiva e lenta una volta che inizi ad avere molti frammenti di file. E il piccolo Raspberry non ha troppa potenza per muoversi. Quindi tutto ciò che viene sulla sua strada, lo rallenta. Ma ancora una volta, è solo una mia ipotesi. Non ho fatti al riguardo.
BerggreenDK,

1
L'RPi non usa nemmeno FAT / FAT32. Il file system è EXT4.
Kibbee,

3
La risposta ha un buon punto in quanto bittorrent probabilmente scrive i dati su file in piccoli pezzi in ordine casuale. Questo tipo di scrittura casuale è molto inefficiente su schede SD. Ma non credo che la deframmentazione sarebbe di aiuto. In realtà, FAT viene utilizzato sul Pi, ma solo per la partizione di avvio.
Frepa,

1
@Kibbee: vedi la mia risposta su raspberrypi.stackexchange.com/questions/8850/… per capire perché le schede SD hanno problemi di frammentazione. Molte tecniche software che eviterebbero la frammentazione del disco fisico (come i file di pre-allocazione) sono inutili con le schede SD, poiché i settori vengono posizionati (o spostati) quando i dati vengono scritti su di essi, piuttosto che quando vengono allocati.
supercat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.