En Linux, ¿(cómo) puedo "desconectar en caliente" la memoria?

En Linux, ¿(cómo) puedo "desconectar en caliente" la memoria?

Esto es lo que he probado:

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

y obtuve el siguiente error:

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

¿Quizás deba asegurarme primero de que el módulo de memoria que estoy a punto de desconectar esté vacío?

Y si es así, ¿cómo podría hacer eso?


Fondo:

Estoy ejecutando una distribución basada en Ubuntu virtualizada como invitada por VMWare.

Espero reducir el uso de memoria del sistema invitado, liberando más para que esté disponible para el anfitrión sin tener que reiniciar el invitado.

En caso de que algo de eso pueda importar.


Editar 2016-09-29:

Animado por los comentarios de @Gilles y el enlace que decía que en teoría debería ser posible, se me ocurrió la idea de que tal vez memory109contenía algunas páginas inamovibles. Así que decidí probarlo también en otros módulos (?).

Al principio probé algunos otros a mano. Pero como no tuvieron éxito, pensé en probarlos todos:

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

Precaución: tenga cuidado con el script anterior, ya que puede tener éxito en su máquina, lo que podría desconectar la mayor parte, si no toda, su memoria, dejando su sistema sin recursos y colgado.

Esto es lo que obtuve para la mayoría:

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

Con sólo dos excepciones:

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

¿Alguna idea de por qué esto puede no funcionar?

Respuesta1

Lo más probable es que sus bloques de memoria no se puedan desconectar porque contienen páginas inamovibles. Verifique el atributo sysfs "extraíble".

Si está ejecutando un sistema x86-64 normal (virtualizado o bare metal), es muy probable que no haya bloques extraíbles, porque todas las asignaciones del kernel son inamovibles. Para restringir el kernel a una parte de la RAM, pásele un parámetro "kernelcore=". Después de eso, deberías ver algunos bloques de memoria extraíbles y puedes desconectarlos escribiendo '0' en el atributo 'en línea' o escribiendo 'fuera de línea' en el atributo 'estado'.

Respuesta2

No creo que sea posible según el kernel.por defectocaracterísticas. El kernel solo admite conexión en caliente, pero desconexión. Podría haber una forma extraña de hacer esto, pero técnicamente suena mal... al menos hay pocos problemas con esto.

información relacionada