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:
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:
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:
- Inserte la tarjeta en Raspberry Pi Modelo B
- Arrancar el sistema
- Iniciar sesión a través de SSH
- Inicie la ejecución de prueba de iozone
- 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.
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