¿Por qué mi tarjeta SD es lenta?

23

Mi tarjeta SD parece estar funcionando lentamente. Tengo una tarjeta ADATA 16 GB SDHC Clase 10. Verifiqué la lista de compatibilidad que enumera una tarjeta con especificaciones similares, y dice que está "funcionando". Incluso tareas simples como obtener un listado de directorio en un directorio pequeño pueden tomar unos segundos la primera vez que lo solicito. ¿Hay alguna herramienta que pueda usar para verificar qué tipo de rendimiento obtengo de mi tarjeta SD? Además, ¿hay algún cambio de configuración que pueda hacer para que la tarjeta SD responda más rápido?

Estoy usando la Raspberry Pi como una caja de semillas BitTorrent sin cabeza , por lo que todo lo que me encuentro se ejecuta en la línea de comandos. Estoy usando la división 240/16 para asegurarme de tener la máxima cantidad de memoria disponible.

Actualizaciones

Después de ejecutar algunas pruebas como recomendó @Krzysztof Adamski con "dd", recibí algunos buenos resultados al obtener una velocidad de lectura de 20 MB / sy una velocidad de escritura de aproximadamente 10 MB / s. Sin embargo, todavía parece tener algunos problemas de velocidad de E / S. Al probar, ejecuté los comandos "dd" en segundo plano, y ejecuté la parte superior, para ver qué estaba pasando. Noté que el proceso "mmcqd" estaba consumiendo bastante uso del procesador, entre 5% y 10%. Miré a mi alrededor en Internet y encontré muchas instancias de personas que informaron que "mmcqd" usa bastante CPU. Luego ejecuté el siguiente comando para probar la lectura y la escritura al mismo tiempo

sudo dd if=/dev/mmcblk0 of=test.dat bs=1M count=1024

Al ejecutar este comando, obtuve un rendimiento de solo 977 kB / s, y "mmcqd" informó el uso del procesador entre 10% y 25% cada 5 a 10 segundos, después de lo cual volvería a reducirse a nada. Entonces, hice algunas pruebas más. Ejecuté los siguientes dos comandos en segundo plano y luego observé lo que estaba pasando arriba.

sudo dd if=/dev/mmcblk0 of=/dev/null bs=1M count=1024 &
sudo dd if=/dev/zero of=test.dat bs=1M count=1024 &

En este caso, "mmcqd" alcanzaría un pico de alrededor del 35% del uso del procesador, pero el rendimiento fue mucho mejor a alrededor de 7.5 MB / s para lectura y alrededor de 5.3 MB / s para escritura.

Parece que hay algún tipo de problema aquí donde las escrituras pesadas hacen que el "mmcqd" bloquee el sistema. Esto hace que el demonio de transmisión disminuya a casi cero tan pronto como la velocidad sea demasiado alta mientras espera la tarjeta SD. Cuando ejecuto el demonio de transmisión, también veo que el uso de "mmcqd" es bastante alto.

Kibbee
fuente
¿Estás seguro de que la tarjeta SD causa este problema? ¿Podría primero intentar usar otra tarjeta para excluir otras partes del sistema?
Dawid Ferenczy Rogožan
¿Ha revisado su registro de syslog y kernel para mensajes relacionados con el dispositivo mmc? Algunas tarjetas simplemente no funcionan en Raspberry Pi. Algunos otros requieren un poco de ajustes para funcionar de manera confiable.
Joppe
El enlace de la tarjeta SD se ha movido
ray023
1
@ Ray023 Gracias. Actualicé el enlace. En el futuro, solo puede editar la pregunta. Creo que, como eres nuevo, la edición no se tomará de inmediato, sino que se guardará para que el póster original o algún otro usuario de alta reputación lo apruebe.
Kibbee

Respuestas:

21

Tarjeta de prueba de velocidad de lectura:

