Bug #848

При копировании на flash-накопители скорость копирования падает, некоторые компьютеры тормозят...

Добавил(а) B. X. больше 8 лет назад. Обновлено больше 8 лет назад.

Статус:Closed Начата:20.12.2015
Приоритет:Normal Дата выполнения:
Назначена:- Готовность в %:

0%

Категория:- Затраченное время: -
Версия:-
Голоса: 0

Описание

При этом, это не слабые компьютеры, а вполне себе современные. Несколько гигабайт памяти и несколько ядер процессора. В общем, всё объяснено тут: http://linux-bash.ru/menudisk/111-2013-07-12-10-24-53.html

Привожу одновременно текст оттуда, чтобы не ходить по ссылке (я уже опробовал данный метод и работает хорошо, наблюдается стабильное копирование на флешку без каких-либо тормозов и прерывания копирования на 70-80%):

Увеличиваем скорость записи на flash-накопители и избавляемся от тормозов системы при копировании на них.

На компьютере с четырьмя гигабайтами оперативной памяти и двухядерным процессором в операционной системе Debian 6 наблюдались жуткие тормоза при копировании относительно больших файлов на флешки. Например при копировании файла размером 700 Мб процесс копирования достаточно быстро доходил до 70%, затем три минуты копировались оставшиееся 30%, при этом наблюдались жуткие тормоза. Как я понял, под дисковый кэш линукс отдает практически всю свободную память. У ядра есть буфер файловой системы, когда пишем много данных этот буфер заполняется, а потом уже происходит сброс на носитель. И, получается, что первые 70% процесса копирования фильма - быстрое копирование в буфер, после семидесяти процентов процесса копирования начинался непосредственный сброс кучи данных из буфера на флешку, при этом вся остальная работа встает, так как оперативная память занята, пока не окончится сброс на медленную флешку, в т.е. наблюдаем тормоза и слайд-шоу на экране. Ситуацию можно исправить уменьшением буфера. Я ограничил четырьмя мегабайтами (можете поэкспериментировать):

echo 4194304 > /proc/sys/vm/dirty_bytes
echo 4194304 > /proc/sys/vm/dirty_background_bytes

А теперь сохраним эти параметры, чтоб не слетело после перезагрузки. Откроем /etc/sysctl.conf:

nano /etc/sysctl.conf

и добавим туда строки:

vm.dirty_bytes = 4194304
vm.dirty_background_bytes = 4194304

Сохраняем измененный файл и сохраняем внесенные параметры командой:

sysctl -p

История

Обновлено Alexander Tratsevskiy больше 8 лет назад

Очень интересно, спасибо. Протестируем и добавим.

Обновлено B. X. больше 8 лет назад

Alexander Tratsevskiy wrote:

Очень интересно, спасибо. Протестируем и добавим.

Да, пожалуйста. Раньше, когда надо было перекинуть фильм на телефон с Андроидом постоянно плевался, думал что проблема с телефоном или с Андроидом, а когда стал на флешки что-то скидывать, увидел, что и там такая же ерунда и решил поискать в интернете решение... проблема-то древняя оказывается, просто почему-то мало кто на это обращал внимание... сейчас вообще всё хорошо, стабильно копирует с хорошей скоростью... кстати, обратил внимание, что в windows 7 подобная же ситуация, только там ещё хуже, там даже копирование между дисками ограничивается до 500 КБ/сек, недавно переустанавливал знакомым систему и подумал, что за ерунда? Оказывается, снимаешь галочку с "Удалённое разностное сжатие" в Программах и компонентах и скорость увеличивается до 25 МБ/сек. Вот так-то... как заговор какой-то...

Обновлено Alexander Tratsevskiy больше 8 лет назад

А почему именно 4 Мб? От крайности в крайность. Почему, например не 100 Мб выделить для буфера?

Обновлено B. X. больше 8 лет назад

Alexander Tratsevskiy wrote:

А почему именно 4 Мб? От крайности в крайность. Почему, например не 100 Мб выделить для буфера?

