在 Linux 上,(如何)我可以“热拔出”内存吗?

Wiz*_*zek 6 memory virtual-machine hot-plug

这是我尝试过的:

sudo zsh -c 'echo offline >/sys/devices/system/memory/memory109/state'`
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

zsh:echo:1: write error: device or resource busy
Run Code Online (Sandbox Code Playgroud)

我是否可能需要先确保我即将脱机的内存模块是空的?

如果是这样,我该怎么做?


背景:

我正在运行一个基于 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
Run Code Online (Sandbox Code Playgroud)

警告:小心上面的脚本,因为它可能会在您的机器上成功,这可能会使您的大部分内存(如果不是全部)脱机,从而使您的系统饿死和挂起。

这是我得到的最多的:

...
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
...
Run Code Online (Sandbox Code Playgroud)

只有两个例外:

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
...
Run Code Online (Sandbox Code Playgroud)

任何想法为什么这可能不起作用?

Nap*_*ake -2

我认为内核的默认功能不可能做到这一点。内核只支持热插拔,不支持拔插。可能有一种奇怪的方法可以做到这一点,但从技术上讲,这听起来很糟糕......至少没有什么问题。

  • 我检查过,Ubuntu的默认内核配置确实包含了内存拔出所需的所有设置。所以在 Ubuntu 上使用内核的默认功能绝对是可能的。这没有什么“奇怪”的。为什么说“这个问题很少”?为什么说存在内核恐慌的风险? (6认同)