LINUX.ORG.RU

Медленное копирование на флешку

 


1

3

Добрый день всем

Извиняюсь, что старую тему поднимаю. Видел архивные затухшие темы на этот счет. Но у меня на достаточно новой системе такая проблема

lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy

Флешек несколько штук. Все довольно новые (1-2 года) с USB 3. Последнюю вчера купил.

Когда копирую большой файл (гигов 10), то до процентов 50% добегает за пару секунд, а потом стопорится и невероятно медленно доходит до 10%. После попытки отмонтировать еще приходится столько же ждать пока система сообщит о том, что устройство отключено.

Нет ли у кого правильного рецепта это решить?

PS

  1. Да, забыл сказать, что дело не в NTFS. Я сначала его использовал, а затем стал пробовать extFAT. На нем и продолжил все эксперименты. Так вот с extFAT та же проблема.

  2. Находил такой совет

Открыть файл /etc/sysctl.conf и дописать строки:

vm.dirty_bytes = 4194304 vm.dirty_background_bytes = 4194304

применить изменения: sudo sysctl -p

Однако, эта настройка повлияет не только на флешки, но и на все файловые операции. Я не уверен в ее безопасности и правильности. Хотелось бы более верное решение.

PS2

РЕЗЮМИРУЮ ПО ТЕМЕ

Было 2 проблемы - неравномерное заполнение прогрессбара и медленное копирование (на глаз).

Посоветовали включить sync. Надо было создать файл /etc/udisks2/mount_options.conf и добавить в него строки:

[defaults]
ntfs_drivers=ntfs3,ntfs
ntfs:ntfs3_defaults=uid=$UID,gid=$GID,sync
exfat_defaults=uid=$UID,gid=$GID,iocharset=utf8,errors=remount-ro,sync

Индикация после этого стала нормальной. Но скорость копирования в сравнении с Виндой стала в 5 раз медленнее. Отключил sync, прогрессбар стал показывать не плавный прогресс, также долго стало отмонтироваться, но копироваться, и правда, стало быстрее. Причем сильно. И данные теперь с виндой совпадают.

Попутно выяснилось, что порт, в который втыкалась флешка, хоть и был синего цвета, но работал не как USB 3.

Вот выдача lsusb

lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller
Bus 001 Device 004: ID 0bda:568a Realtek Semiconductor Corp. Integrated Webcam
Bus 001 Device 003: ID 062a:4c01 MosArt Semiconductor Corp. 2,4Ghz Wireless Transceiver [for Delux M618 Plus Wireless Vertical Mouse]
Bus 001 Device 010: ID 0951:1666 Kingston Technology DataTraveler 100 G3/G4/SE9 G2/50
Bus 001 Device 006: ID 8087:0aaa Intel Corp. Bluetooth 9460/9560 Jefferson Peak (JfP)
Bus 001 Device 002: ID 09da:0025 A4Tech Co., Ltd. A4tech 2.4G Wireless Device
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub - это шина USB 3.

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub - это шина USB 2.

Bus 001 Device 010: ID 0951:1666 Kingston Technology DataTraveler 100 G3/G4/SE9 G2/50 - флешка, которая, как видно сидит на Bus 001, т.е. USB 2.

Переткнул в другой разъем и картина поменялась, на такую:

lsusb
Bus 002 Device 002: ID 0951:1666 Kingston Technology DataTraveler 100 G3/G4/SE9 G2/50
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller
Bus 001 Device 004: ID 0bda:568a Realtek Semiconductor Corp. Integrated Webcam
Bus 001 Device 011: ID 062a:4c01 MosArt Semiconductor Corp. 2,4Ghz Wireless Transceiver [for Delux M618 Plus Wireless Vertical Mouse]
Bus 001 Device 015: ID 09da:0025 A4Tech Co., Ltd. A4tech 2.4G Wireless Device
Bus 001 Device 006: ID 8087:0aaa Intel Corp. Bluetooth 9460/9560 Jefferson Peak (JfP)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

В режиме дерева:

lsusb -t   
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/8p, 10000M
    |__ Port 1: Dev 6, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/16p, 480M
    |__ Port 2: Dev 16, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 2: Dev 16, If 1, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 3: Dev 11, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 3: Dev 11, If 1, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 5: Dev 4, If 1, Class=Video, Driver=uvcvideo, 480M
    |__ Port 5: Dev 4, If 0, Class=Video, Driver=uvcvideo, 480M
    |__ Port 6: Dev 5, If 0, Class=Vendor Specific Class, Driver=rtsx_usb, 480M
    |__ Port 14: Dev 6, If 0, Class=Wireless, Driver=btusb, 12M
    |__ Port 14: Dev 6, If 1, Class=Wireless, Driver=btusb, 12M

Чтобы еще точнее убедиться можно также смотреть выдачу lsusb -v или dmesg

Копирование в медленном порту (хоть он и тоже синий) - 10 Гигов за 8 минут (с sync было 25 -28 минут). Копирование в быстром порту - 10 Гигов за 3 минуты. Причем в это время я и включаю отмонтирование (засекал по часам).

Для того, чтобы прогрессбар был плавным и не было задержек с отмонтированием можно использовать библиотеку autofsync https://github.com/i-rinat/autofsync. Воспользоваться ей можно так:

  1. Клонируем или качаем репозиторий

  2. Выполняем в рабочей копии (или каталоге с кодом репозитрия)

    cmake CMakeLists.txt
    make
    

    и получаем файл autofsync.so

  3. Копируем этот файл в удобное место; например в /home/me_user/.local/lib/ (оставшийся каталог autofsync-master можно удалить).

  4. Добавляем в ~/.bashrc алиас

alias mc='LD_PRELOAD=/home/me_user/.local/lib/autofsync.so mc'

ИТОГ

Таким образом, медленно копировалось из-за того, что один из портов в компе на самом деле работает медленнее, чем должен (не поддерживает USB3, хоть и синий). И эта проблема решилась выбором другого порта.

А прогресс бар сделать плавным и избавиться от задержек при отмонтировании можно через библиотеку autofsync. Штатных средств решения проблемы не найдено.

БОНУС

Попутно скинули ссылки по полезные ресурс по флешкам - https://www.usbdev.ru/articles/

Там информация о том как узнать реальный объем флешки и как восстановить флешку.

Хотя более человеческим языком кратко это рассказано в статье https://lifehacker.ru/kak-vosstanovit-fleshku/



Последнее исправление: it07 (всего исправлений: 3)

1)Проверте настройки bios может usb3 работает в режиме usb2. 2)Таким образом подыхает контролер на материнке 3)Возможные ошибки при загрузки dmesg | grep 'usb' 4)Что там с опциями монтирования? /etc/fstab в студию

nager
()
Ответ на: комментарий от vbr

Со скоростью понятно уже все. Впрочем, как я и писал выше.

Сейчас осталась проблема с неравномерностью. До процентов 50 добегает за несколько секунд прогресс, а затем копируется с нормальной скоростью. Это бы еще ничего, но при отмонтировании еще нужно ждать с минуту (даже 2 или 3, в зависимости от скорости флешки и объема). Причем непонятно сколько ждать.

it07
() автор топика
Ответ на: комментарий от it07

Попробуй такую команду

grep 'Dirty:' /proc/meminfo

Она будет выдавать объём данных, которые находятся в оперативной памяти и ещё не записаны на диск. Если у тебя в данный момент одна флешка, то по изменению этого числа можно спрогнозировать, долго ли ещё осталось.

Тут народ всяких скриптов понаписал, может полезно будет.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от it07

Нет такой настройки. Про синхронный режим уже писали, но он сильно роняет производительность и ещё жрёт ресурс флеша. В винде не роняет, а в линуксе роняет. Поэтому лучше без нужды его не использовать.

vbr ★★★★
()

Ты, видимо, не понимаешь, как работает запись файлов в Linux. Если сильно упрощённо, то примерно так:

  1. Ты вызываешь команду копирования файла.
  2. ОС загружает содержимое файлов в RAM. Выглядит как почти мгновенное копирование файлов на накопитель (твои быстрые 50%).
  3. В какой-то момент ОС считает, что ты настроен серьёзно, и вызывает команду sync, чтобы сбросить содержимое кэша на диск. Эта же команда вызывается и при попытке размонтировать флешку, на которой выполнялись файловые операции.
  4. При вызове sync ОС выполняет фактическую запись файлов из RAM на накопитель. А у накопителя фактическая скорость записи может быть очень низкой (твои медленные 50%).

Вот тебе информация к размышлению:

  • Копирование 1024 файлов размером по 1 МБ происходит в разы медленнее чем копирование одного файла размером 1024 МБ. Скорость падает из-за операций с файловой системой. Иногда имеет смысл сначала засунуть файлы в архив, даже без сжатия.
  • Настройки ОС тебе сильно не помогут. Ты включаешь опасные опции без понимания того, чем они управляют. Не надо так.
  • Имеет смысл скачать какую-нибудь утилиту для оценки фактической производительности дисков.
dunmaksim
()
Ответ на: комментарий от it07

ну тогда последнее - попробуй autofsync (загрузка либы через LD_PRELOAD)
Когда починят «ускоренное» копирование файлов в Linux? (комментарий) и следующее за ним сообщение - пример использования

d00fy ★★★
()
Ответ на: комментарий от d00fy

Собрал

Да, действительно, этот метод работает.

Прогресс при этом плавный и при отмонтировании думает всего пару секунд.

Также можно делать не только для mc, но работает и с dolphin.

Странно, что написана библиотека 6 лет назад, но в современных дистрибутивах приходится собирать и подключать ее руками. Неужели нет способа протолкнуть это в репы?

it07
() автор топика
Ответ на: комментарий от d00fy

Я бы не рекомендовал использовать autofsync в системе глобально. Это костыль, а не нормальное решение. Если он работает для каких-то отдельных задач — хорошо.

Думаю, эту проблему нужно решать где-то на уровне ядра, а не вот такими костылями. Или хотя бы накостылить периодическую синхронизацию в сами файловые менеджеры, чтобы они вызывали fsync на своих условиях.

i-rinat ★★★★★
()