6月版 怒りのLinus、「カーネル開発者のふりはやめろ」
上川純一
日本ヒューレット・パッカード株式会社
コンサルティング・インテグレーション統括本部
2006/6/28
linux-kernelメーリングリスト(以下LKML)かいわいで起きるイベントを毎月お伝えする、Linux Kernel Watch。2006年5月はどのようなことが起きたのか、見てみましょう。
LILOに潜む「255文字制限」のナゾ
LILOやGRUBなどのブートローダを利用してLinuxカーネルを起動する際、普通のコマンドラインアプリケーションのようにコマンドラインオプションを指定してカーネルの挙動を変えることができます。
このコマンドラインオプションには、「255文字までしか利用できない」という制限が存在します。そこで、Alon Bar-Levがコマンドラインオプションの文字数を拡張する「THE LINUX/I386 BOOT PROTOCOL -Breaking the 256 limit」というパッチを提案しました。
実は、このパッチは2005年からずっと提案されているのですが、LILOで255bytes以上のコマンドラインオプションを使うとクラッシュするという報告があっていまだカーネルに取り込まれていません。一体何が原因なのか? 「LILOの.bssセクションがカーネルがロードされる部分と重なるからだ」とか、いろいろと理由が挙げられていますが、どうも決め手がはっきりしないようです。H. PeterAnvinは、この状況について「誰か反証になる事実を持っていないか? 持っているのならその詳細は? 『誰々がいうには……、誰それが何々といったそうな……』みんな伝聞ばっかりじゃないか!」と嘆きました。
実際問題として、LILOとカーネルの相互作用について詳しく分析できている人があまりいないようで、実際にどのような問題が発生しているのか追跡できていないようです。結局、今回もカーネルに渡せるコマンドラインの長さの限界は255文字のままで議論が終わってしまったようです。
参考: | |
カーネルソースのCOMMAND_LINE_SIZE該当部分 include/asm-i386/setup.h、arch/i386/kernel/setup.c |
デッドロックを探せ!
Ingo Molnarは、「ANNOUNCE: lock validator -V1」というメールで、Linuxカーネル内部で利用されているロックの依存関係の正しさを検出するパッチを発表しました。spinlocks、rwlocks、mutexes、rwsemsなどの処理を実行時に解析するものだそうです。
ロックとは、複数の処理を排他制御する機構です。ロックを保持しているCPUが実行権限を持ち、その間ほかのCPUは待ちます。複数のロックがある場合はどうなるか。もしロックを掛ける順番を間違えると、お互いにロックが解放されるのを待つという状況が生まれる場合があります。その状況を「デッドロック」といいます。もちろんロック取得の順番はそれなりに決まっており、デッドロックが発生しないようになっています。しかし間違える場合もあり、結果として負荷が高い状況であったり、大規模なシステムになった場合にだけ発現する分かりにくいバグとして登場します。
このパッチはロックする順番を解析・記憶し、怪しいロック順序がないことを確認します。怪しい順番でロックが行われているのを検出すると、将来的にデッドロックを発生させる可能性があるので警告メッセージを出力します。例えばロックが必要な処理AとBがあるとします。
ケース1 タイミングがずれてデッドロックにならない場合 | ||||||||||||||||||
スレッド1: | Aを ロック |
→ | Bを ロック |
→ | 処理 | → | Bを 解放 |
→ | Aを 解放 |
|||||||||
スレッド2: | Bを ロック |
→ | Aを ロック |
→ | 処理 | → | Aを 解放 |
→ | Bを 解放 |
ケース2 デッドロックになる場合 | |||
スレッド1: | Aをロック | → | スレッド2がBを解放するのを待ち続ける |
スレッド2: | Bをロック | → | スレッド1がAを解放するのを待ち続ける |
カーネルが起動してから、一度でもAのロックから解放までの間にBをロックしたことがあるとします。その状態でBのロックから解放までの間にAをロックする処理があると、今回はデッドロックは発生しませんが、その2つの処理が同時に動くと将来的にはデッドロックになる可能性があります。偶然ケース1の状況で収まっている場合でも、タイミングによってはケース2のような事態になる可能性があることを検出しようというわけです。
Ingo Molnarのパッチを適用すると、3CPU以下のシステムではデッドロックが発現しないケースでも、1CPUのシステムで警告を発生させることができます。このパッチのおかげで、いくつかのデッドロック候補が迅速に発見されました。
最終的には、カーネル2.6.17-rc5-mm1にマージされています。このパッチを適用すると実行速度が低下するそうなので常時使うのには適しませんが、デバッグのお供にどうぞ。
関連リンク: | |
Ingo Molnarのlockdep-patchesのページ http://redhat.com/~mingo/lockdep-patches/ |
1/2
|
|
||||
|
連載 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カーネルの開発体制などについて伺った |
|
|
- 【 pidof 】コマンド――コマンド名からプロセスIDを探す (2017/7/27)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、コマンド名からプロセスIDを探す「pidof」コマンドです。 - Linuxの「ジョブコントロール」をマスターしよう (2017/7/21)
今回は、コマンドライン環境でのジョブコントロールを試してみましょう。X環境を持たないサーバ管理やリモート接続時に役立つ操作です - 【 pidstat 】コマンド――プロセスのリソース使用量を表示する (2017/7/21)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、プロセスごとのCPUの使用率やI/Oデバイスの使用状況を表示する「pidstat」コマンドです。 - 【 iostat 】コマンド――I/Oデバイスの使用状況を表示する (2017/7/20)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、I/Oデバイスの使用状況を表示する「iostat」コマンドです。
|
|