2月版 OOM killerとの危険な関係に終止符は打てるか


上川純一
日本ヒューレット・パッカード株式会社
コンサルティング・インテグレーション統括本部
2008/2/29

linux-kernelメーリングリスト(以下LKML)かいわいで起きるイベントを毎月お伝えする、Linux Kernel Watch。2008年1月のLKMLでどんなことが起きたのか見てみましょう。

リリースサイクルを気にしてる?

 1月24日にLinux Kernel 2.6.24がリリースされました。Linusはこのリリースについては「特筆することはないだろう」というコメントを残しています。

 ただ、リリースの直後にLinux Conference Australia(LCA)があり、リリースサイクルについては補足をしていました。通常の-rcのリリースサイクルは2週間なのですが、それを少し(数日程度)延ばすというのです。ただし、LCAの開催中だから、あまり影響させないようにはしたいとも説明しました。

 どうやら、2.6.24正式版のリリースにいたるまでの期間がいつもより少し長かったことが気になっているようです。

リリース期間
歴代カーネルの正式版リリースまでに要した期間(2.6.12以降)

 2.6.23からSLABアロケータのデフォルトがSLUBに切り替わっています。SLABで提供されていた/proc/slabinfoが消え、SLUBでは/sys/slabを利用するように変更されました。

 ですがそのままでは、SLABの状況を確認するために昔から利用されてきたシステム管理者用ツール「slabtop」が動かないため、新しいツールを用いる必要がありました。しかし「これはカーネルインターフェイスのABI非互換性である」とPekka Enbergが主張し、「/proc/slabinfo ABI compatibility」というパッチで互換インターフェイスを提供することを提案しました。

 このパッチが2.6.24でマージされたおかげで、昔からのslabtopがそのまま動くようになり、一安心です。SLABでは/proc/slabinfoへの読み書きでメモリ割り当ての方法を制御できたのですが、SLUBのメモリ割り当てのチューニングについては、このパッチの適用後でも/sys/slabで行うことになります。

関連記事:
リンク 2007年9月版 ユーザー空間でのデバイスドライバ作成に道開ける
http://www.atmarkit.co.jp/flinux/rensai/watch2007/watch09b.html

モジュールじゃなくなっちゃったセキュリティ「モジュール」

 2.6.24-rc1からは、LSM機能がローダブルモジュール対応でなくなっています。2.6.24がその変更以後、初のリリース版になります。

 セキュリティの面からいえば、「セキュリティ機構を選択でき、アンロード可能な仕組みは乗っ取りなどの可能性があるので脆弱(ぜいじゃく)だ」という判断がありました。しかし、モジュールを動的に切り替える仕組みがなくなるため、ほかのセキュリティ機構の「お試し」がやりにくくなります。今後、メインラインに入っていないセキュリティ機構(AppArmor、LIDS、TOMOYOなど)に不利にならないか、心配です。

 一方、2.6.25-rc1で「SMACK」がメインラインにマージされました。SELinuxよりもシンプルな設定方法で、ラベルを利用した強制アクセス制御(MAC)を実現するそうです。SELinux以外のセキュリティモジュールが初めてメインラインにマージされたことになり、今後の展開が気になります。

関連記事:
リンク 2007年10月版 あんなコアいいな、吐けたらいいな
http://www.atmarkit.co.jp/flinux/rensai/watch2007/watch10a.html
リンク Linux Kernel Watch番外編:セキュリティをやってるやつらは狂っている?!
http://www.atmarkit.co.jp/fsecurity/special/103kernelwatch/kernelwatch01.html

80番ポートで待ってるよ

 2.6.25-rc1 Linux Kernelでは、「IO_DELAY」の方法が設定可能になっています。この項目、いったいどういう意味なのでしょう。

 David P. Reedが説明するには、HP dv9000zでhwclockがハングするという問題が発生していましたが、その原因は、I/Oポート0x80番(以下 80番ポート)に書き込みを行っていることによるものだったそうです。

 80番ポートは一般的には使われていないI/Oポートで、ISAバス上にあります。ISAバスは最高8MHzで動作するバスで、そこにout命令で書き込みを行うことでマイクロ秒単位の短いディレイを発生させることができます。この書き込みを行うことで発生するディレイを一部の処理に利用していたそうです。

 中には正当な理由なく利用しているケースもあったかもしれませんが、Linux Kernelの初期化の最初の部分では、まだ「udelay」が正確な時間を刻むことができないため、CMOSのアクセスのタイミングを合わせるためなどに使われています。ところが最近、このポートをデバッグ用途などに使うハードウェアが出てきたため、問題になったようです。

 解決策として、80番ポート(0x80)ではなく0xedポートを利用するという案が出ました。ほかに、udelayを使うというアプローチもあれば、delayをしないという方法も選択できます。このあたりは、io_delayカーネルパラメータで調整できるようです。

 Linux Kernelとしての選択肢が提供され始めたため、今後各種ハードウェアでテストした結果が集まってくるはずです。このディレイの仕組みが今後どうなるのか、気になりますね。

