Sie können die Nocache-Option zB ausprobieren
dd oflag=nocache if=infile of=outfile bs=4096
Ich verwende dd
zum Übertragen einer großen Kernel-Kerndatei (4 GB ~ 12 GB) in einen Crash-Kernel, der über wenig Speicher verfügt (~ 400 MB).
Das Problem ist, dass dd mit der OOM-Panik abstürzt, da nur ein großer Teil des vmcore in den Socket geladen wird, was dazu führen kann, dass das System OOM ausführt.
Meine Frage ist: Wie kann ich dd
die Geschwindigkeit basierend auf verfügbarem Speicher einschränken oder die Puffergröße begrenzen?
Vielen Dank.
Sie können die Nocache-Option zB ausprobieren
dd oflag=nocache if=infile of=outfile bs=4096
Dürfte ich empfehlen, so etwas zu verwenden, anstatt nur anzurufen 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
Es gibt nicht viel, was Sie tun können, um einen einzelnen Aufruf dd
auf eine maximale Speicherauslastung zu beschränken, ohne dass dies zum Erliegen kommt. Sie können jedoch ziemlich einfach ein Skript erstellen, um die Datei blockweise zu kopieren. Das obige Skript kopiert das erste Argument in das zweite, ein Megabyte nach dem anderen, während ein rudimentärer Fortschrittsindikator bereitgestellt wird (dies ist es, was dieser verrückte echo
Aufruf in der for-Schleife tut). Bei der Verwendung von busybox können nur 1,5 MB nutzbarer Arbeitsspeicher verwendet werden. Bei der Verwendung von regulären bash
und den GNU-Coreutils sollte es kein Problem geben, wenn der Speicherverbrauch unter 4 MB bleibt. Sie können auch die Blockgröße reduzieren (durch Verringern des bsize
Werts), um die Speicherauslastung noch weiter zu reduzieren.