Comprobando velocidad de dispositivo USB en Linux

lunes, 10 de abril de 2023
Tiempo de lectura 5 minutos

Hace solo una semana he llevado las cosas de almacenamiento personal a otro nivel, comprándome un DAS. Para quien no lo sepa, un DAS es esencialmente una caja donde poder almacenar varios discos duros y acceder a ellos, normalmente mediante USB o ESata. Entre las cosas que puedes hacer con este tipo de artefactos principalmente se encuentran tener disponibles 2, 4 u 8 discos duros para el sistema operativo (es decir, como almacenamiento secundario), lo que facilita mucho las cosas si tienes algún software como Plex, que normalmente se nutre de ingentes cantidades de datos para las que posiblemente un solo disco duro no sea ya suficiente.

El caso es que el DAS que he adquirido soporta USB 3.0. Teóricamente, las velocidades de transferencia de USB 3 llegan hasta los 5 GBIT/S. Esto obviamente no se cumple en la práctica, máxime si se trata de discos mecánicos, que tienen su velocidad más restringida por el tipo de disco duro antes que por la velocidad máxima del propio protocolo USB. Pero al disponerme a transferir archivos de un disco duro algo más antiguo a uno nuevo que adquirí junto con el DAS, me he encontrado con una sorpresa. La velocidad que podía ver en las transferencias, estas realizándose en un mismo equipo (pasando de un disco local al DAS), eran de aproximadamente 35-43 MBPS (280-344 Mbit/s). Estas velocidades eran mucho menos de lo que esperaba del protocolo, más si se tiene en cuenta que se está corriendo el DAS con discos formateados en el sistema de archivos que parece ser más rápido para Linux: EXT-4.

Lo primero que se me ocurrió revisar es si el cable del DAS estaba conectado al puerto USB 3. Aunque esta mera comprobación ha sido algo más compleja de lo que imaginé, principalmente por dos razones. La Mini PC que hace las veces de servidor cuenta con 2 puertos USB 2 y otros 2 puertos USB 3, y no tengo ojos funcionales disponibles para revisar cuáles de los conectores USB llevan las señales de USB 3. Así que mi segundo plan era revisar si el sistema operativo tenía forma de decirme si se estaba corriendo bajo USB 2 o 3.

Estas notas solo han sido probadas en Debian, pues es el sistema que corre el servidor. Aunque imagino que funcionará de manera parecida en otros sistemas.

Paso 1. Obteniendo información de los dispositivos USB

Lo primero que hay qué hacer es obtener algo de información sobre los dispositivos USB que están ya conectados en el sistema. Para esto, simplemente se puede utilizar el comando lsusb, de esta forma:

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub                                                          
Bus 001 Device 004: ID 152d:0567 JMicron Technology Corp. / JMicron USA Technology Corp. JMS567 SATA 6Gb/s bridge       
Bus 001 Device 003: ID 0bda:c821 Realtek Semiconductor Corp. Bluetooth Radio                                            
Bus 001 Device 002: ID 0764:0501 Cyber Power System, Inc. CP1500 AVR UPS                                                
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub                                                          

Especial atención habrá qué prestar aquí, pues otros dispositivos, como el adaptador de bluetooth, pueden aparecer ya que en teoría se comunican de manera interna como otro dispositivo USB más. En mi caso, el dispositivo que me interesa es fácil de identificar, pues literalmente dice en su descripción de producto “SATA 6Gb/s bridge”. La línea de ese dispositivo es la siguiente:

Bus 001 Device 004: ID 152d:0567 JMicron Technology Corp. / JMicron USA Technology Corp. JMS567 SATA 6Gb/s bridge       

De esta línea, solo nos interesará tomar 2 datos, el ID del fabricante y el Id del producto. Es el par de datos que están separados por dos puntos. En mi caso, el ID del fabricante es 152d, y el ID del producto es 0567. Es lo único que necesitaremos saber sobre este comando para conocer la velocidad reportada a la que el dispositivo estará trabajando en el puerto que lo hemos conectado.

paso 2. Consultar dispositivos

Lo siguiente que se debe realizar es buscar por el dispositivo en el directorio /sys/devices. Para esto utilizaremos el ID del fabricante, y el resultado será básicamente la ruta a otra ubicación, que utilizaremos en el paso 3 para conocer definitivamente la velocidad posible. Aquí hay qué tener en cuenta que esta velocidad que consultaremos no es la que puede soportar el dispositivo, sino la que se ha negociado en esta conexión en particular.

Para buscar por el dispositivo con el ID de fabricante 152d, hay qué ejecutar este comando. Reemplaza 152d por el ID de fabricante de tu dispositivo:

# find /sys/devices/ -name idVendor -print -exec cat {} \; | grep -B 1 152d
/sys/devices/pci0000:00/0000:00:15.0/usb1/1-6/idVendor                                                                  
152d

De la respuesta solo nos interesa la primera línea, que es una ruta completa hacia un archivo. Habrá qué copiarla para poder conocer la velocidad.

Paso 3. Consultar velocidad del dispositivo

Con la ruta que hemos copiado en el paso 2, únicamente hay qué usar el comando cat para leer ese archivo, reemplazando el último componente, llamado idVendor, por la palabra “speed”. En mi caso, la ruta y el comando quedaría de la siguiente forma:

# cat /sys/devices/pci0000:00/0000:00:15.0/usb1/1-6/speed

Si todo sale bien, podrás ver un número por pantalla, que indica la velocidad máxima a la que se puede sostener la transferencia de archivos en el dispositivo. Si el número es 480, se trata de una conexión USB 2.0, si es 5000, se trata de USB 3. En mi caso el resultado fue de 480, lo que explicaría las velocidades más cercanas a USB 2 que a USB 3. Para corregir esta situación, únicamente es necesario cambiar de conexión el dispositivo hacia otro puerto y revisar de nuevo con los pasos aquí expuestos.

Administración Linux NAS

NAS USB Velocidad