今週のLKML

今週は

  • xen/balloon: Memory hotplug support for Xen balloon driver
  • tmpfs: implement xattr support for the entire security namespace
  • Implementation of cgroup isolation
  • Native Linux KVM tool
  • kmemleak
  • その他

xen/balloon: Memory hotplug support for Xen balloon driver

http://permalink.gmane.org/gmane.linux.kernel.mm/60468

Xen の baloon ドライバに memory hotplug サポートを追加するパッチ。

bloon ドライバはVMに割当てるメモリの量を変更するためのドライバで memory hotplug は起動中にメモリをぬきさしできるような機能。 このパッチだと sysfs をたたくことで、増やしたメモリを認識できるようになる様子。

tmpfs: implement xattr support for the entire security namespace

http://permalink.gmane.org/gmane.linux.kernel.mm/60623

昔から root の権限を使うのには suid するのがよく使われていました。しかし、これだと root の権限全てがそのまま使われてしまい、思わぬセキュリティホールを作ってしまうことがあります。そこで root の権限は細かく分割し、このファイルを実行する時にはこの部分の権限を委譲する、というようにするのが "file capabilities" です。

さて RedHat が、 suid を file capabilities に置き換えようとしていると、ビルドに使っている tmpfs (メモリ上のファイルシステム) ではこの file capabilities が使えないことに気がつきました。

このパッチはその問題を修正するためのものです。tmpfs に security.* という xattr を実装しています。

Implementation of cgroup isolation

http://permalink.gmane.org/gmane.linux.kernel.mm/60464

memory cgroup (memcg) はメモリの使用上限を定めるものです。そのため、プロセスを分離する、という用途には使えません。ようするに、空きメモリを確保したい、という用途には使えません。そこで memcg を「システムの分離」に使えるようにしよう、というパッチです。

ここでは例としてこのようなケースがあげられています。

「グループの上限メモリの90%以上を使って、眠っているプロセス」をあるグループに入れて分離します。この時点でデータはほとんど全てメモリにのっています(= swapoutしてない)

さて、メモリを消費するプロセスを同じグループで動かします。物理メモリを超えた時点で当然ながら swapout が発生しますね。どこから swapout されるでしょうか? グループの中でも外でも、最近アクセスされてないものから順に swapout されていきます。ここだと最初に起動して眠っているプロセスから swapout されていきますね。すると

  • 「分離」されていないと そのグループのRSS+cache は上限の 66% まで低下します
  • 「分離」されていれば 上限の 97% という高い数値を保っています

http://permalink.gmane.org/gmane.linux.kernel.mm/60473

しかし、反対意見が出てきます。

まず、原則として「memcg は全体のメモリ管理の動作を邪魔しない」ように作られています。そして、以下のような問題があるのでは、と指摘が入ります。

  • 「保証」ではなく「実メモリをよこどりするな!」という実装である
  • OOM Killer が走った時には、「分離」に関係なく kill されてしまう

実メモリをよこどりするな!」というのは、この実装が確保したメモリを奪われない(=swapoutされない)ことを保証するものであり、「実メモリmallocできる」ことを保証するものではない、ということです。なので、ある意味では、これは「早いもの勝ち」のシステムになってしまいます。また、システムのメモリが足りなくなった時に起きるOOM Killerも cgroup には関係なく走りますから「分離」というイメージには結局そぐわなくなってしまいます。

この後

  • mlock() か hugepagefs を使えばいい
  • root cgroup にも softlimit が動くべきだ

などと出てきます。memcg の softlimit というのは「実メモリがたりないならこのグループをswapoutしてね」とヒントを出す機能のようです。 http://lwn.net/Articles/327108/

基本的にどのメモリページが swapout されるからは、LRU(LeastRecentlyUsed)リストで管理されていて最近アクセスがなかったものがswapoutされていくわけですが、 memcg softlimitを使うことであまり重要ではないプロセスからさきに swapoutさせることができます。

さて、問題はそこで「重要なプロセスのグループ」と「それ以外のグループ」(= rootグループ, デフォルトのグループ)ができるわけですが、パフォーマンスを下げないように「rootグループ」ではlimit/softlimitが有効になっていません。 http://permalink.gmane.org/gmane.linux.kernel.mm/60584

http://permalink.gmane.org/gmane.linux.kernel.mm/60596

こうしてとりあえず二人の議論としてはこのメールで終わります。簡単にまとめると

  • LRUによって「最近アクセスされている」ものが「重要なメモリ」として実メモリに残されるが、そうではないこともある
  • あるプロセスグループのメモリを「重要だ」とすることはできないのではないか?
  • あるグループの中での「制限」を超えない限り、 swapout されないような仕組みがほしい

ということでした。 LSF/MM サミットではなしあうようです?のでその後が楽しみです。

http://permalink.gmane.org/gmane.linux.kernel.mm/60600

また、その後こういう新たな提案もありました。

limit_in_bytes > soft_limit > reserve_limit という大小関係のある3つのlimitがあって…

  • limit_in_bytes 以上はそのグループに提供されないメモリ(そのグループの使用できるメモリの上限)
  • limit_in_bytes 〜 soft_limit は、他に欲しい人がいたらどんどん提供してよいメモリ
  • soft_limit 〜 reserve_limit は、ひとつ上の項目のメモリを提供してもまだ足りない時にしぶしぶ提供していいいメモリ
  • reserve_limit は必ず保持される実メモリ、誰も奪ってはならぬ

この提案、まだ実装ができていないのでどうなることかわかりませんが、なかなかおもしろそうなトピックです。

Native Linux KVM tool

http://permalink.gmane.org/gmane.linux.kernel/1121307

KVMによる仮想化の実現にはがカーネル内の機能とuserlandの機能とが必要になってきます。今のところ Qemu がuserland側の実装をしていたわけですが、カーネルサイドとuserlandサイドで足並みが揃わないことがありました。

そこで、 QEmu を置き換え KVM を使った仮想化環境を提供するツールを作り、カーネル側・userland側をうまく合わせて開発していこう、というプロジェクトのようです。

kmemleak

カーネル内のメモリリークを検出する kmemleak について。

http://permalink.gmane.org/gmane.linux.documentation/2710

kmemleak の doc が更新されています。x86, arm 以外にも powerpc, sparc, sh, s390 で動くことを明記しているようです。

http://permalink.gmane.org/gmane.linux.kernel.mm/60515

また、 kmemleak に関しては MIPS もサポートしようという動きが出ていました。 少し変更しただけでなんだか動いているようです。

その他