在 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

我認為內核不可能預設特徵。核心只支援熱插拔,不支援拔插。可能有一種奇怪的方法可以做到這一點,但從技術上講,這聽起來很糟糕......至少沒有什麼問題。

相關內容