Вы можете попробовать опцию nocache, например
dd oflag=nocache if=infile of=outfile bs=4096
Я использую dd
для передачи большого файла ядра (4 ГБ ~ 12 ГБ) в ядре сбоя, с небольшим объемом доступной памяти (~ 400 МБ).
Проблема в том, что dd может аварийно завершить работу с паникой OOM, так как он просто сбрасывает большой кусок vmcore в сокет, что может привести к запуску OOM системой.
Мой вопрос: как я могу регулировать dd
скорость на основе доступной памяти или ограничивать размер буфера?
Благодарю.
Вы можете попробовать опцию nocache, например
dd oflag=nocache if=infile of=outfile bs=4096
Могу ли я предложить что-то подобное, а не просто звонить 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
значение), чтобы еще больше уменьшить использование памяти.