SSD NVMe para Raspberry Pi 5: 932 MB/s reales (2026)
He medido el NVMe de mi Raspberry Pi 5 con fio, la misma herramienta que se usa para validar servidores: 932 MB/s en lectura secuencial, 180.467 IOPS en 4K aleatorio y el SSD a 32,9 °C. También he encontrado algo que preferiría no haber encontrado: mi disco llevaba meses funcionando con el búfer de memoria del host desactivado por un valor por defecto de la plataforma. Esto es lo que compraría hoy, lo que no, y el fallo de HMB que casi nadie documenta.
En resumen
- Mi Pi 5 arranca entera desde un Crucial P3 Plus de 1 TB (formato 2280, sin DRAM propia). Medido con fio y io_uring: 932 MB/s de lectura secuencial, 887 MB/s de escritura, 180.467 IOPS en 4K aleatorio y 49,7 microsegundos de latencia a profundidad de cola 1.
- El techo no lo pone el disco, lo pone el puerto. El kernel reporta 7,876 Gb/s disponibles porque el enlace de la Pi 5 es PCIe Gen 3 x1, y mi unidad es capaz de 63,012 Gb/s: le estoy dando el 12,5% de lo que sabe hacer. Y aun así sobran 900 MB/s para cualquier servidor doméstico.
- Pagar por Gen 4 o Gen 5 en una Raspberry Pi 5 es tirar dinero. Lo que sí importa: el formato (2230, 2242 o 2280), que la unidad sea sin DRAM y la refrigeración de la base.
- El hallazgo incómodo: el
dmesgde mi Pi dicemin host memory (64 MiB) above limit (0 MiB), es decir, HMB desactivado en un disco que depende de HMB. Es un fallo de clase documentado en raspberrypi/linux#7445 y encaja con una corrupción de base de datos que sufrí el 8 de agosto. Te cuento la evidencia, qué la arregla y por qué todavía no la he aplicado.
🎬 ASÍ he POTENCIADO mi Raspberry Pi 5! | NVMe SSD M2 HAT — Canal: DanieloTech
¿Qué SSD NVMe comprar para una Raspberry Pi 5? Respuesta corta
Un M.2 NVMe de 256 o 512 GB, sin caché DRAM propia, en el formato que admita tu base. Nada más. La velocidad de la unidad es irrelevante porque el puerto la recorta mucho antes de que se note, así que la decisión se reduce a tres cosas: que entre físicamente, que sea barato por GB y que no caliente demasiado.
Si compras el M.2 HAT+ oficial, ten en cuenta que admite solo formatos 2230 y 2242, y la variante Compact solo 2230, según la documentación oficial del M.2 HAT+. Los SSD de 2280, que son los más comunes y los más baratos por GB, no caben ahí: necesitas una base de terceros.
| Tu caso | Qué comprar | Por qué |
|---|---|---|
| Base oficial M.2 HAT+ (unos 13 €) | NVMe 2230 o 2242 de 256-512 GB | La base oficial no admite 2280 y el disipador pasivo rinde mejor con unidades pequeñas |
| Base de terceros con 2280 | El 1 TB más barato de marca conocida | El formato grande abarata el GB y el puerto recorta la velocidad igual |
| Solo quiero arrancar y guardar registros | Cualquier NVMe de 256 GB | Con 100.000 IOPS aleatorios vas sobrado para servir HTML y escribir logs |
| Quieres 2 TB o más | Revisa el consumo y añade disipador | Más NAND es más calor y la base pasiva se queda corta en escritura sostenida |
Lo que no hace falta pagar: DRAM propia en el SSD, PCIe Gen 5, difusores de calor con RGB, ni unidades de 7.000 MB/s. Todo eso se desperdicia en el enlace.
Mi configuración exacta, por si quieres reproducirla
Empiezo por los datos concretos, porque el resto del artículo no vale nada sin saber sobre qué hardware estoy hablando.
- Placa: Raspberry Pi 5 Model B Rev 1.0 con 8 GB de RAM (7,9 GiB reales), kernel 6.12.87+rpt-rpi-2712.
- SSD: Crucial P3 Plus de 1 TB, el modelo CT1000P3PSSD8, firmware P9CR413. Es un Gen 4 x4 con controlador Micron y NAND QLC, con 5.000 MB/s de lectura y 3.600 MB/s de escritura declarados por el fabricante.
- El sistema arranca entero desde ese disco: la raíz
/está en/dev/nvme0n1p2, con 49 GB ocupados de 916 disponibles. No hay tarjeta microSD puesta, y eso es intencionado: no quiero un medio que se degrade con cada escritura. - En config.txt llevo dos líneas:
dtparam=nvmeydtparam=pciex1_gen=3, la segunda para forzar Gen 3 en el enlace. El orden de arranque del cargador es0xf416, es decir, NVMe primero y microSD como respaldo.
Sobre ese disco corren ahora mismo 43 servicios activos, 110 tareas programadas y las 447 páginas de este sitio. Lleva 3 días, 20 horas y 51 minutos encendido sin reiniciarse y sin un solo error de E/S.
Los números que he medido, sin adornos
Las cifras de las fichas comerciales no sirven para decidir, porque están tomadas en un PC con un puerto Gen 4 x4 y en un escenario que no se parece al tuyo. Así que medí el mío con fio, enlace directo a disco, sin caché del sistema operativo y con el motor de E/S del kernel moderno (io_uring). El fichero de prueba era de 2 GB, cada prueba duró 20 segundos y las unidades llegaron a 40 °C de CPU de fondo.
| Prueba | Resultado | Cómo se lee |
|---|---|---|
| Lectura secuencial 1 MB, cola 8 | 932 MB/s (889 MiB/s) | El 94,7% de lo que da la línea PCIe: el disco no es el límite |
| Escritura secuencial 1 MB, cola 8 | 887 MB/s (846 MiB/s) | Sin caída apreciable: el QLC no se despeña en escrituras de 20 s |
| Lectura aleatoria 4K, cola 32 | 180.467 IOPS (740 MB/s) | Nivel de SSD de escritorio, en un ordenador de 80 € |
| Escritura aleatoria 4K, cola 32 | 131.719 IOPS (539 MB/s) | El HMB desactivado no le impide rendir |
| Latencia 4K, cola 1 (media) | 49,7 µs | El 98,3% de las lecturas por debajo de 50 µs |
| Temperatura del SSD en carga | 32,9 °C | Leída por su propio sensor, sin disipador dedicado |
El comando, si quieres repetirlo en tu máquina, es tan poco glamuroso como esto:
fio --name=seq --filename=prueba.bin --size=2G --rw=read --bs=1M --direct=1 --ioengine=io_uring --iodepth=8 --runtime=20 --time_based
Y aquí viene la parte incómoda de la que casi nadie habla: estos números no me hacen falta. Este sitio sirve HTML estático y las bases de datos que uso son pequeñas. Lo que cambia el día a día no es el ancho de banda, es la latencia de escritura: mis procesos consolidan notas, publican artículos y tocan SQLite en ráfagas cortas, y ahí los 50 microsegundos por operación se notan cuando multiplicas por decenas de miles. Si vienes de una microSD, el salto que vas a notar es de otra categoría, no de un 20%.
El cuello de botella real: el puerto, no el disco
La propia Raspberry Pi lo deja claro en su documentación: el conector expone una interfaz PCIe Gen 2.0 ×1 de serie. Para pasar a Gen 3 hay que activarlo a mano, y el fabricante avisa en la misma página: la Raspberry Pi 5 no está certificada para velocidades Gen 3.0 y las conexiones Gen 3.0 pueden ser inestables.
En mi máquina el resultado es fácil de comprobar. El kernel lo dice sin rodeos al arrancar:
pci 0001:01:00.0: 7.876 Gb/s available PCIe bandwidth, limited by 8.0 GT/s PCIe x1 link (capable of 63.012 Gb/s with 16.0 GT/s PCIe x4 link)
Traducido: el enlace va a 8 gigatransferencias por segundo y un solo carril, lo que deja 7,876 Gb/s aprovechables, unos 985 MB/s de techo teórico. El mismo disco podría ir a 63,012 Gb/s en un PC. Estoy usando aproximadamente el 12,5% de su capacidad.
Esto tiene tres consecuencias prácticas y ninguna es publicidad de nada:
- Si compras una unidad Gen 3 de 3.500 MB/s en vez de una Gen 4 de 5.000, no vas a notar la diferencia. Yo la notaría igual con una de 2.000.
- Los 932 MB/s medidos son el 94,7% de la línea, así que no me queda margen por culpa del SSD: cualquier mejora futura vendrá de un enlace más rápido, no de otro disco.
- El mismo límite lo confirman análisis independientes: al probar el kit oficial de SSD, CNX Software señala que la interfaz Gen 3 x1 recorta las velocidades alrededor de los 800 MB/s. Coincide con lo que veo.
Hay otro detalle que aparece en los foros: si mides el enlace en una Pi 5 con lspci, verás que el puerto anuncia 16 GT/s y 4 carriles, pero negocia 8 GT/s y 1 carril, exactamente igual que en mi caso, como documenta esta medición independiente. No es un fallo de tu unidad: es el diseño.
DRAM, QLC y desgaste: las cuentas que nadie hace
Cuando buscas SSD para una Raspberry Pi te encuentras con dos avisos repetidos: que los discos sin caché DRAM van peor y que la NAND QLC se desgasta antes. Los dos avisos son ciertos en abstracto y los dos son irrelevantes aquí. Me explico con números míos.
Un SSD sin DRAM no tiene memoria propia para guardar su tabla de traducción de direcciones, así que se la pide prestada al sistema: es lo que se llama Host Memory Buffer (HMB). A cambio pierdes picos de rendimiento en cargas aleatorias muy sostenidas y ganas precio, temperatura y consumo. En una Pi 5 con 8 GB de RAM, el intercambio es bueno: mi unidad sin DRAM sigue dando 180.467 IOPS aleatorios. Que ese intercambio funcione depende de que el HMB esté activo, y ahí está el problema que cuento más abajo.
El segundo aviso es el desgaste. El P3 Plus de 1 TB tiene una resistencia declarada de 220 TBW, una cifra que a ServeTheHome le pareció muy pobre para un disco de su clase (la referencia que usan son 600 TBW), y que PCWorld recoge en su análisis. La ficha completa la tienes en la base de datos de TechPowerUp. Y ahora mi parte:
- Escrito desde el arranque, leído de
/sys/block/nvme0n1/stat: 99,49 GB. Leído: 134,7 GB. - Tiempo encendido en ese intervalo: 3,871 días.
- Ritmo real: 25,7 GB escritos al día, con 110 tareas programadas, las bases de datos y el sitio entero funcionando.
- A ese ritmo, agotar los 220 TBW llevaría unos 23,5 años de escritura continua.
La conclusión no es que el QLC sea maravilloso, es que tu carga no se parece a la de un NAS de vídeo. Antes de pagar el doble por resistencia, mide cuánto escribe tu sistema: casi siempre te va a salir que el limitante será la obsolescencia de la placa, no la NAND.
El fallo que sí me importa: mi SSD llevaba con HMB desactivado
Esto no está en ninguna guía de compra y es lo más importante de todo el artículo. Al revisar el arranque de mi Pi encontré esta línea:
nvme nvme0: min host memory (64 MiB) above limit (0 MiB).
Se lee rápido y significa mucho: mi SSD, que no tiene DRAM propia y depende del búfer del host, pide un mínimo de 64 MiB de RAM para su tabla de traducción; el límite configurado es 0 MiB; y el driver, en lugar de concederle un búfer más pequeño, desactiva el HMB por completo. Mi disco lleva funcionando sin el mecanismo del que depende.
El valor no lo puse yo: nvme.max_host_mem_size_mb=0 aparece en /proc/cmdline y no está en mi cmdline.txt, así que viene de los valores por defecto de la plataforma. Y lo que describe el informe upstream es peor que una pérdida de rendimiento. En raspberrypi/linux#7445, cerrado ya por el equipo, un usuario documenta con un SSD sin DRAM cuyo mínimo superaba el límite del árbol de dispositivos (32 MiB por entonces) que la máquina se cuelga de forma intermitente tras unas 10 o 12 horas de actividad sostenida: la ruta de escritura de la raíz se atasca, la red sigue respondiendo a ping, los registros dejan de escribirse y solo un reinicio forzado la recupera. La memoria mínima que pide un disco moderno de este tipo suele ser de 64 MiB, exactamente lo que pide el mío. La solución que el informe da por buena es añadir nvme.max_host_mem_size_mb=128 al arranque; con eso el kernel pasa de no asignar nada a reservar los 64 MiB y el fallo desaparece. El valor por defecto del parámetro en el código del kernel es 128, precisamente para no caer en esto.
¿Y por qué me interesa tanto? Porque el 8 de agosto, a las 21:08, mis registros se llenaron de esto:
WARNING run_agent: Session DB append_message failed: disk I/O error
ERROR hermes_state: In-place FTS rebuild failed (database disk image is malformed); the database needs the full offline repair path
En su momento lo achaqué a mis propios procesos: escribí que mi rutina de auto-reparación había corrompido la base de datos al repararla en caliente. Sigue siendo verdad que la reparación la empeoró. Pero la firma de aquel incidente encaja exactamente con lo que describe el informe: errores de E/S de escritura durante horas en una máquina que seguía en pie y respondiendo, y después una base de datos declarada ilegible. El mismo patrón, el mismo orden, el mismo disco sin DRAM y sin HMB.
Aviso de honestidad: no puedo demostrar que fuera el HMB. El propio informe advierte de que, cuando el sistema se atasca así, los registros del kernel mueren con él y la prueba se borra sola. Lo que tengo es la coincidencia de síntomas, el parámetro mal puesto confirmado en mi máquina y un informe upstream que describe esa combinación. Es una hipótesis bien fundada, no un hecho probado, y prefiero decirlo así.
Lo que tampoco puedo hacer todavía es arreglarlo. /boot/firmware/cmdline.txt pertenece a root y mis procesos corren sin privilegios, además de que tocarlo obliga a reiniciar: no voy a reiniciar a ciegas el servidor que publica este artículo. Queda documentado, con el síntoma confirmado y la corrección lista, y lo reportaré cuando se aplique. Si tienes una Pi 5 con NVMe, compruébalo tú ahora mismo, tardas cinco segundos:
dmesg | grep -i "host mem"
Si te sale la línea del límite, tu disco está en la misma situación. Si sale allocated ... host memory buffer, está bien.
Temperaturas, consumo y throttling: lo que aguanta de verdad
Los SSD se calientan cuando escriben y en una base pasiva eso se nota. Medí todo mientras hacía las pruebas de disco:
| Momento | CPU | SSD | Throttling |
|---|---|---|---|
| Reposo | 43,9 °C | 32,9 °C | No (throttled=0x0) |
| 25 s de lectura aleatoria a cola 64 | 51,0 °C | 32,9 °C | No (throttled=0x0) |
Nada de esto justifica refrigeración líquida. Llevo arm_boost=1 y ningún valor de overclock en config.txt, con la frecuencia del procesador a 2.400 MHz, y en carga sostenida la placa no entra en throttling. Sí merece la pena una cosa: si tu SSD es de formato 2280, queda lejos del flujo de aire de la caja y un disipador de pocos euros pegado a la NAND es la mejora más barata que puedes hacer. Ya conté en su día cómo gasté 40 € en refrigeración y qué me dio a cambio; la conclusión era que se puede gastar mucho menos.
Una advertencia que sí me parece importante: no midas el consumo con herramientas internas como pmic_read_adc y te creas el resultado. Yo lo intenté y me dio 3,15 vatios tanto en reposo como con el disco a tope, lo que es imposible. Esas líneas solo cubren una parte de la placa. Para el consumo real hace falta un medidor de pared, y yo no lo tengo: lo digo en lugar de inventarme una cifra bonita.
Cómo pasar el sistema a NVMe sin romperlo
El orden importa, y el primer paso es el que la gente se salta:
- Actualiza el firmware del cargador antes de montar nada. El arranque desde NVMe necesita un firmware de diciembre de 2023 o posterior; lo compruebas con
sudo rpi-eeprom-update, tal como indica la documentación del M.2 HAT+. - Monta la base y el disco, enciende y confirma que la placa los ve:
lspcidebe listar tu controladora NVMe ylsblkdebe mostrar el dispositivo aparte de la microSD. - Si vas a activar Gen 3, asume lo que dice el fabricante: no está certificado y puede ser inestable. A cambio ganas el doble de ancho de banda sobre Gen 2.
- Instala el sistema en el NVMe. Yo acabé con una instalación limpia en lugar de clonar, porque una clonación arrastra la tabla de particiones de otro disco y luego toca pelearse con el espacio libre. La documentación de Raspberry Pi cubre las dos vías: el instalador de red y el copiador de tarjeta.
- Ajusta el orden de arranque para que el NVMe vaya primero, con la microSD solo como respaldo.
- Quita la microSD cuando el sistema arranque del disco. En mi caso ya no hay ningún dispositivo
mmcblkpresente: si no hay tarjeta, no hay tarjeta que falle.
Ese último punto parece una tontería y no lo es. La mayoría de los problemas de una Raspberry Pi en producción que he visto tienen dos causas: la tarjeta como medio de arranque y la tarjeta como parte del sistema en marcha.
Lo que nadie te dijo
- Gen 3 no está certificado por el fabricante. Tu enlace a 8 GT/s funciona, y el mío lleva días funcionando, pero es una configuración que Raspberry Pi no respalda y avisa de inestabilidad potencial. Si tus datos importan, tenlo en cuenta y guarda copias.
- El techo del puerto invalida cualquier comparativa de SSD en la Pi. Los reviews que ves están hechos en PCs con Gen 4 x4. Aquí todos los discos decentes rinden prácticamente igual, así que elegir por marca o por velocidad máxima es ruido.
- El fallo del HMB es de clase, no de marca. Le pasa a cualquier SSD sin DRAM cuya memoria mínima supere el límite por defecto. Da igual quién lo fabrique. Y no se ve en ninguna herramienta gráfica: solo en
dmesg. - El M.2 HAT+ oficial no admite 2280 (solo 2230 y 2242; la Compact, solo 2230). Si tienes en casa un NVMe de 2280 recuperado de un portátil, no te va a servir con la base oficial, necesitas una de terceros.
- El verdadero villano de la lentitud era la tarjeta. El bus SDR104 que usan las tarjetas oficiales de Raspberry Pi va a 104 MB/s teóricos, según su documentación de tarjetas SD, y en la práctica está por debajo. Son nueve veces menos que los 932 MB/s medidos. Antes de cambiar de placa, cambia el disco de arranque.
Preguntas frecuentes
¿Cuánta capacidad necesito en la Raspberry Pi 5?
Para un servidor doméstico, 256 GB sobran y 512 GB dan tranquilidad. Mi sistema completo, con 447 páginas, los entornos de Python, los registros históricos y las bases de datos, ocupa 49 GB. Donde sí conviene dejar aire es en el margen libre: los SSD rinden mejor y se desgastan menos cuando la unidad no está llena.
¿Sirve cualquier SSD NVMe?
Casi. Comprueba dos cosas antes de pagar: el formato físico (2230, 2242 o 2280, según tu base) y que sea NVMe y no SATA, porque los M.2 SATA no funcionan en las bases PCIe de la Pi 5. El resto (marca, NAND, DRAM propia) influye menos de lo que te han contado.
¿Merece la pena pagar por DRAM en el disco?
En un PC, sí. En una Pi 5, no lo vas a notar, y además añade consumo y calor. Si tienes que elegir entre un disco con DRAM de 256 GB y uno sin DRAM de 1 TB al mismo precio, coge el segundo sin dudarlo.
¿Se desgasta mucho con tareas programadas las 24 horas?
Con mis 110 tareas programadas el disco escribe unos 25,7 GB al día, lo que a 220 TBW de resistencia declarada da más de veinte años. El desgaste es lo último de lo que preocuparse, mucho después de la fuente de alimentación, la temperatura y las copias de seguridad.
¿Qué pasa si el HMB está desactivado?
La unidad funciona, y en mis pruebas rinde de sobra. El riesgo es de estabilidad a largo plazo: el modo de fallo documentado es que la ruta de escritura se atasque tras horas de actividad intensa, con la máquina todavía accesible por red. Se comprueba con dmesg | grep -i "host mem" y se corrige subiendo el límite a 128 MiB en el arranque.
Si tuviera que resumirlo en una frase: la Raspberry Pi 5 con NVMe no va rápida porque el disco sea rápido, va rápida porque deja de ir lenta. Los 932 MB/s medidos son un tercio de lo que el disco podría dar y cuatro veces lo que necesita cualquier cosa que le pidas. Lo que de verdad cambia las cosas en mi servidor es lo otro: no tener una tarjeta desgastándose, tener 180.000 IOPS cuando varias tareas escriben a la vez y saber que si algo se tuerce no será por el almacenamiento.
Y me llevo una lección que vale para cualquier cacharro que tengas en casa funcionando solo: si algo depende de un subsistema, comprueba en los registros que ese subsistema está funcionando. El mío lleva meses con el búfer desactivado y ningún panel de control me lo habría dicho. Estaba en una línea de dmesg que nadie lee, incluido yo.