OOM killerとの危険な関係

 Linux Kernelは、空きメモリ容量が足りなくなった場合に「OOM killer」(Out of Memory Killer)を発動し、ヒューリスティックなアルゴリズムに基づいてアプリケーションを強制停止し、空きメモリを確保しようとします。

 ただ、ヒューリスティックのため、いけにえになるアプリケーションはランダムに決められます。残メモリ量が少なくなったとき、本当は重要なアプリケーションがOOM killerに殺されてしまった痛い経験を味わった方も、多いのではないでしょうか。

関連記事:
リンク 2006年3月版 カーネルが無実のプロセスをkillし始めるとき
http://www.atmarkit.co.jp/flinux/rensai/watch2006/watch03b.html

 この悲劇を避けるため、アプリケーションごとにチューニングする方法をはじめ、OOM killer対策の各種方法が編み出されています。そこに現れた新たな挑戦者が「mem_notify」です。

 1月24日、最初にMarcelo Tosattiが「oom notify」として書き始めたパッチに修正を加え、小崎資広さんが「mem_notify v5」パッチを提案しました。

 mem_notifyはシステム全体の空きメモリが足りなくなり、スワップが始まりそうになったタイミングで、メモリを開放するようにアプリケーションに通知するというフレームワークです。アプリケーションは/dev/mem_notifyをpollし、待ちます。

 Linux Kernelは、空きメモリ容量が少なくなり、スワップを利用しそうになった時点で、アプリケーションにメモリを開放するように通知します。/dev/mem_notify経由で通知を受けたアプリケーションは、明示的にメモリを開放してカーネルに返すため、スワップを利用しなくても済むという寸法です。結果として、OOMが発動するような状況になる前にアプリケーション側で対策が打てるようになるのです。

 これを実現するためには、各アプリケーションを/dev/mem_notifyに対応するよう改変する必要があります。それでも、処置はアプリケーション側で行うため、カーネル側からは分からないデータの種類について把握し、「メモリ上に保持しているキャッシュを開放する」などという処理ができます。

 例えば、WebブラウザであればWebページのキャッシュ、画像表示ツールであればJPEGをビットマップ画像に変換した結果など、一度捨てても再構成できるデータです。メモリの空き容量が少ない状況ならば、これらに割り当てているメモリを開放してあげた方がよいですよね。

 このパッチがメインラインにマージされるには、まだ技術的なハードルがいくつか残っていますが、こういう機能があると便利じゃないでしょうか?

1/2

Index
Linux Kernel Watch 2月版
 OOM killerとの危険な関係に終止符は打てるか
Page 1
 リリースサイクルを気にしてる?
 モジュールじゃなくなっちゃったセキュリティ「モジュール」
 ポート80で待ってるよ
 OOM killerとの危険な関係
  Page 2
 起動時のfsckって時間かかり過ぎじゃない?
 -stableの進ちょく

連載 Linux Kernel Watch


 Linux Squareフォーラム Linuxカーネル関連記事
連載:Linux Kernel Watch(連載中)
Linuxカーネル開発の現場ではさまざまな提案や議論が交わされています。その中からいくつかのトピックをピックアップしてお伝えします
連載:Linuxファイルシステム技術解説
ファイルシステムにはそれぞれ特性がある。本連載では、基礎技術から各ファイルシステムの特徴、パフォーマンスを検証する
特集:全貌を現したLinuxカーネル2.6[第1章]
エンタープライズ向けに刷新されたカーネル・コア
ついに全貌が明らかになったカーネル2.6。6月に正式リリースされる予定の次期安定版カーネルの改良点や新機能を詳しく解説する
特集:/procによるLinuxチューニング[前編]
/procで理解するOSの状態

Linuxの状態確認や挙動の変更で重要なのが/procファイルシステムである。/procの概念や/procを利用したOSの状態確認方法を解説する
特集:仮想OS「User Mode Linux」活用法
Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説
Linuxのカーネルメンテナは柔軟なシステム
カーネルメンテナが語るコミュニティとIA-64 Linux
IA-64 LinuxのカーネルメンテナであるBjorn Helgaas氏。同氏にLinuxカーネルの開発体制などについて伺った

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間