¿Por qué el rendimiento de escritura aleatoria de la tarjeta SD para el tamaño de registro 8-128 kB cae por debajo del rendimiento del tamaño de registro 4 kB?

15

Cuando verifico el rendimiento de las tarjetas SD para escritura aleatoria, puedo ver que el rendimiento es bastante malo para un tamaño de registro de 4 kB (esto no es sorprendente), pero luego, para varias tarjetas, incluso cae para tamaños de registro más grandes antes de aumentar. Medí el rendimiento de escritura aleatoria con iozone v3.430 y probé varias tarjetas flash de diferentes fabricantes. Este es el comando iozone, solía medir con un tamaño de archivo de 50 MB:

iozone -RaeI -i 0 -i 1 -i 2 -y 4k -q 1M -s 50m -o -f /tmp/testfile

Estos son los resultados con un tamaño de archivo de 50 MB:

Disminución del rendimiento de las tarjetas SD para escritura aleatoria cuando se prueba con iozone y 50 MB de tamaño de archivo

Pregunta: ¿Cuál es la razón por la que el rendimiento de escritura aleatoria con un tamaño de registro de 8, 16, 32, 64 y 128 kB es más lento que con un tamaño de registro de 4 kB?

Peter Brittain sugirió probar con un tamaño de archivo más grande, así que lo probé también con un tamaño de archivo de 500 MB. Estos son los resultados:

Disminución del rendimiento de las tarjetas SD para escritura aleatoria cuando se prueba con iozone y un tamaño de archivo de 500 MB

El rendimiento general empeoró pero el fenómeno aún ocurre.

Las particiones están alineadas con límites de 4 MB. El sistema de archivos es ext4 con un tamaño de bloque de 4 kB. La partición utilizada para el inicio de las pruebas es 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

Actualización 1: está claro que el rendimiento de la escritura aleatoria, especialmente para tamaños de registro pequeños, es significativamente menor en comparación con la escritura secuencial. Las celdas de memoria del almacenamiento flash NAND se agrupan en páginas y se denominan bloques de borrado. Los tamaños de página típicos son 4, 8 o 16 kB. Aunque es posible que el controlador escriba páginas individuales, los datos no se pueden sobrescribir sin borrar primero y un bloque de borrado es la unidad más pequeña que puede borrar un almacenamiento flash NAND. El tamaño del bloque de borrado es típicamente entre 128 kB y 2 MB. En las tarjetas SD modernas, se combinan pequeñas cantidades de bloques de borrado en unidades más grandes de igual tamaño que se denominan grupos de asignación o unidades o segmentos de asignación. El tamaño de segmento habitual es de 4 MB.Cada operación de escritura en el almacenamiento da como resultado una operación de lectura-modificación-escritura para un segmento completo. Por ejemplo, en una tarjeta SD con un tamaño de segmento de 4 MB, escribir 4 kB de datos en ubicaciones aleatorias da como resultado un factor de amplificación de escritura de 1024. Los controladores de las tarjetas SD implementan una capa de traducción. Para cualquier operación de E / S, el controlador realiza una traducción de la dirección virtual a la física. Si se sobrescriben los datos dentro de un segmento, la capa de traducción reasigna la dirección virtual del segmento a otra dirección física borrada. El viejo segmento físico está marcado como sucio y en cola para borrar. Más tarde, cuando se borra, se puede reutilizar. Los controladores de las tarjetas SD generalmente almacenan en caché uno o más segmentos para aumentar el rendimiento de las operaciones de escritura aleatoria.Si las tarjetas SD almacenan un sistema de archivos raíz, es beneficioso si el controlador de la tarjeta puede almacenar en caché los segmentos donde se realizan las operaciones de escritura, los segmentos que almacenan los metadatos para el sistema de archivos y (si disponible) el diario del sistema de archivos. En consecuencia, el rendimiento de escritura aleatoria de una tarjeta SD depende del tamaño del bloque de borrado, el tamaño del segmento y el número de segmentos, el caché del controlador. Pero todo esto no explica por qué el rendimiento de escritura aleatoria con un tamaño de registro de 8, 16, 32, 64 y 128 kB es más lento que con un tamaño de registro de 4 kB.

Actualización 2 (respuesta a myaut): la captura de pantalla de la tabla es mi propio trabajo. Actualmente, escribo un artículo / artículo sobre grupos de computadoras de una sola placa porque son una opción interesante para proporcionar recursos a proyectos de estudiantes e investigadores. En este contexto, también investigué el rendimiento de la CPU, el almacenamiento y la interfaz de red de un solo nodo. He comprado todas las tarjetas SD probadas. En una de las tarjetas que instalé (copiado a través de dd) Raspian Wheezy (versión 2014-06-20). Después de configurar los ajustes de red e instalar algunos paquetes adicionales (por ejemplo, iozone), copié toda la tarjeta SD a todas las demás tarjetas SD.

Actualización 3 (respuesta a Gabriel Southern): Los resultados son de ejecuciones individuales. El procedimiento fue:

  1. Inserte la tarjeta en Raspberry Pi Modelo B
  2. Arrancar el sistema
  3. Iniciar sesión a través de SSH
  4. Inicie la ejecución de prueba de iozone
  5. Detenga el sistema e intente con otra tarjeta SD

Algunas de las tarjetas que intenté varias veces para verificar. Solo hubo poca variación. El fenómeno ocurre todo el tiempo, excepto las dos tarjetas Samsung y una tarjeta Verbatim.

Actualización 4: En este momento trato de encontrar un contacto con una compañía que produce controladores de clones flash NAND (Samsung, SanDisk, Toshiba ...) para pedirle una respuesta definitiva. SanDisk tiene un foro. Me pregunté hay una explicación. También envié una solicitud al departamento de soporte técnico de Kingston.

