見出し画像

私の印象深いカーネルへの貢献

前提や枠をひっくり返して問題を解決するのは常に狙うからか成功すると印象深い。昔話であり、たまには自分の話もするかということでもあり、こういうことがが毎年何百何千もおきているという話。

メモリ管理ビットマップの話

昔の、具体的には2004年、LinuxKernelの開発に参加するとこになった。指令はメモリを一部オフラインする機能の開発だった。当時はIBMも別の要件でメモリマップが離散的なハード向けのメモリ管理を提案しようとしていて何となく一緒に開発する流れであった。

当時のカーネルの扱える物理メモリの構造はフラットなメモリマップに穴がない構造か、多少穴があるがやはりフラットなものしかなく、これを細かく分割管理出来るようにするのが最初の課題だった。

IBMやIntelがベースを作っていたのだが分割管理の検討の中で少し問題になっていたのがメモリ管理用のビットマップの管理だった。このビットマップを分割管理してダイナミックに取り扱うのはとても面倒で、提案しても受け入れられるか不透明だった。

参加してしばらく考えた後、実はビットマップがいらないことに気付いた。そこで「ビットマップをとりましょう」というパッチを書き、メーリングリストに投げたのだった。ちなみにこれが初投稿だった。新しい方法ではビットマップのかわりに計算を使う。

しばらく返事も反応もなくモンモンとしていたらメモリ管理のボスのアンドリューから"go ahead"という2 wordだけのメールが来たのを覚えている。これが初めて採用されるコードになった。

OOMの話

Linuxには悪名高きOut-Of-Memory Killerというメモリがなくなったらプロセスを殺してメモリを回収するという機能がある。何もできなくなってシステムハングやシステムダウンよりましだろうというわけだ。

しかしエンタープライズではそんなことはない。システムを多重化してるならあっさりコケてくれたほうがリカバリーも早い。

という話をOOMのダンプ調査をしながらしていた。そこで「OOMするとパニックさせる」スイッチをつくってパッチを投げてみるとRed Hatのエンジニアがすぐに歓迎してくれてすんなりと採用された。これでOOMした瞬間にメモリダンプが取れるのでOOMの原因の詳細調査もできるようになり一石二鳥だった。10年くらいはカーネルをやってたが行数に対して効果が大きく好きなパッチだったりする。

ちなみにOOMのメモリダンプでよくわかったのは共有メモリのページテーブルで失敗するひとが多いこと。HugePageを使おう。

psコマンド抜けの話

やはり2005年の頃の話だったと思うが、ps | grepでプロセス監視をしていたらプロセスが死んでないのに誤検知されたという問い合わせが上がり、「どうせgrepのミスだろう」と思って調べたらカーネルのバグだった。

psコマンドは/procをreaddir()してプロセスリストを作るがここでプロセスが漏れた。一回のreaddir()で読みきれない場合にプロセスの起動停止が続くと漏れるのである。

当時はtask_listというプロセス生成順の一元リストをたどってreaddir()の中身を返していたのだが、よくよく考えるとreaddir()でリストを途中まで読んで、次のreaddir()で続きから読む、というのは途中でリストが変わる可能性がある以上、上手くいかない。「ここまで読んだ」プロセスが次読むときにいないかもしれない。

これは本質的にダメだというのでコミュニティで議論し、結局PID順にreaddir()を返すことになった。非互換なので当時は迷惑をかけたかと思うが、今のpsコマンドはPID順に表示するはずである。

/procfs の表示速度の話

/proc/statなど情報表示系の機能があるが、CPU数が増大すると飛躍的に遅くなる。/proc/statを全部読みだすだけで1秒かかるとか。この辺、なんとかしようと思い立ってperfなどのツールで解析するとsprintf()で時間がかかっていることがわかった。top commandの更新を一秒単位にすると更新が間に合わない。

sprintf()は文字列形成の基本的な関数である。遅いところがあるに違いないということでこの関数を調べてわかったのはこれはちゃんとした実装で付け焼き刃ではいじりようがないことだった。

結局、sprintf()を捨てて数値をプリントする決め打ちの関数を複数実装し、sprintf()を全部置き換えた。フォーマット文字列のスキャンがなくなりjmpも随分減る。改行コードだけをputするような処理も入れたかもしれない。結果的に早くなった。ただまぁ限界はあるのでバイナリデータで出力させるようなチャブ台返しがもう一度必要じゃないかとまだ思っている。

ひっくり返す

どのパッチも動いているコードを捨てて置き換えるような内容だが社内で話すと「よく動いてるコードを入れ替えられますね」と言われることがある。こういうのが大事なんじゃないか。

資料レビューの終盤に「混乱するのでもう来ないで」と言われたことがあり、単にひっくり返したい、そういう性格なのもしれない。

この記事が気に入ったらサポートをしてみませんか?