La E/S en Flash (parte 1)

Como he mencionado anteriormente, una de las características principales de los dispositivos de memorias flash es que la modificación de los datos en una celda sigue el modelo “Erase before Write” y, por imposiciones en el diseño del dispositivo NAND, aunque la lectura y la escritura se realiza a nivel de página sin embargo el borrado solo puede ocurrir a nivel de bloque.

Las operaciones de E/S en flash (lectura, escritura y borrado) se rigen por la exclusión mutua a nivel del plano: si se procesa una lectura no se puede escribir y hay que esperar a que la operación anterior termine, si se procesa una escritura o borrado no es posible leer y es necesario esperar también. Además, las operaciones de E/S en flash utilizan distintas granularidades:
  • Lectura: es posible leer uno o varios bytes de forma muy rápida (50-150 micro-segundos).
  • Escritura: es posible escribir con un tamaño fijo determinado por el tamaño de página del chip, 4K, 8K o 16K, y esta operación es algo mas lenta (200-500 micro-segundos).
  • Borrado: es posible borrar pero con un tamaño fijo mucho mas grande, determinado por el tamaño de bloque o conjunto de páginas de lo forman (1MB o 2MB). Se borra a nivel de bloque, es decir, hay que borrar todas las páginas y este proceso es muy lento (hasta 2 mili-segundos).
Todo esto significa que en flash yo puedo leer con una granularidad de 1 byte, incluso puedo leer varios bytes de manera consecutiva a lo largo de varias páginas y esto es extremadamente rápido. Sin embargo, la escritura es fija a nivel de página, 8K por ejemplo, por lo que si yo solo quiero modificar un byte o 1K tengo que volver a reescribir el octeto por completo. Por si no fuera poco, en flash no existe la sobre-escritura directa del dato, hay que borrar para poder escribir de nuevo y ¡¡¡ se borra 1MB entero (128 o 256 páginas) !!!


Se hace evidente que el uso de la tecnología de almacenamiento en estado sólido en entornos empresariales es compleja y que si la tecnología flash no está gestionada correctamente puede dar rendimientos mucho peores que soluciones tradicionales basadas en disco rotacional. Basta tomar el ejemplo de un sistema de almacenamiento que sirve distintos entornos aleatorios de datos de manera concurrente, donde se están atendiendo miles de operaciones de E/S por segundo y donde una modificación del dato, o centenares, a nivel lógico (sistema de ficheros, aplicación, etc) se convierte en un proceso realmente pesado y complejo con tecnología flash.

Otro de los efectos colaterales de la tecnología es el desgaste: las celdas de memoria flash (o los FGTs) se desgastan durante el proceso de escritura y mas durante el proceso de borrado según se explicó en el post anterior, pero también se va debilitando con las lecturas e incluso con las operaciones que se realizan en celdas cercanas geométricamente dentro de la propia matriz (lo que a veces hace necesario que se tenga que volver a re-programar una celda porque su información se ha ido “desvaneciendo” con las lecturas). 
Como mencioné en la entrada anterior, el efecto del desgaste es el fallo en la E/S sobre la celda donde también se dan situaciones en las que se crean unas zonas de atrape que atascan los electrones en la puerta y complican o hacen imposible el borrado de la misma.


Por si fuera poco, la tecnología flash tiene una serie de problemas que pocos conocen, es lo que yo llamo los cuatro jinetes del apocalipsis flash:
  • Perturbaciones por programación o escritura: debido a la disposición NAND es común que haya celdas sobre las que no se está programando pero que están recibiendo cierto voltaje (estrés). Estas celdas estresadas se encuentran en el mismo bloque que aquellas que se están programando, suelen estar cercanas a éstas de hecho. Esto produce una perturbación sobre celdas que se supone que no se han seleccionado para su programación o escritura que hace que haya que volver a borrarlas para retornarlas a un estado correcto (y ya sabemos que implica esto). Esta imperfección en el funcionamiento se corrige con mecanismos de corrección de errores (ECCs).
  • Perturbaciones por lectura: al igual que con la imperfección anterior, celdas contiguas o cercanas a aquellas que se están leyendo en un bloque reciben estrés por elevado voltaje ajeno provocando el problema de perturbación que, de nuevo, se corrige borrando la celda.
  • Resistencia al desgaste: como he mencionado en el párrafo anterior, el desgaste hace que haya cargas atrapadas en el dieléctrico provocando una perturbación y haciendo que el borrado falle. En el caso de no poderse corregir re-intentando el borrado hay que marcar el bloque como defectuoso y retirarlo del servicio (lógicamente hablando).
  • Retención del dato: Con el paso del tiempo la carga varía porque la puerta flotante empieza a perder electrones (se le escapan) y cuando se llega a un umbral mínimo se marca error por retención. En este caso el dispositivo de control del flash (un FPGA generalmente) sabe que la celda no está dañada y que el bloque se marcará par su borrado y disponibilidad para programación (habiendo re-ubicado el dato tras su corrección previamente).
Por todo esto resulta evidente que el tratamiento de errores tiene que ser distinto al utilizado en tecnología de disco rotacional: en flash es mas común que solo fallen ciertas regiones o páginas y que además lo hagan incluso justo después de haber re-programado una celda (fallo en escritura silencioso) por lo que hay que implementar los mecanismos necesarios para detectar estas situaciones y corregirlas sobre la marcha (fallos a nivel de bit o múltiple bit). Por el contrario es rara la situación donde falla todo el dispositivo (al contrario que con un disco rotacional).

Comentarios

Entradas populares de este blog

Apache Spark 2.4: hacia la analítica de datos unificada

¿Qué es NVMe y porqué es clave?