在 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年9月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 属性。

如果您运行的是普通的 x86-64 系统(虚拟化或裸机),很可能没有可移动的块,因为所有内核分配都是不可移动的。要将内核限制为 ram 的某些部分,请向其传递“kernelcore=”参数。之后您应该会看到一些可移动内存块,并且可以通过将“0”写入“online”属性或将“offline”写入“state”属性来使它们脱机。

答案2

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

相关内容