Linux では、メモリを「ホット アンプラグ」するにはどうすればよいでしょうか?

Linux では、メモリを「ホット アンプラグ」するにはどうすればよいでしょうか?

私が試したのはこれです:

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

次のエラーが発生しました:

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

オフラインにしようとしているメモリ モジュールが空であることを最初に確認する必要があるでしょうか?

もしそうなら、どうすればそれができるでしょうか?


背景:

私は VMWare によってゲストとして仮想化された Ubuntu ベースのディストリビューションを実行しています。

ゲスト システムのメモリ使用量を削減し、ゲストを再起動せずにホストで使用できるメモリを増やしたいと考えています。

万が一、それが重要になる場合に備えて。


編集 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

注意: 上記のスクリプトは、マシン上で成功する可能性があり、メモリのすべてではないにしてもほとんどがオフラインになり、システムが枯渇してハングアップする可能性がありますので注意してください。

私が最も多く得たものは次のとおりです:

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

ただし、次の 2 つの例外があります。

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

おそらく、メモリ ブロックには移動できないページが含まれているため、オフラインにできません。「removable」sysfs 属性を確認してください。

通常の x86-64 システム (仮想化またはベアメタル) を実行している場合、すべてのカーネル割り当てが移動できないため、取り外し可能なブロックが存在しない可能性が非常に高くなります。カーネルを RAM の一部に制限するには、カーネルに "kernelcore=" パラメータを渡します。その後、取り外し可能なメモリ ブロックがいくつか表示されます。これらのブロックは、'online' 属性に '0' を書き込むか、'state' 属性に 'offline' を書き込むことでオフラインにできます。

答え2

カーネルでは不可能だと思うデフォルト機能。カーネルはホットプラグのみサポートしていますが、アンプラグはサポートしていません。これを行うには奇妙な方法があるかもしれませんが、技術的には良くないようです...少なくとも、これには問題はほとんどありません。

関連情報