(Wie) kann ich unter Linux den Speicher im laufenden Betrieb trennen?

(Wie) kann ich unter Linux den Speicher im laufenden Betrieb trennen?

Folgendes habe ich versucht:

sudo zsh -c 'echo offline >/sys/devices/system/memory/memory109/state'`

und habe den folgenden Fehler erhalten:

zsh:echo:1: write error: device or resource busy

Muss ich vielleicht vorher dafür sorgen, dass das Speichermodul, welches ich offline nehmen will, leer ist?

Und wenn ja, wie könnte ich das tun?


Hintergrund:

Ich verwende eine Ubuntu-basierte Distribution, die von VMWare als Gast virtualisiert wurde.

Ich hoffe, die Speichernutzung des Gastsystems zu reduzieren und so mehr Speicher für den Host freizugeben, ohne den Gast neu starten zu müssen.

Falls das von Bedeutung sein sollte.


Bearbeitung 29.09.2016:

Ermutigt durch @Gilles' Kommentare und Link, in denen stand, dass es theoretisch möglich sein sollte, kam mir die Idee, dass es vielleicht memory109einige nicht verschiebbare Seiten enthielt. Also beschloss ich, es auch mit einigen anderen Modulen(?) zu versuchen.

Zuerst habe ich ein paar andere manuell ausprobiert. Aber da diese keinen Erfolg hatten, dachte ich, ich würde sie alle ausprobieren:

for i in /sys/devices/system/memory/memory*/state;
  do echo -n "Trying "$i" \t";
  sudo zsh -c "echo offline > $i";
done

Achtung: Gehen Sie mit dem obigen Skript vorsichtig um, da es auf Ihrem Computer erfolgreich ausgeführt werden könnte, wodurch der Großteil (wenn nicht sogar der gesamte) Speicher offline geschaltet werden könnte, was dazu führen könnte, dass Ihr System ausgehungert wird und hängt.

Das ist, was ich am meisten bekommen habe:

...
Trying /sys/devices/system/memory/memory44/state        zsh:echo:1: write error: device or resource busy
Trying /sys/devices/system/memory/memory45/state        zsh:echo:1: write error: device or resource busy
Trying /sys/devices/system/memory/memory46/state        zsh:echo:1: write error: device or resource busy
...

Mit nur zwei Ausnahmen:

Trying /sys/devices/system/memory/memory0/state         zsh:echo:1: write error: invalid argument
...
Trying /sys/devices/system/memory/memory86/state        zsh:echo:1: write error: invalid argument
...

Irgendwelche Ideen, warum das möglicherweise nicht funktioniert?

Antwort1

Höchstwahrscheinlich können Ihre Speicherblöcke nicht offline geschaltet werden, da sie nicht verschiebbare Seiten enthalten. Überprüfen Sie das Sysfs-Attribut „removable“.

Wenn Sie ein normales x86-64-System (virtualisiert oder Bare Metal) betreiben, ist es sehr wahrscheinlich, dass keine entfernbaren Blöcke vorhanden sind, da alle Kernelzuweisungen nicht verschiebbar sind. Um den Kernel auf einen Teil des RAM zu beschränken, übergeben Sie ihm den Parameter „kernelcore=“. Danach sollten Sie einige entfernbare Speicherblöcke sehen und diese offline schalten können, indem Sie entweder „0“ in das Attribut „online“ oder „offline“ in das Attribut „state“ schreiben.

Antwort2

Ich glaube nicht, dass es durch den Kernel möglich istStandardFunktionen. Der Kernel unterstützt nur Hot-Plug, aber Unplug. Es könnte eine seltsame Möglichkeit geben, dies zu tun, aber technisch klingt es schlecht ... zumindest gibt es damit wenige Probleme.

verwandte Informationen