Hay dos formas fáciles de probar la velocidad de lectura (el directorio de listado es solo una operación de lectura):

  • usando el comando dd:

    sudo dd if=/dev/mmcblk0 of=/dev/null bs=8M count=100

    Esto leerá 800 MB de datos de su tarjeta SD y los descartará en / dev / null. Si lleva mucho tiempo, puede cambiar count = 100 para contar = 10 para leer solo 80MB. Una vez finalizado el comando, debe imprimir un mensaje con velocidad de lectura. Debe obtener al menos un par de MB / s.

  • usando el comando hdparm:

    sudo hdparm -t /dev/mmcblk0

    Esto debería proporcionarle un resultado de velocidad similar al del primer comando y también debería tener al menos un par de MB / s.

Tarjeta de prueba de velocidad de escritura:

No hay una manera fácil de probar la velocidad de escritura, ya que para hacerlo tendría que escribir algunos datos en la tarjeta. Si desea hacer esto en un nivel bajo (omitiendo el sistema de archivos), tendría que anular algunos datos en la tarjeta y probablemente no quiera hacerlo. Esto se puede hacer si tiene una partición de intercambio, ya que se puede desactivar fácilmente (con swapoff -a), probar con dd (con dd if=/dev/zero of=/dev/{yourswappartitionnanehare} bs=8M count=25) y luego volver a crear (con mkswap /dev/{yourswappartitionnanehare}).

Si no tiene una partición de intercambio, puede probar la velocidad de escritura del sistema de archivos también usando el comando dd:

dd if = / dev / zero of = / home / pi / testfile bs = 8M count = 25

Esto creará un archivo de 200 MB /home/pi/testfile. Puede usar cualquier otro nombre de archivo que desee.

Notas:

  • Mientras prueba la velocidad, asegúrese de que no se estén ejecutando otros programas en su sistema (como aplicaciones de torrents, etc.).
  • Después de la prueba, puede verificar la salida del dmesgcomando para ver si hay algún mensaje sobre el subsistema mmc.
  • Asegúrese de tener instalado el firmware más actualizado. Hay parches independientemente de la velocidad de la tarjeta SD de vez en cuando.
  • También es posible que desee verificar algunos firmwares antiguos, ya que puede haber algunas regresiones. La forma más fácil de hacer esto (pero no la mejor) es probar diferentes imágenes del sistema que se basan en fechas diferentes. La forma más difícil es usar github y verificar versiones históricas de archivos de firmware.
Krzysztof Adamski
fuente
Mis cumplidos. En una MacBook Air obtuve 1.4 MB / seg al escribir un archivo img en una tarjeta SD de clase 6 de 4GB. ¿¡Una prueba de lectura en el PI reportó 20 MB / segundo !?
ScrollerBlaster
Tengo lo mismo. Mi velocidad de lectura es algo así como 500 MB / seg. Estoy entendiendo algo mal?
N2O más oscuro
12

Para el rendimiento de la tarjeta SD, importa mucho si el acceso es secuencial (como con dd) o aleatorio en bloques pequeños. Las tarjetas SD, especialmente las de clase alta, parecen estar optimizadas para acceso secuencial, lo cual es bueno para almacenar fotografías o videos. Sin embargo, para ejecutar un sistema operativo de la tarjeta SD, el acceso aleatorio es más importante, ya que se leen y escriben muchos archivos pequeños. Supongo que bittorrent genera accesos algo aleatorios también.

Estos dos hilos de discusión contienen muchos puntos de referencia y discusiones sobre tarjetas SD. En general, se encontró que la velocidad de escritura aleatoria es decisiva para la capacidad de respuesta de ejecutar un sistema operativo de la tarjeta. Esta velocidad es con frecuencia mucho más baja que la velocidad de las escrituras secuenciales, que es la velocidad que a los fabricantes les gusta informar. La clase de tarjeta SD se basa en velocidades secuenciales, y las clases más bajas (4 o 6) pueden ser más adecuadas para el uso de frambuesa.

La herramienta iozone mide la velocidad de muchos patrones de acceso diferentes. He publicado breves instrucciones para compilar iozone en la frambuesa aquí .

