Разработчик Джефф Гирлинг (Jeff Geerling) провёл эксперименты с внешними USB SSD для Raspberry Pi 4 и выяснил, что USB 3.0 SSD работает примерно в десять раз быстрее, чем самая быстрая карта microSD, которая попадала ему в руки.
Но в комментариях к видео ему подсказали одну интересную идею. Один из комментаторов обратил внимание, что тестируемый корпус-адаптер для внешнего диска Inateck USB 3.0 SATA не поддерживает протокол UASP.
Без UASP внешний диск монтируется как Mass Storage Device и работает в режиме Bulk Only Transport (BOT), который ещё в древние времена был ограничен максимальной для тех времён скоростью USB 1.1 всего лишь 12 Мбит/с. И это при том, что у USB 3.0 теоретически максимальная скорость составляет 5 Гбит/с, то есть в 400 раз больше!
Старый BOT передаёт файлы кусками, и каждый из них передаётся строго по очереди, без какого-либо использования буферизации и параллелизации.
Поэтому был создан новый протокол USB Attached SCSI Protocol или UASP.
Если не вдаваться в технические подробности, высокопроизводительный протокол SCSI обладает многими полезными функциями, такими как параллельная передача или передача вне очереди (out of order data transfer), так что диск может использовать буферизацию и кэширование для улучшения производительности.
Когда появился стандарт USB 3.0, его внедрили в большинство устройств хранения USB и адаптеров для жёстких дисков. А которые не могли этого сделать, обновили прошивку, чтобы поддерживать протокол UASP при взаимодействии с более новыми дисками для повышения производительности.
Поэтому после такого комментария Джефф Гирлинг провёл работу над ошибками — и заказал UASP-версию того же корпуса адаптера Inateck USB 3.0 SATA. Внешне они совершенно одинаковы, просто один поддерживает этот протокол, а другой — нет.
Зато различия видны в плате контроллера. Старая версия вверху, новая с совершенно иной принципиальной схемой — внизу. Здесь новая не только схема, но и микросхема контроллера.
На Raspberry Pi можно посмотреть характеристики подключённых дисков следующей командой:
$ lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
|__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=uas, 5000M
Она выводит список всех существующих USB-устройств с драйверами. Если в строке
Driver
указано uas
(как в этом листинге), то диск поддерживает UASP. Если же там указано usb-storage
, то устройство работает по протоколу BOT. Судя по всему, большинство адаптеров USB 3.0, выпущенные в последние примерно пять лет, должны поддерживать UASP.
К сожалению, Raspberry Pi 3 B+ и более старые версии Raspberry Pi с интерфейсами USB 2.0 не поддерживают UASP на уровне драйверов.
На КДПВ приведены результаты бенчмарков на Raspberry Pi 4 с включенным UASP и без него:
Как видим, скорость передачи данных в тестах hdparm и dd увеличилась на 50 % и 40 %, соответственно.
Внизу на верхней диаграмме результаты теста на случайный доступ, который более реалистично отражает реальную работу с устройством. И здесь UASP вносит серьёзный вклад. Случайные чтения ускоряются на 35%, случайные записи — на 20 %.
Более того, с UASP сократилось даже энергопотребление устройства с 5,29 до 4,87 ватта (на 8 %).
Проверить данные и методологию можно в этом репозитории turing-pi-cluster.
И не забывайте подключать устройства USB 3.0 в синие порты на Raspberry Pi 4, а не в чёрный порт USB 2.0, иначе вы не получите никакого выигрыша в производительности, напоминает автор.
См. также: