Существует ли более быстрая альтернатива CP для копирования больших файлов (~20 ГБ)?

При проигрывании вокруг я заставил это работать:

mv foo/bar/poit/zoid/narf.txt

Хит входит
сохранить последний параметр.

Теперь используйте для получения в последний раз введенными в строке назад. Введите пространство и получить последнее используемое использование параметра:

Высокий звук +.

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

41
21.06.2017, 22:41
12 ответов

%CPU должен быть низким во время копии. ЦП говорит дисковый контроллер "данные захвата из секторов X–Y в буфер памяти в Z". Затем это идет и делает что-то еще (или сон, если нет ничего иного). Аппаратные средства инициировали прерывание, когда данные находятся в памяти. Затем ЦП должен скопировать его несколько раз и говорит сетевую плату "пакеты передачи в ячейках памяти A, B, и C". Затем это возвращается к выполнению чего-то еще.

Вы продвигаете ~240mbps. На гигабитной LAN необходимо смочь сделать по крайней мере 800 Мбит/с, но:

  1. Это является общим для все использующие файловый сервер (и возможно соединение между переключателями, и т.д.)
  2. Это ограничено скоростью, файловый сервер может обработать запись, имея в виду, что ее дисковая пропускная способность средств ввода-вывода совместно используется всеми использующими его.
  3. Вы не указывали, как Вы получаете доступ к файловому серверу (NFS, CIFS (Samba), AFS, и т.д.). Вы, возможно, должны настроить свое сетевое монтирование, но на чем-либо полунедавнем значения по умолчанию обычно довольно нормальны.

Для того, чтобы разыскать узкое место, iostat -kx 10 будет полезной командой. Это покажет Вам использование на Ваших локальных жестких дисках. Если можно выполнить это на файловом сервере, он скажет Вам, насколько занятый файловый сервер.

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

  • Если файлы сжимаемы, и у Вас есть быстрый ЦП, делание минимального сжатия на лету могло бы быть более быстрым. Что-то как lzop или возможно gzip --fastest.
  • Если Вы только изменитесь на несколько битов тут и там и затем передадите файл обратно, то только отправление дельт будет намного быстрее. К сожалению, rsync действительно не поможет здесь, поскольку это должно будет считать файл с обеих сторон для нахождения дельты. Вместо этого Вам нужно что-то, что отслеживает дельту, поскольку Вы изменяете файл... Большинство подходов здесь является определенным для приложения. Но его возможное, что Вы могли подстроить что-то с, например, картопостроитель устройства (см. совершенно новую цель dm-эры), или btrfs.
  • При копировании тех же данных в несколько машин можно использовать что-то как udpcast для отправки их во все машины сразу.

И, так как Вы отмечаете, что Вы не системный администратор, я предполагаю, что означает, что у Вас есть системный администратор. Или по крайней мере кто-то ответственный за файловый сервер и сеть. Необходимо, вероятно, спросить him/her/them, они должны быть намного более знакомы со специфическими особенностями установки. Ваш системный администратор (администраторы) должен, по крайней мере, смочь сказать Вам, какую скорость передачи можно обоснованно ожидать.

53
27.01.2020, 19:35

Это могло, возможно, быть более быстрой альтернативой, и Вы не забьете сеть в течение двух дней: Возьмите один или два больших USB (USB 3, если у Вас есть он), или диски FireWire, подключите его к серверу и скопируйте файлы в диск. Несите диск к своей локальной машине. Скопируйте файлы в машину.

16
27.01.2020, 19:35
  • 1
    Sneakernet может быть очень быстрым: Никогда не недооценивайте пропускную способность универсала, полного лент, швыряющих вниз магистраль. –  SplinterReality 18.06.2013, 08:52

Ваше определение эффективных назад. Более эффективное внедрение тратит впустую меньше процессорного времени. На локальной копии Вы насчитываете приблизительно 74 МБ/с пропускной способности (чтение + запись), который почти так хорош, как единственный жесткий диск собирается добраться.

