# Desgaste de la flash

Un MikroTik RB5009 escribe en su NAND en reposo: verlo en los contadores YAFFS, llegar a la regla de log que lo causa y leer los ECC que avisan antes.

Source: https://docs.jmrp.io/mikroscope/es/playbooks/flash-wear/

**En resumen:** el RB5009 de referencia escribía en su NAND en reposo porque una
regla de log mandaba el tema `dns` a disco; los contadores YAFFS de escrituras de
página y de borrados muestran escrituras así, y `/system/logging` encuentra su
causa. Si la flash en sí se está desgastando es cosa de los contadores ECC,
legibles con `privileged=yes`: un `corrected_bits` que sube avisa antes de que se
pierda un bloque, y todos marcaban 0 el 2026-09-14.

No se provocó nada: el RB5009 escribe en la NAND por su cuenta, y la fuente
`yaffs` del agente lo muestra. Las cifras de MTD son del 2026-09-14.

Medido en RB5009UG+S+ · 4 × 1,4 GHz Cortex-A72 · RouterOS 7.24.2 · Linux 5.6.3 · 2026-09-12 · agente a 10 Hz en un contenedor privilegiado efímero

## Escrituras en reposo

En una ventana de 30 segundos en reposo, la partición Main recibió **2 escrituras
de página y 14 lecturas de página**; en otra, cero. No hay gráfico: las ventanas
se leyeron en la campaña del 2026-09-12, anterior al historial del almacén
InfluxDB de referencia (desde el 2026-09-19).

Busca la causa en las acciones de log que escriben a disco:

```routeros
/system/logging/print where action="disk"
#  TOPICS  ACTION
30 dns     disk
```

El tema `dns` registra en disco, que es también la razón de que el log de este
equipo guarde decenas de miles de filas. Si los deltas de `pw` (escrituras de
página) o `er` (borrados) suben, pregúntate qué empezó a escribir.

## Campos de YAFFS

| Campo       | Significado                     | Léelo como                                                                                                            |
| ----------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| `er`        | borrados                        | el contador que corresponde a la _vida útil_ de la flash                                                              |
| `pw` / `pr` | escrituras / lecturas de página | la carga de trabajo                                                                                                   |
| `gcc`       | copias del GC                   | amplificación de escritura: `gcc` ≫ `pw` significa que el sistema de ficheros trabaja mucho por cada byte que guardas |
| `gc`        | recolecciones de basura         | con qué frecuencia recolectó el sistema de ficheros                                                                   |
| `bad`       | bloques defectuosos             | un nivel, y tiene que seguir en 0                                                                                     |
| `free`      | chunks libres                   | margen                                                                                                                |

En `/metrics` los contadores son `mikroscope_flash_operations_total{device,kind}`
con `kind` uno de `page_writes`, `page_reads`, `erasures`, `gc_copies` y `gcs`;
los niveles son `mikroscope_flash_bad_blocks` y `mikroscope_flash_free_chunks`.

Con los suelos por fuente por defecto, los contadores se leen en cada tick y solo
se guardan cuando un contador se movió o cambió el nivel de chunks libres, lo que
en el equipo de referencia ocurre unas 0,04 veces por segundo (unas pocas veces
por minuto). Que falte una fila `flash` en una muestra significa que no pasó
ninguna de las dos cosas, no que la fuente no exista.

## Boot y Main

Se informa de los dos dispositivos YAFFS. Tras dos semanas, la partición **Main** mostraba 83 812 escrituras de página y 1 579
borrados, mientras que la partición **Boot** mostraba **6** escrituras de página y
16 borrados en toda la vida del equipo: Boot solo se escribe en una
actualización de firmware.

## Contadores ECC

Con `privileged=yes` también se pueden leer los contadores ECC de MTD, desde
`/sys/class/mtd`: `corrected_bits`, `ecc_failures` y `bad_blocks`. Todos están a
cero en un equipo sano. Que `corrected_bits` suba es NAND que envejece;
`ecc_failures` es pérdida de datos.

El recuento de bloques defectuosos de YAFFS es la autopsia: un bloque solo se
retira después de que el ECC haya fallado en él. El recuento de bits corregidos es
el indicador adelantado, porque sube a medida que las celdas se debilitan. El
kernel publica también el techo: `bitflip_threshold` es el número de bits
corregidos por paso de ECC a partir del cual mueve los datos fuera de un bloque, y
`ecc_strength` es el máximo de bits por paso que el código puede corregir.

En el RB5009 de referencia, el 2026-09-14, había tres particiones —
`RouterBoard NAND 1 Boot` (8 MiB), `RouterBoard NAND 1 Main` (1 GiB) y
`RouterBoot` (1 MiB SPI) — con `corrected_bits`, `ecc_failures`, `bad_blocks` y
`bbt_blocks` todos a 0, y `bitflip_threshold` 12 y `ecc_strength` 16 en la NAND.

En una muestra son filas `mtd` (`corr`, `fail`, `bad`, `bbt`,
`bitflip_threshold`, `ecc_strength`); en `/metrics`,
`mikroscope_mtd_ecc_corrected_bits_total{device,partition}`,
`mikroscope_mtd_ecc_failures_total`, `mikroscope_mtd_blocks{kind="bad"|"bbt"}`,
`mikroscope_mtd_bitflip_threshold` y `mikroscope_mtd_ecc_strength`. Son acumulados desde el arranque y se envían tal
como se leen, nunca como diferencias, porque se mueven a la escala de la vida de
un equipo. El agente los lee cada 10 s: una cadencia arbitraria y holgada, no un
suelo medido.

## Por qué `--ephemeral`

Esta es la fuente que justifica `--ephemeral`: un despliegue con la raíz y la
imagen en tmpfs no añade nada a estos contadores.

## Firma

**No hizo falta provocarlo** · 2026-09-12

- Deltas de `pw` y `er` en reposo que no has causado tú: algo está configurado
  para escribir. Mira primero las acciones de `/system/logging` puestas a `disk`.
- `gcc` muy por encima de `pw`: el sistema de ficheros está pagando amplificación
  de escritura.
- `corrected_bits` subiendo, o cualquier `ecc_failures` o bloques `bad` nuevos: la
  propia flash, no la carga de trabajo.

> **No medido, luego no afirmado**
>
> Una flash que se desgasta. Todos los contadores ECC de MTD del equipo de referencia marcaban 0 el
> 2026-09-14, así que en el hardware de este proyecto no se observó cómo se ve un `corrected_bits`
> que sube con el tiempo, ni con cuánta antelación avisa de un bloque retirado.

## Véase también

- [Modo privilegiado](https://docs.jmrp.io/mikroscope/es/limits/privileged/): por qué los contadores ECC necesitan
  `privileged=yes`.
- [Almacenamiento y ajustes del contenedor](https://docs.jmrp.io/mikroscope/es/install/layout/): qué pone `--ephemeral`
  en tmpfs y a qué renuncia.
- [Reglas de alerta](https://docs.jmrp.io/mikroscope/es/dashboards/alerts/): la alerta de fallos de ECC no corregibles.