Actualización 5: El tamaño del bloque de borrado y el tamaño de la unidad de asignación (segmento) no son responsables del fenómeno. Probé el tamaño de bloque de borrado de todas las tarjetas SD con la pritcsd.py puño herramienta en el lector de tarjetas interno de un portátil ThinkPad X240 y, finalmente, con una Raspberry Pi Modelo B. Para todas las tarjetas de la salida es: Erase block size of mmcblk0 is 65536 bytes. Además, el tamaño del segmento es igual para todas las tarjetas SD probadas. Tiene 4 MB. Esta información se puede encontrar en el archivo /sys/class/mmc_host/mmc0/mmc0*/preferred_erase_size . En mi opinión, es bastante extraordinario que todas estas tarjetas tengan el mismo tamaño de bloque de borrado y tamaño de segmento. Mientras tanto, recolecté las identificaciones de producto / números de artículo de los embalajes de las tarjetas probadas. Aquí están.

ID de producto / números de artículo de los embalajes de las tarjetas probadas

Actualización 6: El soporte técnico de Kingston me escribió que los controladores de las tarjetas Kingston probadas (y muy probablemente de las otras tarjetas) están optimizadas para archivos de tamaño 4 kB. La implementación exacta del controlador es confidencial. La respuesta de Kingston es la mejor que obtuve. SanDisk nunca respondió a mi solicitud de soporte y no pude encontrar un contacto de Sony, Samsung o Verbatim

Neverland
fuente
1
Esta es una pregunta interesante. ¿Son los resultados que informó promedios en varias ejecuciones, o solo de una sola ejecución? Me gustaría saber cuánta variación hay en los resultados.
1
Como resultado de la reasignación lógica y la nivelación del desgaste, esta afirmación en la pregunta "Por ejemplo, en una tarjeta SD con un tamaño de segmento de 4 MB, escribir 4 kB de datos en ubicaciones aleatorias da como resultado un factor de amplificación de escritura de 1024". Es falso.
Ben Voigt
1
En mi experiencia en las pruebas de rendimiento, llegaste a todo tipo de optimizaciones y cachés en pruebas de menor escala. En particular, podría creer que los fabricantes con flash más lento necesitarían estas optimizaciones para manejar las actualizaciones del sistema de archivos de manera eficiente, pero no puedo probarlo debido a la falta de documentación pública para todos los controladores. Dicho esto, me doy cuenta de que solo estás usando un archivo de 50 MB. ¿Has probado archivos mucho más grandes (según las "reglas de ejecución" en iozone.org/docs/IOzone_msword_98.pdf ) para intentar contrarrestar esto?
1
Suponiendo que no encuentra diferencia, busqué cualquier otro dato sobre este asunto. Parece que la organización Linaro ha hecho una investigación similar . En particular, el caché SLC extra grande puede explicar sus resultados muy rápidos. Y las optimizaciones de FAT32 estarían dirigidas específicamente a pequeñas escrituras.
1
Sí, ya descubrí ese problema en la página ... Sin embargo, creo que es posible que te falte algo con el FAT32: las tarjetas están optimizadas "para los patrones de acceso que se observan en FAT32" y no solo para FAT32. Un patrón de acceso típico en FAT será escribir un nuevo archivo, que requiere que los datos del archivo se transmitan más una actualización de FAT. La actualización FAT generalmente implicará una pequeña cantidad de bloques. Si escribiera un FTL, por lo tanto, planearía optimizar cualquier escritura que fuera más pequeña que el tamaño de mi página para ayudar al rendimiento de FAT.

Respuestas:

4

Estructura de celdas de tarjetas SD:

En la electrónica de estado sólido, una celda es un elemento de memoria capaz de almacenar uno o varios bits de información, el número de bits por celda depende de la tecnología utilizada. (SLC / MLC / TLC)

Los fabricantes utilizan diferentes tecnologías en la memoria flash para administrar su estructura, la estructura más utilizada es TLC y MLC debido al costo más económico relacionado con esas tecnologías, especialmente TLC.

Los fabricantes decidieron que esta información técnica es difícil de obtener para las tarjetas SD y las memorias USB, con respecto a otras tecnologías de tipo flash, como SSD, donde esta información casi siempre se proporciona.

Esto tiene un impacto directo en la vida del hardware pero también en la velocidad.

SLC, celda de nivel único (1 bit)

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

MLC, celda multinivel (2 o más bits)

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

TLC, celda de nivel triple (3 bits)

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

Nota :

Como las celdas pueden contener 1, 2 o 3 bits, en algunos casos el chip controlador de su tarjeta SD necesitará realizar más ciclos de acceso dependiendo del tamaño del registro y la capacidad de la celda.

Sus tarjetas Samsung probablemente estén usando una tecnología SLC o tengan un potente chip controlador.

Nota 2 :

Intenté algunas pruebas como lo haces con particiones ext4 tamaño de bloque 4 kb y 1 kb pero sin gran diferencia

intika
fuente
Las tarjetas Samsung y la tarjeta Verbatim son productos de consumo y en los últimos años, la memoria SLC no era común en tales dispositivos. Las tarjetas Samsung son MB-MP16D y MB-MS16D y la tarjeta literal es el número de artículo 44007 .
Neverland
Tal vez las especificaciones de algunos controladores están disponibles. Puedo abrir las tarjetas SD y verificar qué controladores contienen estas tarjetas, pero no puedo abrir las tarjetas microSD. ¿Hay alguna posibilidad de leer la identificación / número de producto de los controladores de las tarjetas SD a través del software?
Neverland