Есть ли способ замедлить процесс копирования в Linux?
У меня большой файл, скажем, 10 ГБ, и я хотел бы скопировать его в другой каталог, но я не хочу копировать его с полной скоростью. Допустим, я бы хотел скопировать его со скоростью 1 Мб / с, а не быстрее. Я хотел бы использовать стандартную cp
команду Linux .
Это возможно? (Если да, то как?)
Изменить : так, я добавлю больше контекста к тому, что я пытаюсь достичь.
У меня проблема в системе ArchLinux при копировании больших файлов через USB (на USB-диск, USB-диск и т. Д.). После заполнения кеша usb-буфера моя система перестает отвечать (даже мышь останавливается; она движется только спорадически). Операция копирования все еще продолжается, но она занимает 100% ресурсов коробки. Когда операция копирования завершается, все возвращается к нормальной жизни - все снова становится идеально отзывчивым.
Может быть, это аппаратная ошибка, я не знаю, но я знаю, что у меня есть две машины с этой проблемой (обе на ArchLinux, одна для настольного компьютера, вторая для ноутбука).
Самым простым и быстрым «решением» этого (я согласен, что это не «реальное» решение, а просто уродливый «взлом») было бы предотвратить заполнение этого буфера путем копирования файла со средней скоростью записи на USB-накопителе, для мне этого будет достаточно.
источник
ionice
может использоваться, чтобы гарантировать, что ваш процесс копирования с диска на диск имеет запланированный ввод-вывод с более низким приоритетом, чем обычные процессы.cat file | pv -L 3k > outfile
. Тем не менее, это не то же самое, что использование cp (1).Ответы:
Вы можете задушить трубу с
pv -qL
(илиcstream -t
обеспечивает аналогичную функциональность)-q
удаляет отчеты о прогрессе stderr-L
Предел в байтах.Подробнее о
--rate-limit/-L
флаге отman pv
:На этот ответ изначально указывалось,
throttle
но этот проект больше недоступен, поэтому он выпал из некоторых систем пакетов.источник
cp
не может быть замедлено, то использование пользовательской команды является единственным вариантом, я думаю.rsync
pv
. Спасибо.Вместо этого
cp -a /foo /bar
вы также можете использоватьrsync
и ограничивать пропускную способность по мере необходимости.Из
rsync
руководства пользователя:Итак, команда actall, также показывающая прогресс, будет выглядеть так:
источник
/dev/zero
или/dev/random
rsync -a --bwlimit=1500 /source /destination
отлично работает для копирования гигантских папок со скоростью 1,5 МБ / с (что является хорошим компромиссом между предотвращением замедления работы любого сервера и не20m
, это поддерживается не на всех платформах, так что лучше придерживаться нотации KBytes.cgexec -g ... cp /in /out
не работал все время (из терминала работал несколько раз, из сценария никогда), и я понятия не имею, почему ...Я бы предположил, что вы пытаетесь не нарушать другую деятельность. Последние версии Linux включают в себя,
ionice
что позволяет вам контролировать планирование ввода-вывода.Помимо разрешения различных приоритетов, существует дополнительная опция, ограничивающая ввод-вывод временем, когда диск в противном случае простаивает. Команда
man ionice
отобразит документацию.Попробуйте скопировать файл с помощью команды вроде:
Если две директории находятся на одном устройстве, вы можете найти, что связывание файла делает то, что вы хотите. Если вы копируете для целей резервного копирования, не используйте эту опцию.
ln
очень быстро, так как сам файл не копируется. Пытаться:Или, если вы просто хотите получить к нему доступ из каталога на другом устройстве, попробуйте:
источник
Если
ionice
решения недостаточно (почему), и вы действительно хотите ограничить ввод-вывод до абсолютного значения, есть несколько возможностей:вероятно , проще:
ssh
. Он имеет встроенный лимит пропускной способности. Вы могли бы использовать, напримерtar
(вместоcp
) илиscp
(если это достаточно хорошо; я не знаю, как он обрабатывает символические ссылки и жесткие ссылки) илиrsync
. Эти команды могут передавать свои данные по конвейеруssh
. В случае, еслиtar
вы пишете/dev/stdout
(или-
) и отправляете этоssh
клиенту, который выполняет другойtar
на «удаленной» стороне.элегантный, но не в ванильном ядре (AFAIK): цель устройства отображения
ioband
. Это, конечно, работает, только если вы можете размонтировать исходный или целевой том.немного самописного веселья:
grep "^write_bytes: " /proc/$PID/io
дает вам объем данных, записанных процессом. Вы можете написать скрипт, который запускаетсяcp
в фоновом режиме, спит, например, на 1/10-ю секунду, останавливает фоновыйcp
процесс (kill -STOP $PID
), проверяет сумму, которая была написана (и в этом случае считывает? О том же значении), рассчитывает, как долгоcp
необходимо сделать паузу, чтобы снизить среднюю скорость передачи до заданного значения, в течение этого времени он спит, просыпаетсяcp
(kill -CONT $PID
) и т. д.источник
Ваша проблема, вероятно, не с вашим компьютером, по сути, это, вероятно, хорошо. Но этот переходный слой флэш-памяти USB имеет собственный процессор, который должен отображать все ваши записи, чтобы компенсировать то, что может быть на 90% неисправным флэш-чипом, кто знает? Вы затопляете это, тогда вы затопляете свои буферы, тогда вы затопляете весь автобус, тогда вы застряли, чувак - в конце концов, именно там все ваши вещи. Это может показаться нелогичным, но на самом деле вам нужно заблокировать ввод-вывод - вам нужно позволить FTL задать темп, а затем просто идти в ногу.
(О взломе микроконтроллеров FTL: http://www.bunniestudios.com/blog/?p=3554 )
Все вышеперечисленные ответы должны работать, так что это больше "я тоже!" больше всего на свете: я был там полностью, чувак. Я решил свои собственные проблемы с помощью rsync --bwlimit arg (2.5 Мбит / с, казалось, было подходящим местом для одного безошибочного запуска - чего угодно, и я столкнулся бы с ошибками защиты от записи). rsync был особенно подходящим для моей цели, потому что я работал с целыми файловыми системами - так что было много файлов - и простой запуск rsync во второй раз решил бы все проблемы первого запуска (что было необходимо, когда я потерял терпение и попытался проскочить мимо 2.5mbs).
Тем не менее, я думаю, что это не так практично для одного файла. В вашем случае вы могли бы просто передать в dd значение raw-write - вы можете обрабатывать любой ввод таким образом, но только один целевой файл за раз (хотя, конечно, этот единственный файл может быть целым блочным устройством).
Возможно, вы обнаружите, что netcat будет немного быстрее ssh для передачи данных, если вы попробуете. Во всяком случае, другие идеи уже были приняты, так почему бы и нет?
[EDIT]: я заметил упоминания о lftp, scp и ssh в другом посте и подумал, что мы говорим об удаленной копии. Местные намного проще:
[EDIT2]: Отдайте должное: только что заметил, что в комментариях ptman избил меня примерно на пять часов.
Определенно, вы можете настроить $ bs для производительности здесь с помощью множителя - но некоторые файловые системы могут требовать, чтобы он был кратным размеру сектора целевой fs, так что имейте это в виду.
источник
--getioopt
нет,--getoptio
Проблема в том, что копия заполняет вашу память блоками «в полете», вытесняя «полезные» данные. Известная (и очень трудно исправить) ошибка в обработке ядром Linux операций ввода-вывода для медленных устройств (в данном случае USB).
Возможно, вы можете попытаться выполнить копирование, например, с помощью сценария, подобного следующему (набросок для проверки концепции, полностью не проверенный!):
регулировки
seek
иskip
наcount
каждом раунде. Нужно настроить,count
чтобы он не заполнил (слишком много) памяти, и5
чтобы он истощал.источник
Понизьте лимит грязной страницы. Ограничение по умолчанию безумно.
Создайте /etc/sysctl.d/99-sysctl.conf с помощью:
Затем запустите sysctl -p или перезагрузите компьютер.
Происходит то, что данные читаются быстрее, чем они могут быть записаны на целевой диск. Когда linux копирует файлы, они считывают их в оперативную память, а затем помечают страницы как грязные для записи в место назначения. Грязные страницы не могут быть выгружены. Таким образом, если исходный диск быстрее, чем целевой диск, и вы копируете больше данных, чем у вас есть свободная память, операция копирования израсходует всю доступную память (или, по крайней мере, независимо от того, какое ограничение для «грязной» страницы) может быть больше, чем доступной оперативной памяти) и вызывают голодание, поскольку грязные страницы не могут быть выгружены, а чистые страницы используются и помечаются как грязные по мере освобождения.
Обратите внимание, что это не решит проблему полностью ... что в действительности нужно linux, так это какой-то способ арбитража при создании грязных страниц, так что при большой передаче происходит не все доступное ОЗУ / все разрешенные грязные страницы.
источник
Эта проблема не имеет ничего общего с ошибками или сбоями в оборудовании или программном обеспечении, это просто ваше ядро, которое пытается быть доброжелательным к вам и возвращает вашу подсказку и копировать в фоновом режиме (она использует кэш в ядре: больше оперативной памяти, больше кэша но вы можете ограничить это, написав где-нибудь в / proc - не рекомендуется). Флэш-накопители работают слишком медленно, и пока ядро пишет на них, другие операции ввода-вывода не могут быть выполнены достаточно быстро.
ionice
упоминал несколько раз в других ответах это нормально. Но вы пытались просто смонтировать диск,-o sync
чтобы избежать буферизации ОС? Это, наверное, самое простое решение.источник