В Linux (как) можно «горячо отключать» память?

В Linux (как) можно «горячо отключать» память?

Вот что я попробовал:

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

и получил следующую ошибку:

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

Может быть, мне нужно сначала убедиться, что модуль памяти, который я собираюсь отключить, пуст?

И если да, то как я могу это сделать?


Фон:

Я использую дистрибутив на базе Ubuntu, виртуализированный в качестве гостя с помощью VMWare.

Я надеюсь сократить использование памяти гостевой системой, освободив больше памяти для хоста без необходимости перезапускать гостевую систему.

На случай, если это имеет значение.


Редактировать 2016-09-29:

Воодушевленный комментариями и ссылкой @Gilles, что в теории это должно быть возможно, я подумал, что, возможно, memory109содержались некоторые неперемещаемые страницы. Поэтому я решил попробовать это и на других модулях(?).

Сначала я попробовал несколько других вручную. Но поскольку они не увенчались успехом, я решил попробовать все:

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

Внимание: будьте осторожны с приведенным выше скриптом, так как он может успешно выполниться на вашем компьютере, что может привести к отключению большей части, если не всей памяти, из-за чего ваша система останется без ресурсов и зависнет.

Вот что я получил за большую часть:

...
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
...

За двумя исключениями:

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
...

Есть идеи, почему это может не работать?

решение1

Скорее всего, ваши блоки памяти не могут быть переведены в автономный режим, поскольку содержат неперемещаемые страницы. Проверьте атрибут sysfs "removable".

Если вы используете обычную систему x86-64 (виртуализированную или bare metal), весьма вероятно, что нет никаких сменных блоков, поскольку все выделения ядра неперемещаемы. Чтобы ограничить ядро ​​некоторой частью оперативной памяти, передайте ему параметр "kernelcore=". После этого вы должны увидеть несколько сменных блоков памяти, и вы можете перевести их в автономный режим, записав "0" в атрибут "online" или записав "offline" в атрибут "state".

решение2

Я не думаю, что это возможно с точки зрения ядра.по умолчаниюособенности. Ядро поддерживает только горячее подключение, но отключение. Может быть, есть странный способ сделать это, но технически это звучит плохо... по крайней мере, с этим мало проблем.

Связанный контент