Запись на мой USB 3 флэш-накопитель (SanDisk Extreme SDCZ80-064G-FFP) очень медленная на Linux: 1 ГБ занимает больше 200 секунд. Используя Windows (двойная загрузка на одном компьютере), тот же файл размером 1 ГБ можно скопировать примерно за 8 секунд. Флешка отформатирована в FAT (она была предварительно отформатирована, и я не менял ее), и я хотел бы оставить ее такой, поскольку я использую ее и на Windows,
Как это исправить? Какие шаги я могу предпринять, чтобы диагностировать причину?
Я использую Manjaro/Arch с версией ядра 4.5.4-1.
Редактировать:
Во-первых: я понял, что диск отформатирован в FAT (а не в NTFS, как я изначально указал в вопросе), когда попытался смонтировать его с помощью -o big_writes
. Извините за ошибку!
Добавляю выводы команд, упомянутых в комментариях. Не вижу проблем ни с одной из них.
Вывод journalctl -f
при подключении диска, монтировании его и записи некоторых данных:
Mai 23 20:32:37 manjaro kernel: usb 2-6: USB disconnect, device number 7
Mai 23 20:32:39 manjaro dbus[608]: [system] Activating via systemd: service name='org.freedesktop.Avahi' unit='dbus-org.freedesktop.Avahi.service'
Mai 23 20:32:39 manjaro dbus[608]: [system] Activation via systemd failed for unit 'dbus-org.freedesktop.Avahi.service': Unit dbus-org.freedesktop.Avahi.service not found.
Mai 23 20:32:41 manjaro kernel: usb 2-6: new SuperSpeed USB device number 8 using xhci_hcd
Mai 23 20:32:41 manjaro kernel: usb-storage 2-6:1.0: USB Mass Storage device detected
Mai 23 20:32:41 manjaro kernel: scsi host12: usb-storage 2-6:1.0
Mai 23 20:32:41 manjaro mtp-probe[3627]: checking bus 2, device 8: "/sys/devices/pci0000:00/0000:00:14.0/usb2/2-6"
Mai 23 20:32:41 manjaro mtp-probe[3627]: bus: 2, device: 8 was not an MTP device
Mai 23 20:32:42 manjaro kernel: scsi 12:0:0:0: Direct-Access SanDisk Extreme 0001 PQ: 0 ANSI: 6
Mai 23 20:32:42 manjaro kernel: sd 12:0:0:0: [sdc] 122544516 512-byte logical blocks: (62.7 GB/58.4 GiB)
Mai 23 20:32:42 manjaro kernel: sd 12:0:0:0: [sdc] Write Protect is off
Mai 23 20:32:42 manjaro kernel: sd 12:0:0:0: [sdc] Mode Sense: 53 00 00 08
Mai 23 20:32:42 manjaro kernel: sd 12:0:0:0: [sdc] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
Mai 23 20:32:42 manjaro kernel: sdc: sdc1
Mai 23 20:32:42 manjaro kernel: sd 12:0:0:0: [sdc] Attached SCSI removable disk
Mai 23 20:32:43 manjaro dbus[608]: [system] Activating via systemd: service name='org.freedesktop.Avahi' unit='dbus-org.freedesktop.Avahi.service'
Mai 23 20:32:43 manjaro dbus[608]: [system] Activation via systemd failed for unit 'dbus-org.freedesktop.Avahi.service': Unit dbus-org.freedesktop.Avahi.service not found.
Mai 23 20:32:52 manjaro sudo[3667]: user : TTY=pts/1 ; PWD=/home/user ; USER=root ; COMMAND=/usr/bin/mount /dev/sdc1 /mnt/
Mai 23 20:32:52 manjaro sudo[3667]: pam_unix(sudo:session): session opened for user root by (uid=0)
Mai 23 20:32:52 manjaro sudo[3667]: pam_unix(sudo:session): session closed for user root
Mai 23 20:33:11 manjaro sudo[3676]: user : TTY=pts/1 ; PWD=/home/user ; USER=root ; COMMAND=/usr/bin/dd bs=1M count=1024 if=/dev/zero of=/mnt/test conv=fdatasync status=progress
Mai 23 20:33:11 manjaro sudo[3676]: pam_unix(sudo:session): session opened for user root by (uid=0)
Mai 23 20:35:01 manjaro anacron[2235]: Job `cron.daily' started
Mai 23 20:35:03 manjaro anacron[2235]: Job `cron.daily' terminated
Mai 23 20:35:45 manjaro sudo[3676]: pam_unix(sudo:session): session closed for user root
Выпуск dmesg
:
[ 2507.302345] usb 2-6: new SuperSpeed USB device number 8 using xhci_hcd
[ 2507.317395] usb-storage 2-6:1.0: USB Mass Storage device detected
[ 2507.317758] scsi host12: usb-storage 2-6:1.0
[ 2508.319922] scsi 12:0:0:0: Direct-Access SanDisk Extreme 0001 PQ: 0 ANSI: 6
[ 2508.333123] sd 12:0:0:0: [sdc] 122544516 512-byte logical blocks: (62.7 GB/58.4 GiB)
[ 2508.333353] sd 12:0:0:0: [sdc] Write Protect is off
[ 2508.333362] sd 12:0:0:0: [sdc] Mode Sense: 53 00 00 08
[ 2508.333634] sd 12:0:0:0: [sdc] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[ 2508.346488] sdc: sdc1
[ 2508.347918] sd 12:0:0:0: [sdc] Attached SCSI removable disk
Команды, используемые для монтирования и записи:
$ sudo mount /dev/sdc1 /mnt/
$ sudo dd bs=1M count=1024 if=/dev/zero of=/mnt/test conv=fdatasync status=progress
1024+0 records in
1024+0 records out
1073741824 bytes (1,1 GB, 1,0 GiB) copied, 154,158 s, 7,0 MB/s
Вывод lsusb -t
:
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 5000M
|__ Port 6: Dev 8, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/16p, 480M
|__ Port 9: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
|__ Port 10: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
|__ Port 10: Dev 3, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
Редактировать 2:Я попробовал два других ядра: 4.4.11 и 4.6.0. Запись все еще медленная с обоими. Кроме того, проблема, похоже, связана с диском, поскольку я получаю более высокую скорость передачи (90 МБ/с) для внешнего жесткого диска USB 3.
Редактировать 3:Я провел несколько тестов на Ubuntu 16.04 Live System. Результаты намного лучше (хотя все еще не очень хорошие):
ubuntu@ubuntu:/media/ubuntu/274D-D62C$ dd bs=1M count=1024 if=/dev/zero of=./test conv=fdatasync status=progress
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 12.2623 s, 87.6 MB/s
ubuntu@ubuntu:/media/ubuntu/274D-D62C$ dd bs=1M count=1024 if=/dev/zero of=./test conv=fdatasync status=progress
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 64.5742 s, 16.6 MB/s
ubuntu@ubuntu:/media/ubuntu/274D-D62C$ dd bs=1M count=1024 if=/dev/zero of=./test conv=fdatasync status=progress
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 83.6521 s, 12.8 MB/s
ubuntu@ubuntu:/media/ubuntu/274D-D62C$ dd bs=1M count=1024 if=/dev/zero of=./test conv=fdatasync status=progress
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 21.842 s, 49.2 MB/s
ubuntu@ubuntu:/media/ubuntu/274D-D62C$ dd bs=1M count=1024 if=/dev/zero of=./test conv=fdatasync status=progress
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 16.3149 s, 65.8 MB/s
Редактировать 4:Я только что попробовал еще раз, используя последнее ядро Arch/Manjaro (4.11.1), и результат немного лучше: скорость передачи данных составляет около 10 МБ/с (то есть ~100 с для 1 ГБ). Однако это все еще намного медленнее, чем в Windows.
Редактировать 5:Я наконец нашел время вернуться к этой проблеме. Запустив текущее ядро Manjaro Linux janmanjaro 5.4.74-1-MANJARO #1 SMP PREEMPT Sun Nov 1 13:43:13 UTC 2020 x86_64 GNU/Linux
, я получаю 15 - 30 МБ/с (обычно ближе к 15 МБ/с). Монтирование с помощью sudo mount -o async,flush /dev/sdc1 /mnt/
(как предложено вКрайне низкая скорость записи на USB-накопитель FAT32 в Linux) увеличивает скорость примерно на 5 МБ/с. Это до смешного медленнее, чем Windows, и также намного медленнее, чем Ubuntu.
Я также пробежал sudo fio --name TEST --eta-newline=5s --filename=test.img --rw=randrw --size=500m --io_size=10g --blocksize=4k --ioengine=libaio --iodepth=1 --direct=1 --numjobs=1 --runtime=60 --group_reportin
по совету @Mikko Rantalainen. Результаты:
Run status group 0 (all jobs):
READ: bw=3444KiB/s (3527kB/s), 3444KiB/s-3444KiB/s (3527kB/s-3527kB/s), io=202MiB (212MB), run=60001-60001msec
WRITE: bw=3432KiB/s (3514kB/s), 3432KiB/s-3432KiB/s (3514kB/s-3514kB/s), io=201MiB (211MB), run=60001-60001msec
Я пока не запускал это на Ubuntu.
решение1
Вам действительно нужна FAT? По моему опыту, реализация драйвера FAT в Linux, похоже, обращается к устройству с последовательностью, которая приводит к тому, что некоторые устройства имеют действительно низкую производительность. Я видел 10-кратное улучшение производительности некоторых флэш-устройств, когда они были отформатированы в ext4.
Учитывая, что ссылку вы предоставили в комментариях (http://www.beginninglinux.com/home/machine-related/sandisk-extreme-64-usb-3-speed-test-benchmark-review) тестировал скорость чтения и записи без разделов, возможно, ваше флэш-устройство имеет низкую производительность при доступе к нему драйвера Linux FAT. Если это правда, то оно также должно иметь плохую производительность случайного ввода-вывода в целом.
Вы можете проверить производительность устройства с помощью fio
. Перейдите в какой-либо каталог внутри устройства, которое вы хотите протестировать, и выполните следующую команду для проверки производительности со смешанной производительностью случайного чтения/записи 4К:
fio --name TEST --eta-newline=5s --filename=test.img --rw=randrw --size=500m --io_size=10g --blocksize=4k --ioengine=libaio --iodepth=1 --direct=1 --numjobs=1 --runtime=60 --group_reporting
Это создает тестовый файл размером 500 МБ, который называется test.img
, а затем начинает считывать и записывать случайные блоки по 4 КБ с глубиной очереди 1. Увеличьте , size
если у вашего устройства огромный внутренний кэш. Максимальное время выполнения этого теста составляет 60 секунд. Считайте это наихудшим сценарием для вашего устройства. Довольно быстрое флэш-устройство (Intel SSD 910) показывает здесь следующие результаты:
...
read : io=1041.4MB, bw=17773KB/s, iops=4443, runt= 60001msec
...
write: io=1038.5MB, bw=17723KB/s, iops=4430, runt= 60001msec
...
Чтобы проверить наилучший вариант, вы можете увеличить размер блока и выполнить 2 параллельных процесса с iodepth=32:
fio --name TEST --eta-newline=5s --filename=test.img --rw=randrw --size=500m --io_size=10g --blocksize=512k --ioengine=libaio --iodepth=32 --direct=1 --numjobs=2 --runtime=60 --group_reporting
Довольно быстрое флэш-устройство (Intel SSD 910) показывает здесь следующие результаты:
...
read : io=10892MB, bw=457088KB/s, iops=892, runt= 24401msec
...
write: io=9588.0MB, bw=402365KB/s, iops=785, runt= 24401msec
...
Конечно, если вы действительно хотите высоких результатов, вам следует выполнить последовательное чтение с высоким iodepth. Это должно быть близко к числам, которые вы видите в спецификациях устройств (то есть никогда в реальной жизни):
fio --name TEST --eta-newline=5s --filename=test.img --rw=read --size=500m --io_size=10g --blocksize=512k --ioengine=libaio --iodepth=32 --direct=1 --numjobs=1 --runtime=60 --group_reporting
Довольно быстрое флэш-устройство (Intel SSD 910) показывает здесь следующие результаты:
...
read : io=10240MB, bw=1468.8MB/s, iops=2937, runt= 6972msec
...
Обратите внимание, что это значение не соответствует спецификации (около 2 ГБ/с), поскольку я настроил планировщик ввода-вывода на минимально возможную задержку ( deadline
планировщик ввода-вывода с 1 > ../queue/iosched/fifo_batch
и 50 > ../queue/iosched/read_expire
).
Обратите внимание на огромную разницу между наихудшим сценарием (около 17 МБ/с) и наилучшим сценарием (около 1470 МБ/с).
решение2
Поскольку лучшего ответа нет, я просто хотел бы отметить, что ваши значения очень хороши для флеш-накопителя в целом и вполне соответствуют ожидаемому диапазону для вашего конкретного флеш-накопителя.
Маркетинговые значения, такие как скорость записи 190 МБ/с, в целом не являются устойчивыми (они действительны максимум несколько секунд, пока не заполнится внутренний буфер, и не отражают фактическую производительность флэш-памяти) и верны только для последовательных записей. Как только в дело вступает файловая система, скорость значительно падает. Скорость записи с произвольным доступом часто <1 МБ/с даже на высококачественных быстрых USB-накопителях, поэтому всего несколько случайных записей (как обычно требуют файловые системы) могут разрушить производительность записи.
Вы можете попробовать использовать более дружественную к флэш-памяти файловую систему, например, f2fs (рекомендуется ядро 4.4 или новее), которая хорошо справляется с сокращением случайных операций записи, и посмотреть, поможет ли это.
решение3
Я дам вам здесь крупицу надежды. Я смотрю на UHS-II SD-карты и USB-ридеры и наблюдаю следующее на вкладке бенчмаркинга апплета Ubuntu "Диски":
- Ubuntu 14.04 - ядро 4.4 - чтение ~140 МБ/с, запись ~50 МБ/с
- Ubuntu 17.04 - ядро 4.10 - чтение ~270 МБ/с, запись ~200 МБ/с
Они используют традиционный "драйвер usb mass-storage". Что-то изменилось в ядре между этими двумя точками, что ускоряет драйвер mass-storage.
Применяются обычные комментарии по повторному сравнительному анализу, однако наше внутреннее приложение достигает примерно на 10% более быстрого результата, чем при сравнительном анализе, поэтому они довольно хорошо отражают многие варианты использования.
Внешние жесткие диски USB на самом деле могут использовать альтернативный драйвер для универсального драйвера запоминающего устройства, поэтому их не всегда можно сравнивать напрямую.
решение4
Я знаю, что это немного устарело, но
Я был крайне расстроен, делая резервную копию сервера Ubuntu 20.04 на 12T диск расширения Seagate через USB 3. Скорость передачи данных чаще всего указывалась в килобайтах. и каждые 20 секунд все останавливалось на 10-15 секунд. Я подозреваю, что это какая-то запись в кэш.
Решения? Я перепробовал несколько вариантов из сети за последние месяцы, включая изменение формата NTFS на ext4, возню с настройками кэша, смену кабелей и т. д. и т. п. Если вас это коснулось, я уверен, что вы были в такой же ситуации. Ничего не помогло.
Вчера я вытащил HDD из корпуса. Он был помечен как Barracuda. Я вставил диск в док-станцию USB 3 на моем настольном ПК и запустил резервное копирование rsync по локальной сети. Бинго — отличная непрерывная скорость xfer
Я пришел к выводу, что проблема в контроллере в корпусе расширения Seagate, а не в Linux. То, что Expansion HDD хорошо показал себя при подключении к Windows 10, говорит о том, что он также может быть оптимизирован для этой системы.
Сейчас я переместил док-станцию на порт USB 3 на сервере Ubuntu, где она в настоящее время выполняет резервное копирование со скоростью ~50 МБ/с.
Я могу жить с этим.