Как я могу ограничить объем памяти, используемой dd?

262
hebbo

Я использую ddдля передачи большого файла ядра (4 ГБ ~ 12 ГБ) в ядре сбоя, с небольшим объемом доступной памяти (~ 400 МБ).

Проблема в том, что dd может аварийно завершить работу с паникой OOM, так как он просто сбрасывает большой кусок vmcore в сокет, что может привести к запуску OOM системой.

Мой вопрос: как я могу регулировать ddскорость на основе доступной памяти или ограничивать размер буфера?

Благодарю.

1
Является ли дд сбой, вы сталкиваетесь, настоящая проблема, или этот вопрос просто основан на недоказанной теории, он может потерпеть крах? Ramhound 6 лет назад 1

2 ответа на вопрос

1
Sam

Вы можете попробовать опцию nocache, например

dd oflag=nocache if=infile of=outfile bs=4096 
Почему размер 4 Кбайт? Это может сделать вещи намного медленнее Xen2050 6 лет назад 0
0
Austin Hemmelgarn

Могу ли я предложить что-то подобное, а не просто звонить dd?

#!/bin/sh bsize=1048576 fsize=`stat -c %s $` count=$(($/$)) if [ $(($%$)) -ne 0 ] ; then count=$(($+1)) fi echo "About to copy $ bytes in $ chunks." for i in `seq 0 $(($-1))` ; do dd if=$ of=$ bs=1048576 conv=sparse,notrunc count=1 seek=$ skip=$ status=none /bin/echo -e -n "\e[2K\e[0G[$(($+1))/$]" done echo 

Вы не можете ничего сделать, чтобы ограничить один вызов ddкаким-либо максимальным использованием памяти, не вызывая ее смерти. Однако вы можете довольно легко написать скрипт для копирования файла блок за блоком. Приведенный выше скрипт будет копировать первый аргумент во второй, по одному мегабайту за раз, обеспечивая при этом элементарный индикатор прогресса (это то, что делает этот безумно выглядящий echoвызов в цикле for). Используя busybox, будет работать нормально только с 1,5 МБ доступной для пользователя памяти. При использовании обычного bashи GNU coreutils не должно возникнуть проблем с сохранением объема памяти ниже 4 МБ. Вы также можете уменьшить размер блока (уменьшив bsizeзначение), чтобы еще больше уменьшить использование памяти.

Поддерживается ли поиск при чтении из / proc / vmcore? hebbo 6 лет назад 0
@hebbo Да, поиск поддерживается. Самый простой способ думать о `/ proc / vmcore` в этом случае состоит в том, что это обратный файл сопоставления памяти, он обеспечивает обычный файловый интерфейс для сопоставления памяти. Austin Hemmelgarn 6 лет назад 0
Я попытался получить размер / proc / vmcore, используя stat и blockdev, но ничего не получилось. У вас есть идеи о том, как получить его размер? или даже изменить решение, чтобы сделать размер независимым? hebbo 6 лет назад 0
@hebbo Хороший индикатор прогресса не будет работать для `/ proc / vmcore` (он будет отображаться размером 2 ТБ на x86_64), но скрипт действительно работает нормально (` dd` завершается сразу после начала чтения после фактического данные). Austin Hemmelgarn 6 лет назад 0
Я собираюсь опробовать ваше решение. Но все же на данный момент я не уверен, какое условие мне нужно использовать для выхода из цикла. Я понимаю, что вы имели в виду, когда dd завершается, когда достигается EOF, но я не знаю, как перевести это в значимое условие выхода из цикла. Кроме того, я не уверен, что dd вернет специальный код при достижении EOF. hebbo 6 лет назад 0

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