Quando controllo le prestazioni delle schede SD per la scrittura casuale, vedo che le prestazioni sono piuttosto pessime per le dimensioni del record di 4 kB (questo non è sorprendente) ma poi per diverse schede scende anche per dimensioni di record più grandi prima di aumentare. Ho misurato le prestazioni di scrittura casuali con iozone v3.430 e testato diverse schede flash di diversi produttori. Questo è il comando iozone, che ho usato per misurare con una dimensione del file di 50 MB:
iozone -RaeI -i 0 -i 1 -i 2 -y 4k -q 1M -s 50m -o -f /tmp/testfile
Questi sono i risultati con dimensioni del file 50 MB:
Domanda: Qual è il motivo per cui le prestazioni di scrittura casuali con una dimensione del record di 8, 16, 32, 64 e 128 kB sono più lente rispetto alla dimensione del record di 4 kB?
Peter Brittain ha suggerito di provare con file di dimensioni maggiori, quindi l'ho provato anche con file di dimensioni pari a 500 MB. Questi sono i risultati:
Le prestazioni complessive sono peggiorate ma il fenomeno si verifica ancora.
Le partizioni sono allineate ai limiti di 4 MB. Il file system è ext4 con una dimensione di blocco di 4 kB. La partizione utilizzata per l'avvio dei test è 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
Aggiornamento 1: è chiaro che le prestazioni per la scrittura casuale, specialmente per dischi di piccole dimensioni, sono significativamente inferiori rispetto alla scrittura sequenziale. Le celle di memoria della memoria flash NAND sono raggruppate in pagine e sono chiamate blocchi di cancellazione. Le dimensioni tipiche delle pagine sono 4, 8 o 16 kB. Sebbene sia possibile per il controller scrivere singole pagine, i dati non possono essere sovrascritti senza prima essere cancellati e un blocco di cancellazione è l'unità più piccola che può essere cancellata da una memoria flash NAND. La dimensione del blocco di cancellazione è in genere compresa tra 128 kB e 2 MB. Nelle moderne schede SD, un numero ridotto di blocchi di cancellazione viene combinato in unità più grandi di uguale dimensione che vengono chiamate gruppi di allocazione o unità o segmenti di allocazione. La dimensione normale del segmento è di 4 MB.Ogni operazione di scrittura sulla memoria comporta un'operazione di lettura-modifica-scrittura per un intero segmento. Ad esempio, su una scheda SD con dimensioni del segmento di 4 MB, la scrittura di 4 kB di dati in posizioni casuali determina un fattore di amplificazione della scrittura di 1024. I controller delle schede SD implementano un livello di traduzione. Per qualsiasi operazione I / O, il controller esegue una traduzione dall'indirizzo virtuale a quello fisico. Se i dati all'interno di un segmento devono essere sovrascritti, il livello di traduzione rimappa l'indirizzo virtuale del segmento su un altro indirizzo fisico cancellato. Il vecchio segmento fisico è contrassegnato come sporco e messo in coda per una cancellazione. Successivamente, quando viene cancellato, può essere riutilizzato. I controller delle schede SD di solito memorizzano nella cache un singolo o più segmenti per aumentare le prestazioni delle operazioni di scrittura casuali.Se le schede SD memorizzano un file system radice, è utile se il controller della scheda è in grado di memorizzare nella cache i segmenti in cui si svolgono le operazioni di scrittura, i segmenti, che memorizzano i metadati per il file system e (se disponibile) il giornale del file system. Di conseguenza, le prestazioni di scrittura casuali di una scheda SD dipendono dalla dimensione del blocco di cancellazione, dalla dimensione del segmento e dal numero di segmenti, la cache del controller. Ma tutto ciò non spiega perché le prestazioni di scrittura casuali con una dimensione record di 8, 16, 32, 64 e 128 kB siano più lente come con una dimensione record di 4 kB.
Aggiornamento 2 (risposta a myaut): lo screenshot della tabella è opera mia. Attualmente, scrivo un articolo / articolo sui cluster di computer a scheda singola perché sono un'opzione interessante per fornire risorse a progetti e ricercatori di studenti. In questo contesto ho anche studiato le prestazioni della CPU, della memoria e dell'interfaccia di rete di un singolo nodo. Ho acquistato tutte le schede SD testate. Su una delle schede che ho installato (copiato tramite dd) Raspian Wheezy (versione 2014-06-20). Dopo aver configurato le impostazioni di rete e installato alcuni pacchetti aggiuntivi (ad es. Iozone), ho copiato l'intera scheda SD su tutte le altre schede SD.
Aggiornamento 3 (risposta a Gabriel Southern): i risultati provengono da singole corse. La procedura era:
- Inserisci la scheda in Raspberry Pi Modello B
- Avvia il sistema
- Accedi tramite SSH
- Avviare il test dello iozone
- Arresta il sistema e prova con un'altra scheda SD
Alcune delle carte che ho provato più volte per ricontrollare. C'erano solo poche variazioni. Il fenomeno si verifica sempre, tranne per le due schede Samsung e una scheda Verbatim.
Aggiornamento 4: Al momento provo a trovare un contatto con un'azienda che produce i flash control NAND (Samsung, SanDisk, Toshiba ...) per chiedere una risposta definitiva. SanDisk ha un forum. Ho chiesto lì una spiegazione. Ho anche inviato una richiesta al dipartimento di supporto tecnico di Kingston.
Aggiornamento 5: la dimensione del blocco di cancellazione e la dimensione dell'unità (segmento) di allocazione non sono responsabili del fenomeno. Ho testato la dimensione del blocco di cancellazione di tutte le schede SD con il pritcsd.py pugno utensile nel lettore di schede interno di un notebook ThinkPad X240 e infine con un lampone Pi Modello B. Per tutte le schede l'uscita è: Erase block size of mmcblk0 is 65536 bytes
. Anche la dimensione del segmento è uguale per tutte le schede SD testate. Sono 4 MB. Questa informazione può essere trovata nel file /sys/class/mmc_host/mmc0/mmc0*/preferred_erase_size
. È abbastanza straordinario secondo me che tutte queste carte hanno le stesse dimensioni del blocco di cancellazione e dimensioni del segmento. Nel frattempo ho raccolto gli ID prodotto / i numeri degli articoli dagli imballaggi delle carte testate. Eccoli.
Aggiornamento 6: il supporto tecnico di Kingston mi ha scritto che i controller delle schede Kingston testate (e molto probabilmente delle altre carte) sono ottimizzati per file di dimensioni 4 kB. L'esatta implementazione del controller è riservata. La risposta di Kingston è la migliore che ho avuto. SanDisk non ha mai risposto alla mia richiesta di supporto e non sono riuscito a trovare un contatto da Sony, Samsung o Verbatim