Долгое копирование на флешку в ОС Linux x64

Зачастую пользователи Linux разных дистрибутивов сталкиваются с проблемой копирования данных на USB флешку. Проблема заключается в том, что копирование больших файлов сначала происходит очень быстро, а потом на нескольких процентах до завершения копирования зависает на длительное время.

Самое интересное, что иногда копирование происходило за несколько секунд, файловый менеджер выдавал окошко об успешном выполнении задачи, но на флешки продолжал мигать светодиод, свидетельствующий о том, что процесс записи еще запущен. Отмонтировать ее тоже нельзя, давалось предупреждение, что файлы будут повреждены или USB flash drive выйдет из строя.

Проблема

Я тоже столкнулся с такой проблемой. Сначала я думал, что может быть проблема в драйверах? Проблема с моим компьютером, не все железо благоприятно восприняло Debian 9. Или материнская плата работает не во всю мощность, потому как копирование в ОС Windows 7, 10 происходило ровно нормально. Четко, быстро, с процентами. Данная проблема возникала совершенно на разных компьютерах с которыми я имел дело. Но все оказалось немного иначе.

Дело в том, что в 64-ех разрядных система Linux есть известный баг, который обещают исправить с новыми обновлениями ядра. Так как шестидесяти четырех разрядные системы способны оперировать куда большими объемами памяти, то они быстро копируют файлы в кэш ОЗУ, а потом неспешно записывают из него на флешку.

Подчеркну, что описанная мной проблема возникает именно на 64-битных Linux с большим объемом ОЗУ.

Решение

Итак, для решения проблемы, в командной строке от администратора нужно выполнить следующее:

# echo $((16*1024*1024)) > /proc/sys/vm/dirty_background_bytes
# echo $((48*1024*1024)) > /proc/sys/vm/dirty_bytes

На все машины 64-bit я добавляю эти команды в файл автозапуска скриптов /etc/rc.local.

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

echo $((16*1024*1024)) > /proc/sys/vm/dirty_background_bytes
echo $((48*1024*1024)) > /proc/sys/vm/dirty_bytes
 
exit 0

 

Данное решение возможно (скорее всего) снизит производительность (скорость записи) USB устройств – но это компромисс между задержкой и скоростью. Чтобы вернуться к настройкам по умолчанию, сделайте следующее:

# echo 0 > /proc/sys/vm/dirty_background_bytes
# echo 0 > /proc/sys/vm/dirty_bytes

…которые являются значениями по умолчанию, что означает, что поведение обратной записи будет контролироваться параметрами dirty_ratio и dirty_background_ratio.

Примечание для не очень опытных пользователей linux:

файлы в каталоге /proc являются псевдо-файлами – просто каналами связи между ядром и пользовательским пространством. Никогда не используйте редактор, чтобы изменить или посмотреть на них; вместо этого воспользуйтесь приглашением терминала от суперпользователя, например, sudo (Ubuntu) или su (Debian)  и используйте echo и cat для внесения изменений.