10
27.01.2020, 19:35
  • 1
    Ой. Когда я сказал "эффективный", я имел в виду "быстро". –  Andrew 18.06.2013, 00:05

Если у Вас есть прямой SSH (или SFTP) доступ (спросите своего системного администратора), можно использовать scp со сжатием (-C):

scp -C you@server:/path/to/yourfile .

Конечно, это только полезно, если файл сжимаем, и это будет использовать больше процессорного времени, так как он будет использовать шифрование (потому что это по SSH), и сжатие.

10
27.01.2020, 19:35
  • 1
    В этом случае было бы полезно отключить шифрование. Помните, что мы пытаемся сделать копию быстрее. –  lgeorget 18.06.2013, 05:23
  • 2
    @lgeorget я подозреваю издержки шифрования, не будет значительным, рассматривая, как медленные жесткие диски. Я рассмотрел добавление чего-то о -c none, но это, кажется, нестандартно. –  Brendan Long 18.06.2013, 05:32
  • 3
    Мы имеем дело с ~20G файлами, таким образом, это довольно неэффективно для использования шифрования, если не нужный. шифрование –  lgeorget 18.06.2013, 05:44
  • 4
    @lgeorget может быть сделано намного быстрее, чем пропускная способность, которую он получает, таким образом, это ничего не замедлит. Но действительно кажется ненужным пройти SSH здесь. Если Вам просто нужно сжатие, конечно, существуют другие инструменты? –  Thomas 18.06.2013, 05:56
  • 5
    @Thomas, которым преимущество SSH состоит в том, что, если у Вас, как предполагается, есть доступ к удаленному серверу, затем он почти наверняка выполняет SSH. Другая опция состояла бы в том, чтобы сжать файл локально, скопировать его в сервер, затем ssh в и распаковка это.. –  Brendan Long 18.06.2013, 18:47

cp реализация наиболее вероятна не узкое место. Попытайтесь наблюдать использование IO через iotop и на сервере и на кластерном узле. Это даст Вам общее представление, где можно улучшить производительность.

Другая подсказка, должен постараться не копировать те же данные из того же хоста. Например, если Вы будете иметь идентичный 20G файл для распределения от файлового сервера по сети ко всем кластерным узлам, то это будет работать намного быстрее к тому, если Вы скопируете файлы одноранговым способом, а не one-server-to-all-clients. Это - бит, более сложный для реализации, но можно даже попытаться использовать некоторую командную строку p2p как прямой концентратор подключения.

Если в этом 20G файлы, некоторая часть обще, и некоторые - кластерный конкретный узел, рассматривают разделение ее в общие, и определенные части и затем распределяют общую часть p2p способом.

8
27.01.2020, 19:35
  • 1
    Если Вы находитесь на LAN, необходимо смочь сделать многоадресную передачу вместо одноранговой сети. Который должен быть быстрее, и меньше нагрузки на сеть. –  derobert 17.06.2013, 23:45

Природа / содержание тех файлов может иметь некоторое значение. Я понял, что необходимо скопировать 200 файлов, ~20 ГБ, которые каждый, от одного компьютера до другого, то, что это?

Если те файлы сжимаемы или с подобным / идентичные части, у Вас есть два подхода:

  • архивируйте их перед копированием или создайте туннель между компьютерами с zip, включают на нем. Так, если сеть будет узким местом, то это будет немного быстрее

  • если файлы очень похожи, или совместно используют некоторые части общего содержания среди них, попытайтесь использовать rsync. Это проведет некоторое время, находя то, что распространено среди файлов и не должно будет копировать его буквально, потому что это восстановит его на основе того, что распространено.

править

Необходимо ли будет много раз копировать те файлы?? (как копия-> используют те файлы->, изменяют что-то в файлах в компьютере-> файлы копии снова к компьютеру B)

Если так, rsync будет полезен, потому что он попытается обнаружить то, что равно среди версий, и не копируйте то, что неизменно.

