Wie kann ich den von dd belegten Speicher begrenzen?

376
hebbo

Ich verwende ddzum Ü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 dddie Geschwindigkeit basierend auf verfügbarem Speicher einschränken oder die Puffergröße begrenzen?

Vielen Dank.

1
Ist dd tatsächlich abgestürzt? Stehen Sie vor einem tatsächlichen Problem oder basiert diese Frage nur auf einer unbewiesenen Theorie, die möglicherweise abstürzt? Ramhound vor 6 Jahren 1

2 Antworten auf die Frage

1
Sam

Sie können die Nocache-Option zB ausprobieren

dd oflag=nocache if=infile of=outfile bs=4096 
Warum eine 4k-Byte-Größe? Das könnte die Dinge VIEL langsamer machen Xen2050 vor 6 Jahren 0
0
Austin Hemmelgarn

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 ddauf 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 echoAufruf 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 bashund 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 bsizeWerts), um die Speicherauslastung noch weiter zu reduzieren.

Wird die Suche beim Lesen aus / proc / vmcore unterstützt? hebbo vor 6 Jahren 0
@hebbo Ja, das Suchen wird unterstützt. Die einfachste Möglichkeit, über `/ proc / vmcore` nachzudenken, besteht in diesem Fall darin, dass es sich um eine umgekehrte Datei mit Speicherzuordnung handelt. Sie bietet eine reguläre Dateischnittstelle für eine Speicherzuordnung. Austin Hemmelgarn vor 6 Jahren 0
Ich habe versucht, die Größe von / proc / vmcore mit stat und blockdev zu ermitteln, aber es hat nicht funktioniert. Sie haben eine Idee, wie Sie seine Größe erreichen können? oder sogar die Lösung ändern, um Größenunabhängigkeit zu erreichen? hebbo vor 6 Jahren 0
@hebbo Der nette Fortschrittsanzeiger funktioniert nicht für `/ proc / vmcore` (er wird auf x86_64 als Größe von 2 TB angezeigt), aber das Skript funktioniert einwandfrei (` dd` wird sofort beendet, sobald es über den tatsächlichen Wert hinausläuft Daten). Austin Hemmelgarn vor 6 Jahren 0
Ich werde Ihre Lösung ausprobieren. Ich bin mir jedoch noch nicht sicher, welche Bedingung ich zum Verlassen der Schleife verwenden muss. Ich verstehe, was Sie mit dem Beenden von dd gemeint haben, wenn EOF erreicht ist, aber ich weiß nicht, wie ich das in eine sinnvolle Schleifenausgangsbedingung übersetzen kann. Ich bin auch nicht sicher, ob dd bei Erreichen des EOF einen speziellen Code zurückgeben würde. hebbo vor 6 Jahren 0