Frepa
fuente
2
Interesante respuesta. Buena esa.
Jivings
muy interesante ya que acabo de comprar 4x clase 10 ... ¡diablos! :-(
BerggreenDK
@ BerggreenDK : Tal vez en el futuro use bien las tarjetas para un propósito diferente y luego tal vez esté feliz de haber comprado tarjetas de clase 10.
Neverland
1
La velocidad de escritura aleatoria debería tener poco efecto en tareas típicas como la secuencia de arranque o la lista de directorios. Incluso para torrentes, los resultados de las pruebas con escrituras de 4KB son irrelevantes: los tamaños de fragmentos típicos son de alrededor de 1 MB, y a menos que no tenga RAM libre, la memoria caché de disco los agrupará en escrituras secuenciales aún más grandes.
Dmitry Grigoryev
0

Escribes "bittorrent" y eso desencadena mi conjetura / respuesta.

El protocolo torrent recibe paquetes en orden aleatorio de sembradoras aleatorias.

Una vez que comience a usar torrent en cualquier sistema de archivos, se fragmentará bastante. Esto perjudicará el rendimiento a lo grande.

Por lo que sé sobre la SDCARD, está ejecutando FAT / FAT32 y eso es aún peor para manejar la fragmentación.

Así que encuentre una manera de desfragmentar su SDCARD, o copie todos los archivos y luego reinstale el sistema operativo.

Por último, escribir MUCHO (como lo hará el motor de bittorrent) desgarrará su SDCARD más rápido que el uso normal. No digo que sea incorrecto hacerlo, de hecho, me había parecido similar. Pero, esa podría ser la razón de su problema.

Desearía que hubiera un cliente torrent que transfiriera / moviera automáticamente los archivos descargados a otro destino una vez que se completara la descarga + "tiempo de carga reservado".

Entonces la desfragmentación iría mucho más rápido.

BerggreenDK
fuente
¿Cómo se aplica la fragmentación a las tarjetas SD? Pensé que la fragmentación era solo un problema en los discos giratorios, porque el archivo se ubicaría en sectores no secuenciales, lo que haría que el cabezal de lectura / escritura tuviera que moverse por todos lados para acceder a un archivo. En el almacenamiento de estado sólido, como las tarjetas SD, esto no es un problema. Sin embargo, estaré de acuerdo con usted sobre la cantidad de acciones de escritura causadas por bittorrent. Creo que eso tiene mucho que ver con el problema. Combine eso con la pequeña cantidad de memoria en el RPi (el mío tiene 256 MB) y parece ser una receta para un acceso lento al disco. También las tarjetas SD son lentas en general.
Kibbee
Bueno, la estructura FAT / FAT32 es mala y lenta una vez que comienzas a tener muchos fragmentos de archivos. Y la pequeña Frambuesa no tiene demasiado poder para moverse. Entonces, todo lo que se interponga en su camino lo ralentiza. Pero de nuevo, es solo mi suposición. No tengo hechos sobre esto.
BerggreenDK
1
El RPi ni siquiera usa FAT / FAT32. El sistema de archivos es EXT4.
Kibbee
3
La respuesta tiene un buen punto en que Bittorrent probablemente escribe datos en archivos en pequeñas piezas en orden aleatorio. Este tipo de escritura aleatoria es muy ineficiente en las tarjetas SD. Pero no creo que la desfragmentación pueda ayudar. En realidad, FAT se usa en Pi, pero solo para la partición de arranque.
Frepa
1
@Kibbee: Vea mi respuesta en raspberrypi.stackexchange.com/questions/8850/… para comprender por qué las tarjetas SD tienen sus propios problemas de fragmentación. Muchas técnicas de software que evitarían la fragmentación del disco físico (como la preasignación de archivos) son inútiles con las tarjetas SD, ya que los sectores se colocan (o mueven) cuando se escriben datos en lugar de cuando se asignan.
supercat