И третий метод: если вышеупомянутое корректно (изменения в файле, то скопируйте все файлы снова во второй компьютер), Вы могли попробовать некоторых binary diff просто изменить во втором компьютере, что было изменено в первом компьютере.

8
27.01.2020, 19:35

Я вижу следующее здесь, шифрование не является хорошей идеей, поскольку оно могло бы возможно УВЕЛИЧИТЬ объем данных, который будет передан.

Если Вы копируете между двумя системами, то узкое место является, конечно, соединением между серверами.

Если Вы копируете локально, посмотрите на то, как процесс идет, это является ЕДИНСТВЕННЫМ, распараллелил, таким образом стандартное использование утилит Linux:

- for all blocks in a file
      read a block
      write a block

Нет НИКАКОГО параллелизма к этой операции.

К вещам скорости можно использовать что-то вроде этого:

  buffer -i infile -o outfile -m size-of-shared-memory-default-1MByte

Посмотрите буфер (1) страница справочника для получения дополнительной информации.

Буферные наборы команд два процесса для выполнения процесса копии одновременно: один для чтения и другого для записи, и это использует буфер общей памяти для передавания данных между двумя процессами. Буфер общей памяти является Вашим классическим кольцевым буфером, который предотвращает перезапись незаписанных данных и запись данных, уже записанных. Я использовал эту программу для отключения приблизительно 10-20% времени копии в передачах от диска для записи на ленту.

6
27.01.2020, 19:35
  • 1
    На самом деле существует параллелизм в "чтении блок/запись блок", потому что "запись блок" на самом деле просто помещает его в буфер ядра, и ядро обрабатывает фактическую запись блока в фоновом режиме (по крайней мере, пока Вы не начинаете заканчиваться RAM). Или если Вы используете O_DSYNC/O_SYNC по некоторым причинам. –  derobert 18.06.2013, 21:49

Почему бы не попробовать алгоритм распространения P2P, если необходимо обновить весь кластер одновременно?

https://github.com/lg/murder - то, что использует Твиттер

Существует BTSync, который можно попробовать также.

3
27.01.2020, 19:35

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

1
27.01.2020, 19:35
  • 1
    Хорошее универсальное наблюдение, но поскольку вопрос говорит “~200 больших файлов - каждый ~20 ГБ”, я не полагаю, что это можно считать фактическим решением этой проблемы. улучшение –  manatwork 21.06.2013, 11:50
  • 2
    @manatwork ах.. я не читал ясно. Я думал, что у него было 200 файлов всего –  Munim 22.06.2013, 09:52

Если Вы копируете те же наборы файлов часто с Вашего локального компьютера на сервер с незначительными изменениями тут и там. Можно ускорить передачу при помощи rsync или DVCS (например, hg или мерзавец).

мерзавец или hg могут отслеживать и обнаружить дельты и только передать те дельты. В случае использования мерзавца, так как обе стороны имеют полную историю репозитория, выясняя, что дельта является очень дешевой.

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

1
27.01.2020, 19:35

Попробуйте bbcp . Тестирование в нашей среде показало, что в cp есть какой-то встроенный регулятор. Просто будьте осторожны, потому что, когда вы снимаете губернатора, вы можете пометить свой сервер и вызвать сбой. В нашем случае мы отключили сервер, чтобы сделать копию, поэтому быстрее было лучше. Это позволило сократить время передачи на несколько часов.

0
27.01.2020, 19:35

Перед копированием убедитесь, что целевые файлы не существуют.

Иногда удивительно, сколько времени тратится даже на простое копирование на тот же хост (без подключения к сети ).

См. мой ответ на другой вопрос cp здесь . Короче говоря, перезапись существующего файла намного медленнее, чем его усечение или удаление связи, а затем копирование.Последний в 8 раз быстрее для файла размером 1,2 ГБ.

0
27.01.2020, 19:35

Теги

Похожие вопросы