Там, в этой заметке предложено поэкспериментировать... очевидно, это зависит от параметров компьютера, при 4 мб всё стабильно работает, может так будет и при 8 и 16... я не пробовал, меня устраивает то, что операция не прерывается при 70-80% копирования и не тормозит процесс...

Обновлено Alexander Pilipenko больше 8 лет назад

вся проблема возникает из за того что по умолчанию прописаны

vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 5
vm.dirty_bytes = 0
vm.dirty_ratio = 10

что означает что 10% оперативки можно использовать как буфер, то есть например если установлено 10Гб RAM то размер буфера 1Гб, соответственно при записи файлов система пишет в основном в этот буфер и периодически его сбрасывает на диск (вроде каждые vm.dirty_writeback_centisecs), если мы пишем большой файл на медленный носитель типа флешки то весь буфер может забиваться и тогда система синхронно сбрасывает его на диск целиком, что вызывает полное зависание, значения по умолчанию хороши при небольших количествах оперативной памяти, на быстрых носителях, а так же при работе с крупными бд и при других случаях частой перезаписи мелких файлов без необходимости в отзывчивости гостевой системы, в случае обычного десктопа имеет смысл их слегка понизить например до

vm.dirty_background_ratio = 1
vm.dirty_ratio = 3

слишком низкие значения могут снизить общую скорость работы ввода/вывода в системе и повысить нагрузку на диски (что не очень хорошо например для ssd), то есть мы получаем или быструю систему которая подвисает при записи больших файлов на медленные носители или медленную но более стабильную систему

значения dirty_*bytes и dirty_*ratio взаимоисключающие, когда установлено одно то второе ставится в 0

на самом деле проценты не от общей памяти считаются а от MemFree + Cached - Mapped то есть чем больше свободной оперативки тем сильнее будут тормоза

Обновлено B. X. больше 8 лет назад

Alexander Pilipenko wrote:

вся проблема возникает из за того
vm.dirty_background_ratio = 1
vm.dirty_ratio = 3

У меня 6 ГБ оперативной памяти. И я попробовал все режимы от vm.dirty_ratio = 6 до vm.dirty_ratio = 1 и никаких тормозов в конце не появляется только при vm.dirty_ratio = 1, это означает, что скорее всего это и есть реальное значение, с которым данные перекачиваются на флешку, всё остальное это показуха (то есть, он показывает как мгновенно качает, потом останавливается, так как буфер заполнен и начинает на самом деле данные перемещать на флешку).

То есть, получается, что это где-то 60 МБ в числовом значении.
Да, флешка USB 2, надо бы ещё попробовать на USB 3 и посмотреть там результаты.

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

А нельзя ли изменить значения таким образом, чтобы только в случае копирования на медленные носители работало значение vm.dirty_ratio = 1

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

Обновлено Alexander Tratsevskiy больше 8 лет назад

  • Параметр Статус изменился с New на Feedback

Настройки закинул в шаблон. Давайте смотреть, можно будет в любой момент поправить или убрать. Менять правила в зависимости от флешки думаю не вариант :)

Обновлено B. X. больше 8 лет назад

Alexander Tratsevskiy wrote:

Настройки закинул в шаблон. Давайте смотреть, можно будет в любой момент поправить или убрать. Менять правила в зависимости от флешки думаю не вариант :)

Почему не вариант? Команда echo 4194304 > /proc/sys/vm/dirty... временно меняет параметры (до перезагрузки), интересно, а ей можно временной интервал какой-нибудь поставить...

Впрочем и так хорошо, а то с флешками и телефонами просто беда была какая-то... такое малегькое изменение, а работать намного удобнее. Спасибо!

Обновлено Alexander Tratsevskiy больше 8 лет назад

B. X. wrote:

Почему не вариант? Команда echo 4194304 > /proc/sys/vm/dirty... временно меняет параметры (до перезагрузки), интересно, а ей можно временной интервал какой-нибудь поставить...

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

Обновлено Alexander Tratsevskiy больше 8 лет назад

  • Параметр Статус изменился с Feedback на Closed

Экспортировать в Atom PDF

Спасибо!