Как я могу ограничить объем памяти, используемой dd?
Я использую dd
передать большой файл ядра (4 ГБ ~ 12 ГБ) в аварийное ядро с небольшим объемом доступной памяти (~400 МБ).
Проблема в том, что dd может аварийно завершить работу с паникой OOM, так как он просто сбрасывает большой кусок vmcore в сокет, что может привести к запуску OOM системой.
Мой вопрос: как я могу газ dd
скорость основана на доступной памяти или ограничивает размер буфера?
Благодарю.
2 ответа
Вы можете попробовать опцию nocache, например
dd oflag=nocache if=infile of=outfile bs=4096
Могу ли я предложить что-то подобное, а не просто позвонить dd
?
#!/bin/sh
bsize=1048576
fsize=`stat -c %s ${1}`
count=$((${fsize}/${bsize}))
if [ $((${fsize}%${bsize})) -ne 0 ] ; then
count=$((${count}+1))
fi
echo "About to copy ${fsize} bytes in ${count} chunks."
for i in `seq 0 $((${count}-1))` ; do
dd if=${1} of=${2} bs=1048576 conv=sparse,notrunc count=1 seek=${i} skip=${i} status=none
/bin/echo -e -n "\e[2K\e[0G[$((${i}+1))/${count}]"
done
echo
Вы не можете ничего сделать, чтобы ограничить один вызов dd
до некоторого максимального использования памяти, не вызывая ее смерти. Однако вы можете довольно легко написать скрипт для копирования файла блок за блоком. Приведенный выше скрипт будет копировать первый аргумент во второй, по одному мегабайту за раз, обеспечивая при этом элементарный индикатор прогресса (это то, что выглядит безумно echo
вызов для цикла делает). Используя busybox, он будет нормально работать только с 1,5 МБ доступной для пользователя памяти. Используя регулярные bash
и GNU coreutils, у него не должно быть проблем с сохранением ниже 4 МБ использования памяти. Вы также можете уменьшить размер блока (уменьшив bsize
значение), чтобы уменьшить использование памяти еще дальше.