No Linux, (como) posso "desconectar a quente" a memória?

No Linux, (como) posso "desconectar a quente" a memória?

Isto é o que eu tentei:

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

e obtive o seguinte erro:

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

Talvez eu precise ter certeza de que o módulo de memória que estou prestes a colocar offline está vazio primeiro?

E se sim, como eu poderia fazer isso?


Fundo:

Estou executando uma distribuição baseada no Ubuntu virtualizada como convidado pelo VMWare.

Espero reduzir o uso de memória do sistema convidado, liberando mais para ficar disponível para o host sem precisar reiniciar o convidado.

Caso algo disso possa importar.


Editar 29/09/2016:

Encorajado pelos comentários de @Gilles e pelo link dizendo que em teoria deveria ser possível, tive a ideia de que talvez memory109contivesse algumas páginas imóveis. Então decidi experimentar em alguns outros módulos (?) também.

No começo, tentei alguns outros manualmente. Mas como não tiveram sucesso, pensei em tentar todos eles:

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

Cuidado: Tenha cuidado com o script acima, pois ele pode funcionar em sua máquina, o que pode off-line a maior parte, se não toda a sua memória, deixando seu sistema faminto e travado.

Isso é o que eu mais consegui:

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

Com apenas duas exceções:

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

Alguma idéia de por que isso pode não funcionar?

Responder1

Provavelmente, seus blocos de memória não podem ser colocados offline porque contêm páginas que não podem ser movidas. Verifique o atributo sysfs "removível".

Se você estiver executando um sistema x86-64 normal (virtualizado ou bare metal), é muito provável que não haja blocos removíveis, porque todas as alocações do kernel são imóveis. Para restringir o kernel a alguma parte da memória RAM, passe um parâmetro "kernelcore=" para ele. Você deverá ver alguns blocos de memória removíveis depois disso e poderá colocá-los off-line escrevendo '0' no atributo 'online' ou escrevendo 'offline' no atributo 'state'.

Responder2

Eu não acho que seja possível pelo kernelpadrãocaracterísticas. O kernel suporta apenas hot-plug, mas desconecte. Pode haver uma maneira estranha de fazer isso, mas tecnicamente parece ruim... há pelo menos alguns problemas com isso.

informação relacionada