Протокол UASP ускоряет передачу файлов на Raspberry Pi 4 в полтора раза



    Разработчик Джефф Гирлинг (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, иначе вы не получите никакого выигрыша в производительности, напоминает автор.

    См. также:

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 8

      0
      был ограничен максимальной для тех времён скоростью USB 1.1 всего лишь 12 Мбит/с

      Почему тогда на режиме usb-storage dd выдал аж 100 мегабайт в секунду?

        +4
        Пассаж про USB 1.1 и 12 Мбит/с не имеет никакого смысла.
          +1
          У меня, как оказалось, есть и с UASP и без него.
          |__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
          |__ Port 2: Dev 3, If 0, Class=Mass Storage, Driver=uas, 5000M
          Проверил командой dd if=/dev/sdb1 of=iotestfile bs=1M count=100
          Получилось следующее:
          1) 104857600 bytes (105 MB, 100 MiB) copied, 8.85555 s, 11.8 MB/s
          2) 104857600 bytes (105 MB, 100 MiB) copied, 3.62346 s, 28.9 MB/s
            0
            А что такое iotestfile?
              0
              Судя по описанию команды DD это просто имя файла, который будет временно создаваться на диске.
              Оба диска стоят в NAS. Тот что обычный выдает 60 мбайт/с на запись большого файла с домашнего компьютера. Тот что с UASP выдает 80 мбайт/с
                0
                А, то-то меня такой вариант смутил.
                Мне думается корректнее делать иначе. Тестируется накопитель /dev/sda. Монтируется как /mnt/sda1.
                Если требуется измерить скорость записи, то if=/dev/zero of=/mnt/sda1/test.bin
                Если требуется измерить скорость чтения, то if=/mnt/sda1/test.bin of=/dev/null

                  0

                  Выдает ошибку
                  dd: failed to open '/mnt/sda1/test.bin': No such file or directory
                  Я понял, кажется, в первый раз тоже неправильно измерялось, поэтому скорость такая низкая. OpenMediaVault монтирует диски по-другому.
                  В итогде вот что получается с диском UASP.


                  root@RPi4:/home/pi# dd if=/dev/zero of=/srv/dev-disk-by-label-BIGHDD/Disk_X/test.bin bs=1M count=100
                  100+0 records in
                  100+0 records out
                  104857600 bytes (105 MB, 100 MiB) copied, 0.622307 s, 168 MB/s

                  Последующие тесты выдавали 109-115 MB/s


                  И без UASP


                  root@RPi4:/home/pi# dd if=/dev/zero of=/srv/dev-disk-by-label-SmalHDD/HLAM/test.bin bs=1M count=100
                  100+0 records in
                  100+0 records out
                  104857600 bytes (105 MB, 100 MiB) copied, 0.896328 s, 117 MB/s

                  Последующие тесты выдавали 69-75 MB/s
                  Добавил папку HLAM т.к. в корень почему-то писала со скоростью 12-20 MB/s

                    0
                    Перед повторными тестами нужно чистить кэш
                    sync; echo 3 > /proc/sys/vm/drop_caches

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое