Ubuntu медленно копирует на флешку

Обновлено: 04.07.2024

Я пытаюсь скопировать файл 6 ГБ на флэш-накопитель USB, но он не будет копироваться.

Это связано с ограничением FAT32. Файлы размером более 4 ГБ не могут быть сохранены на томе FAT32. Форматирование флешки как exFAT или NTFS решит эту проблему.

ВНИМАНИЕ: Резервное копирование ваших данных. Форматирование удалит все данные на вашем устройстве.

Если вы не хотите переформатировать USB-накопитель или вам нужен FAT32, вы можете просто разбить большой файл на части. Большинство менеджеров архивов поставляются с опцией split, а для командной строки split Например, для вашего случая:

Увидеть man split для полной документации. Это создаст следующие файлы:

Размер файла output.file.aa точно соответствует максимальному размеру файла вашего USB-накопителя в формате FAT32, который составляет 4 гибибайта (ГиБ, это не то же самое, что гигабайт ГБ) минус 1 байт.
Спасибо Gilles за это важное дополнение.

Прежде чем вы снова сможете получить доступ к файлу, вам нужно сначала объединить его части. В системах Linux вы можете сделать это с:

Если вы боитесь, что это может привести к неправильной сортировке файлов в Bash, гарантированно ли будут использоваться расширения с подстановочными знаками?
Соответствующая команда в системах Windows:

Наряду со многими другими полезными утилитами GNU split может быть установлен и в Windows, см. утилиты GNU для Win32.

Проблема: FAT32 имеет ограничение в 4 ГБ для размера файла

Различные сценарии и файловые системы рассматриваются в поисках альтернатив с учетом

  • проблема с размером файла
  • какие операционные системы должны читать / записывать USB-накопитель

Только Linux

Если вы намереваетесь использовать диск только с Ubuntu (и другими дистрибутивами Linux), рекомендуется использовать файловую систему Linux, например, ext4. Таким образом, вы можете получить более высокую скорость чтения / записи (в зависимости от того, какой процесс является узким местом), и вы получите более высокую гибкость в отношении владения и разрешений.

  • Вы можете использовать программу с графическим интерфейсом gparted создать файловую систему ext4.

Полная совместимость с Linux, Windows и MacOS

У Windows проблемы с файловыми системами Linux, и я думаю, что у MacOS есть проблемы как с файловыми системами Linux, так и с NTFS. Поэтому, если вы хотите "полную совместимость" для чтения и записи, остаются только FAT32, UDF и exFAT.

FAT32 имеет ограничение в 4 ГБ (гибибайт, база 2) для размера файла.

  • Может быть создан во всех трех операционных системах.
  • Поддерживать (восстанавливать) в Windows, если у вас есть доступ к Windows.

Может поддерживаться в Ubuntu с dosfsck , который идет с пакетом dosfstools ,

где x - буква диска, а n - номер раздела, например /dev/sdb1 для первого раздела в диске б.

UDF, вероятно, не хватает инструментов для восстановления файловой системы,

  • FOSS
  • Может быть, можно найти инструменты восстановления в Windows по этой ссылке: fsck tools for UDF, и есть некоторый инструмент, доступный в виде исходного кода
  • Может быть создан в Ubuntu
  • Совместим со ссылками в стиле Linux.
  • Совместим с разрешениями в стиле Linux. Вы можете создавать и изменять разрешения для отдельных файлов (что невозможно в FAT и NTFS).
  • Раздел 10 UDF не будет запрошен для форматирования в Windows 10 (в то время как файловая система linux ext4 затронута и может быть уничтожена по ошибке).

Итак, чтобы использовать его, предполагая, что ваша флешка /dev/sdx :

Установить пакет udftools

Создать таблицу разделов и один раздел с gparted или же gnome-disks

Протрите первый мибибайт целевого раздела рискованным dd (перепроверьте командную строку!)

Протрите первый мибибайт раздела, чтобы стереть информацию о предыдущей файловой системе (или другие оставшиеся данные), чтобы предотвратить обнаружение USB-флешки как FAT после того, как она была отформатирована с помощью UDF.

-b 512 принудительно устанавливает размер блока файловой системы, равный размеру физического блока USB-накопителя, как того требует спецификация UDF. Адаптируйте его, если вам повезет с USB-накопителем с более подходящим размером блока.

После этого ваш USB-накопитель будет пригоден для чтения и записи с GNU/Linux и другими бесплатными операционными системами, но также с текущими версиями Windows (только для чтения с устаревшей версией XP) и с MacOS.

exFAT это еще один вариант. Это новый по сравнению с FAT32 и UDF и заявлено, чтобы работать хорошо

  • изначально с Windows
  • с MacOS
  • с Linux

Подробнее о exFAT

Я начал тестировать exFAT в Ubuntu. Я намереваюсь отредактировать этот ответ, когда у меня будет больше опыта его использования. Давайте начнем со следующих ссылок,

ExFAT - это проприетарная файловая система Microsoft, оптимизированная для

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

и эта командная строка для установки поддержки [чтение / запись] для exFAT в Ubuntu

Может быть создан в Windows и MacOS и в Linux с помощью следующей командной строки

где x это буква диска и i например, номер раздела /dev/sdb1 ,

Может поддерживаться в Windows.

Мои первые результаты теста:

  • Создание файловой системы exFAT хорошо работало в Ubuntu (16.04 LTS (64-bit), установленная система с ядром серии Xenial (4.4.0-93-generic), на сегодняшний день).
  • Запись и чтение файла размером более 4 ГиБ были успешными. Ubuntu и exFAT работали правильно и быстро (я проверил с md5sum и скорость была ограничена системой USB).
  • Ubuntu и Windows могли читать то, что было создано в другой операционной системе. (У меня нет MacOS для тестирования, и мне приходится полагаться на отчеты других людей.)

Windows

Поэтому, если вам нужен полный доступ для чтения / записи из Ubuntu и Windows, я бы предложил вам использовать NTFS, которая имеет журналирование и очень отлажена и отлажена как [проприетарная] файловая система для Windows. (Также возможно использовать exFAT.)

  • В Ubuntu вы можете использовать программу с графическим интерфейсом gparted создать файловую систему NTFS.
  • В Windows легко создавать файловые системы NTFS и exFAT (они являются родными).

MacOS

В MacOS можно использовать FAT32, UDF и exFAT.

Вы также можете использовать ext4 с обходным решением, Ubuntu Server с SSH-сервером на виртуальной машине. (Я думаю, что тот же обходной путь подойдет и для Windows.) Это может быть полезно, если вы собираетесь получить доступ ко многим файлам через диск и его файловую систему, но, вероятно, не с небольшим USB2-приводом.

Довольно часто возникает желание или необходимость поставить Ubuntu на USB флешку и получить возможность пользоваться своей любимой ОС на любом компьютере (лишь бы была возможность загрузиться с USB).
Делается это просто - грузимся с LiveCD Ubuntu (или с LiveUSB 1) ) и ставим систему на флешку. При этом нам не важно какая ос установлена на компьютере. Всё что нужно это сам компьютер, LiveCD/USB и отдельная флешка, на которую и будем ставить систему.

Более подробно процесс установки Ubuntu на флеш-накопитель описан тут. Как вариант - можно в качестве компьютера использовать эмулятор: VirtualBox или VmWare, (только в них бывает сложно подключить USB для установки Ubuntu). При установке через эмулятор не нужен отдельный носитель с Live системой - образ LiveCD просто подключается в виртуальный привод CD-ROM.

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

Многие смогут возразить, что имея такую флешку с установленной ОС они ей пользуются много месяцев или даже лет. Если уточнить, то выясняется, что пользуются то ей долго, а вот грузятся с нее редко и работают не подолгу. Если же работать с такой флешки ежедневно, по много часов, то «смерть» флешки не заставит себя долго ждать: 2-3 месяца, может больше, может меньше, зависит от флешки (из личного опыта создателя начальной версии этой статьи Sly_tom_cat).

Кроме того и сам процесс установки порой приводит к неприятным последствиям.

Но не надо отчаиваться и опускать руки…. Даже из не очень хорошего сырья можно сделать…, если не конфетку, то, по крайней мере, что-то съедобное!
Разберемся в причинах печального исхода и возможных методов улучшения ситуации.

Основные ошибки при установке Ubuntu на USB флешку и как с ними бороться

На флешке создаются разделы с файловой системой, которая при работе будет осуществлять большое количество записей на флешку (чем сократит ее время жизни). Это касается и разделов EXT4 и swap-раздела. Загрузчик установится так, что без флешки ваш компьютер не сможет загрузится.

Разберем подробнее эти две проблемы

Как продлить жизнь флешке

Флеш-память отличается от жестких дисков тем, что количество циклов записи обычно ограничено числами 10 и 100 тысяч записей (для разных типов флеш-памяти).

Для жестких дисков такой параметр (число циклов записи) вообще почти никогда не указывается - там быстрее происходит механический износ элементов диска. А магнитный слой на поверхности диска может перезаписываться почти бесконечно. Схемы памяти с выдерживающие до 10 тысяч записей стоят гораздо дешевле схем выдерживающих 100 тысяч… как вы думаете - какими схемами комплектуются недорогие флешки, нашедшие широкое распространение?
Но и высокая цена флешки тоже не говорит о повышенной жевучести - тут ключевое слово - тип памяти - MLC (Multi-level cell, многоуровневые ячейки памяти) выдерживает порядка 10 тысяч записей; SLC (Single-level cell, одноуровневые ячейки памяти) — более 100 тысяч. Более дорогие флешки действительно живут дольше, но достигается это другими средствами (о них - чуть позже)

Кажется что 10/100 тысяч - это много, но разберемся как эти циклы записи «съедаются» при работе ОС.

Запись на флеш-носитель происходит по-блочно (как правило - десятки килобайт), и запись последовательно двух байт в файл с интервалом между записями в несколько минут вызовет две записи одного и того же блока памяти (т.е. обновятся два раза несколько тысяч ячеек). При работе файловой системы (ФС) некоторые служебные структуры ФС обновляются постоянно:
журнал (для журналируемых ФС) - чем чаще он пишется, тем выше вероятность сохранения целостности ФС при сбоях системы или питания. Частота записи в журнал, как правило изменяема, но значения по умолчанию не совсем подходят для работы с флеш-памятью, а увеличение периодов между записью - приводит к увеличению вероятности потери целостности ФС при сбое. i-node (специальная структура в которой сохраняется заголовок файла или каталога) - при каждом обращении (даже чтение) к файлу или каталогу в i-node прописывается дата/время последнего обращения. Казалось бы - всего несколько байт, но вспомним про блочную запись, и том, что запись их идет при каждом обращении к файлу (прочитали байт - изменились, еще байт - опять изменилось). SWAP-раздел - если он используется в работе системы, то запись в него тоже очень интенсивная.

Кроме того, нужно не забывать, что лимит циклов записи действует на каждую ячейку памяти. И если на флешке в один и тот же блок сделать 10 тысяч записей, а в другие сделать по 100 записей, то блок, куда было записано 10 тысяч раз, на записи 10тысяч + сколько-то «умрет», а контроллер флешки, обнаружив 1 битый блок, может заявить, что умерла вся флешка. А даже если он этого не сделает, то этот блок будет содержать важную для работы системы или ФС информацию 2) , и результат будет практически тем же - внезапная остановка системы и невозможность прочитать данные с флешки. (!)

Как бороться со всем этим?
Для начала поймем и примем как данность:

Флешки не вечны и умирают не предупреждая !

Осознав это поймем, что и

Система на флешке - не может быть долговечной и надежной.


А поняв и приняв это, задумаемся: а нужна ли для такой системы надежность журналируемой ФС (такой дорогой ценой как сокращение времени жизни флешки и системы на ней)?
Однозначно - нет.
Итак, нам потребуется EXT4 с отключенным журналом 3) . Если разбираться с отключением журнал в EXT3/4 не хотите - просто воспользуйтесь EXT2.

Есть и другие ФС, и настройки, которые могут продлить жизнь флешке. Эти решения могут дать большие преимущества. Если есть желание - то поищите другие варианты. Особо обращает на себя внимание опция ssd файловой системы btrfs (!?)…

Избавиться от записи даты/времени последнего доступа к файлам и директориям в i-node помогают опции монтирования файловых систем noatime. Её, после установки системы, нужно будет прописать в файле /etc/fstab для всех разделов системы, которые расположены на флешке.

Вообще, эти опции не только количество записей на флешке сокращают, но и на жестком диске скорость работы ФС увеличивают.

Временные файлы и swap.
Современные компьютеры редко страдают недостатком оперативной памяти (перелом в этом отношении случился в компьютерной индустрии после значительного удешевления схем памяти). И уже при 1ГБ оперативной памяти Linux довольно редко обращается к swap, если не запускать ресурсоёмкие задачи (например кодирование высококачественного видео или редактирование огромных изображений). Если памяти 2ГБ или больше, то заставить Linux использовать swap вообще довольно сложно.
Полное отсутствие swap грозит неадекватным поведением системы при исчерпании ресурсов оперативной памяти, но вспомним, что мы с вами осознали - система на USB флешке не может быть надежной по определению. Вывод напрашивается сам собой - swap для системы на флешке - не нужен. А на компьютерах с малым объемом памяти нужно быть осторожным и стараться не запускать много приложений одновременно. Можно так же настроить ramzswap (он же - compcache): своп в оперативную память с упаковкой свопируемых станиц.
Ресурсы оперативной памяти помогут и со временными файлами - достаточно смонтировать временный каталог системы /tmp в диск организованный в памяти. Для этого нам пригодится замечательная файловая система tmpfs (даже название говорит, что она хорошо подходит для /tmp).

В /etc/fstab нужно прописать строчку:

В примере максимальный размер /tmp задан как 32 Мегабайта. Размер можно задать другой, но если ограничения не задать, то «сдуревшее» приложение, которое будет писать бесконечно во временный файл, может подвесить вашу систему.
Размер /tmp важно выбрать правильно т.к. в нем будут хранится самые разные вещи. Например видео с Youtube вы не сможете посмотреть до конца если файл с видео не влезет полностью в ваш /tmp.

Точно также стоит поступить и с /run (ранее известный как /var/run) и /var/lock (в этих каталогах хранится служебная информация актуальная только на время текущей сессии, объем - малюсенький, а вот обновления довольно регулярны). На них лимит размера можно не задавать. Можно пойти дальше и разместить в памяти и логи (/var/log), однако без логов на устройстве постоянного хранения данных (в нашем случае - на флешке) будет крайне трудно разобраться со сбоем системы, вызывающем перезагрузку (после перезагрузки - все что было в памяти - потеряется и логи будут «пустые» - только то, что туда запишется с момента загрузки системы). Лимит size для /var/log стоит задавать порядка 6-10Мб (для типичного десктоп варианта).
Общий вид файла /etc/fstab будет примерно таким:

В примере на флешке создан корень и отдельный /home 4) . Если есть еще какие-то разделы с флешки - то им тоже прописываем noatime,nodiratime.

Скорость записи на флешку - тоже «больное место» нашей системы, и сокращая число циклов записи на флеш мы не только продлим время ее жизни, но и скорость работы ОС улучшим.

Как правильно ставить GRUB

А тут все просто - загрузчик (GRUB) надо ставить на флешку. Если вы оставите предложенную установщиком установку (на первый жесткий диск в системе) то в MBR жесткого диска пропишется часть кода GRUB, который станет искать остальную часть своего кода на разделе, куда будет записан /boot при установке системы (т.е. на флешке). Вытащив флешку из компьютера вы не дадите коду GRUB-а на жестком диске найти свое продолжение. И компьютер не сможет загрузить ОС. Восстановить работу GRUB - просто. Если же надо восстанавливать загрузчик Windows, то стоит поискать информацию по восстановлению загрузчика на любом профильном форуме. Но лучше быть внимательным при установке, и не создавать себе лишнюю работу.

Подведем итоги

Если мы хотим пользоваться системой на флешке долго, и не получить разочарования от потери данных, то нужно делать так:

тип ФС для разделов системы выбираем EXT4 с отключенным журналом (или, на худой конец, - EXT2). swap не создаем (а если на компьютере есть раздел swap - то говорим инсталятору - не использовать его). GRUB устанавливаем обязательно на флешку, где и создаем разделы для установки системы. прописываем в /etc/fstab опцию noatime для всех разделов размещенных на флешке. прописываем в /etc/fstab монтирование /tmp, /run, /var/lock (и, возможно, /var/log) в tmpfs (не забываем про ограничения размеров). При использовании системы нужно регулярно делать резервную копию важных данных на другой носитель 5) (не забываем про невысокую надежность ОС на флешке и возможную внезапную кончину флеш-памяти).
А при использовании на компьютере с небольшим объемом оперативной памяти (1Гб и менее) стараемся не запускать по много ресурсоёмких задач одновременно или изучаем и настраиваем ramzswap. Кроме указанного, можно применить и другие приемы оптимизации производительности системы (эти приемы выходят за рамки данной статьи, но их легко найти в Internet-е).

А главное - никогда не забываем про вывод, к которому мы пришли в начале этой статьи. Повторю:

ОС, установленная на флешку не может быть такой же надежной и долговечной как установленная на жесткий диск.

"Подводные камни"

Есть одна досадная ошибка инсталлятора (можно сказать особенность 6) ), которая не позволяет установить Ubuntu на тот же физический диск с которого загрузился Live образ 7) . Т.е. если вы захотите загрузившись с флешки на нее же и поставить Ubunut (в другой раздел) - то вам это не удастся. Обойти эту «особенность» можно удалив «руками» запись о примонтированном разделе с флешки из /etc/mtab.

Альтернативы

Внешний жесткий диск не страдает малым числом циклов записи, однако, операционная система, работая с диском по довольно медленному интерфейсу (обычно - USB2. USB3 и e-SATA интерфейсы - значительно быстрее, но на момент написания статьи - еще не сильно распространены), также требует оптимизации. Тут пригодятся и noatime, а тоже стоит подумать - а нужен ли swap, да и /tmp полезно также разместить в памяти. А вот логи размещать в памяти - не стоит. Ну, а кроме того, внешний диск - это совсем другой размер и вес (!), да и падения для этих устройств - крайне опасны. Внешний SSD диск - довольно дорогое решение. Тоже не маленький, хотя и легче внешнего жесткого диска и падений - почти не боится (как и флешка). И там тоже есть ограничение по числу циклов записи 8) , но контроллеры твердотельных дисков используют специальные алгоритмы переразмещения записываемых блоков с учетом знаний о том, сколько записей было сделано в каждый блок памяти. Эти алгоритмы значительно продлевают время жизни такого носителя информации. Упрощенные алгоритмы переразмещения блоков используются и в некоторых (как правило - не самых дешёвых) флешках. Для их работы требуется как избыточное количество ячеек памяти, так и более быстрый и «умный» контроллер. Собственно «особый» контроллер и доп. (не доступная пользователю) память и повышают стоимость флешки… хотя, конечно основное повышение цены делают маркетологи, как обычно (!) Можно пойти и другим путем - сменить дистрибутив. Есть дистрибутивы специально «заточенные» на работу с флешки (не берусь тут перечислять их все - их легко найти). Ярким представителем таких дистрибутивов является Puppy Linux (русифицированные сборки - PuppyRus Linux). Дистрибутив этот собран минималистично 9) и с использованием самых скромных (по размерам) программ. Это позволяет в процессе загрузки разместить всю файловую систему Linux в оперативной памяти 10) . А в процессе выключения системы все изменения в ФС (произведенные за время работы) записываются однократно обратно на флешку 11) . Изменения можно скинуть и в процессе работы, если есть опасения например в возможном внезапном отключении питания, ну или просто - что бы быть спокойным, что не потеряется ничего. А самое привлекательное для любителей Ubuntu в том, что есть сборки Puppy основанные на Ubuntu. Сайт проекта PuppyRus содержит много полезной информации и инструкций.

А в чем отличие от LiveUSB

Собственно LiveUSB, созданная с файлом сохранения, по сути своей мало отличается от Ubuntu установленной на флешке. Вместе с тем, есть и ряд принципиальных различий.

Коротенько, как устроена и работает LiveUSB:
При создании LiveUSB в файловую систему флешки (FAT) копируется содержимое CD (или DVD), на флешку устанавливается простенький загрузчик syslinux, и в корне флешки создается специальный файл сохранения (внутри которого создается файловая система EXT2) - casper.rw
Когда такая флешка загружается, то корень файловой системы монтируется «хитрым» способом: сначала как корень монтируется специальный файл с упакованной, доступной только для чтения файловой системой (SquashFS), а затем «поверх» него монтируется casper.rw в режиме запись/чтение. Получается, что все необходимые для работы системы файлы лежат в SquashFS, а новые и обновленные файлы - в casper.rw. При запросе к файлу сначала проверяется нет ли его в casper.rw, а потом он ищется в SquashFS, таким образом даже системные файл можно обновить и работать с новыми версиями.
Каталоги /tmp, /run, /var/lock на LiveUSB тоже монтируются в память (tmpfs)

Что же мы получаем применительно к интересующим нас аспектам: Запись на флешку идет примерно в таком же объеме и его не получится сократить (добавив noatime в опции монтирования в /etc/fstab) т.к. монтирование корня происходит на этапе инициализации ядра системы и в /etc/fstab Live системы просто нет монтирования корня.
Производительность по записи (собственно это больное место мы особо и не рассматривали при разговоре об Ubuntu установленной на флешку) здесь будет еще похуже, запись идет в ФС EXT2, а она лежит в фале на ФС FAT.
Дополнительно, флешка всегда хранит один и тот же набор системных файлов в SquashFS и любые обновления системы будут занимать место в casper.rw, но не будут освобождать место в SquashFS и это может стать проблемой при небольшом объеме флешки.

В «сухом остатке»- у LiveUSB нет особых преимуществ 12) перед правильно установленной на флешку системой, а недостатки - присутствуют.

Когда я копирую файлы на устройство USB, это занимает намного больше времени, чем в Windows (то же самое устройство USB, тот же порт), это быстрее, чем скорости USB 1.0 (1 МБ / с), но намного медленнее, чем скорости USB 2.0 (12 МБ / с). На копирование 1,8 ГБ у меня уходит более 10 минут (это должно быть 43

Почему копирование на мой USB-накопитель происходит так медленно в Linux (и быстрее в Windows)?

Причина 1. Кэширование файлов может сделать запись медленнее или быстрее

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

Одна вещь, которую вы должны понять, это кеширование файлов. Linux (и Windows) будут использовать в противном случае "пустую" оперативную память для кэширования операций чтения / записи и ускорения их при последующих обращениях. Кэширование операций копирования для медленных устройств приводит к тому поведению, которое вы видите - "быстрое завершение" фактически записывает в кеш, а затем замедляется и останавливается, потому что фактическая сброс данных в кеше (синхронизация) на медленное устройство очень долго Если вы прервете в этот момент, данные будут повреждены (как вы заметили), поскольку синхронизация никогда не завершается.

Такое копирование в Windows может показаться более быстрым (включая заявленные скорости в МБ / с), поскольку иногда Windows не будет ожидать синхронизации и объявляет задание выполненным, как только данные записываются в кэш.

Причина 2. Запись большого количества файлов, особенно маленьких, идет медленно

Благодаря тому, как работают флэш-память и файловые системы, самая высокая пропускная способность (скорость) достигается при записи очень больших файлов. Запись большого количества маленьких файлов или даже смешанных данных, содержащих множество маленьких файлов, может сильно замедлить процесс. Это касается и жестких дисков, но в несколько меньшей степени.

Причина 3. Невозможно сравнить скорости записи на USB-накопитель и твердотельный накопитель

У меня есть супер талантливый 32 ГБ USB SSD в соседнем порту, и он работает с ожидаемой скоростью.

USB-флешка садового сорта обычно состоит из микросхем флэш-памяти, которые записываются последовательно (последовательно), и не имеет собственного кэша.

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

  • Если бы ваш SSD на 32 ГБ имел 4x 8 ГБ чипов, он все равно был бы в 4 раза быстрее, чем USB-накопитель при любой операции записи.
  • Твердотельный накопитель также содержит кэш-память ОЗУ (например, жесткие диски), поэтому он может быстро сохранять входящие данные в кэш-памяти и сообщать ОС об этом, в то время как ему все еще приходится записывать эти данные во флэш-память.

Таким образом, с одним большим файлом ваши 32 ГБ ГБ с предполагаемой структурой 4x будут в 4 раза быстрее; со многими небольшими файлами это будет в 10 или более раз быстрее, поскольку он может разумно хранить их в своем кэше.

Подводя итог, можно сказать, что это причины, по которым копирование файлов на USB-накопители может выглядеть медленнее в Linux. Это на самом деле медленнее из-за проблемы с оборудованием / драйвером или что-то еще.

Уже не помню, когда начились проблемы с производительностью при копировании файлов, но тогда я этому не придал большого значения так, как копировал файлы редко. Относительно недавно в моем распоряжении появилось высокоскоростное подключение к сети Интернет и теперь я часто копирую/качаю большие файлы и проблема падения производительности для меня стала очень актуальной.

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

Проблема

При высокоскоростной закачке торрентов, многопоточном копировании с диска на диск, на флешки, загрузка процессора зашкаливает в 100%, быстро растет LA.

При этом на файловых операциях с небольшим числом потоков всё работает хорошо.

Немного теории

  • Увеличение производительности за счет переупорядочения и слияния запросов
  • Предотвращение зависаний и перетирания считываемых данных записью
  • Честное распределение времени доступа к ресурсам разным процессам

Простейший планировщик, работающий по принципу FIFO. Переупорядочения нет, слиянию могут подлежать только запросы, находящиеся рядом в очереди. Хорошо подходит для устройств со случайным доступом, вроде Flash памяти.

Deadline

Планировщик, который ставит больший приоритет запросам на чтение, нежели запросам на запись. Запросы переупорядочиваются, но при этом время обработки запроса не должно превышать заданные пределы(по умолчанию, 0.5 с для чтения, 5 с для записи)

Для реализации используются 4 очереди: 2 очереди sorted-by-start-sector (для чтения и для записи) и 2 очереди FIFO(тоже для чтения и для записи). Обычно, запросы берутся из сортированных очередей, но если поджимает deadline(таймаут) первого запроса из очереди FIFO, то обработка запросов продолжается по сортированным очередям с этого элемента.

Лучше всего подходит для организации баз данных.

CFQ — Completely Fair Queuing

Цель этого планировщика — честное распределения времени доступа к ресурсу всех инициаторов запросов. CFQ может быть настроен для уравнивания процессов, групп процессов, пользователей.

По реализации, CFQ подразумевает по одной FIFO-очереди на инициатора запросов и переключается между очередями по алгоритму Round-robin.

Не знаю, кому нужна такая честность, но переупорядочения запросов для минимизации перемещения считывающей головки жесткого диска в этом планировщике нет.

Anticipatory

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

Планировщик Anticipatory базируется на Deadline. Подходит для десктопов, т.к. сохраняется отзывчивость подсистемы ввода вывода. Не подходит для RAID, TCQ. Плохо подходит в ситуациях, когда синхронные запросы посылаются разными процессами.

Решение

Планировщик по умолчанию в Ubuntu 10.10 — CFQ, но как показывает практика именно этот планировщик и вызывает высокую нагрузку на CPU при многопоточном копировании. Изменяем планировщик на другой, например, на Deadline и вуаля — больше нету загрузки CPU под 100%.

Для SSD дисков и Flash памяти вообще, как отмечено выше, рекомендуется использовать Noop.

Немного практики

Узнать активный планировщик

Чтобы посмотреть все доступные планировщики в системе и узнать, какой из них активен выполняем:
$ cat /sys/block//queue/scheduler
Здесь — имя блочного устройства, например sda .
Например, если диск sda , то нужно выполнить:
$ cat /sys/block/sda/queue/scheduler
На выходе получаем строку вроде этой:
noop anticipatory deadline [cfq]
В квадратных скобках указан текущий планировщик.

Смена планировщика на лету
Фиксация настройки планировщика

Далее, нам нужно заставить Ubuntu использовать выбранный нами планировщик и после перезагрузки. Для этого добавляем строку GRUB_CMDLINE_LINUX_DEFAULT="elevator=" в конфиг GRUB 2.
$ sudo nano /etc/default/grub

UPD: После внесения изменений нужно обновить конфигурацию grub:
$ sudo update-grub

Если у вас grub, а не grub2, то добавляем строку elevator= в /boot/grub/grub.conf .

Помощь в выборе планировщика

На хабре уже писали про автоматизированный выбор планировщика. Конечно, простой проверки скорости чтения недостаточно для оптимального выбора, но кое-какое представление дать может.

Полезные ссылки

Рассказав о данном твике друзьям, удивился, что никто об этом не знал, решил запостить на Хабре, вдруг кому-то пригодится.

UPD:
Данная статья рассказала лишь об одном, по сути самом простом, способе решения проблемы, связанной, c т.н. багом 12309. Есть еще советы по решению данной проблемы:
— не менять планировщик CFQ, но отконфигурировать
— поставить zen ядро
— настроить аггресивность Swap
— купить жесткий диск с аппаратным планировщиком и много оперативки(чтоб в Swap не уходить)


Данный текст распространяется на условиях лицензии CC BY-SA
Оригинальный автор (проблема, решение) — g3n1uss. Соавтор (теория, оформление) — Ваш покорный слуга.

Читайте также: