Quantcast
Channel: サイボウズ式
Viewing all articles
Browse latest Browse all 974

エンジニア・光成 滋生の「バグを突き止める技術」

$
0
0

サイボウズ・ラボの西尾 泰和さんが「エンジニアの学び方」について探求していく連載の第18回(これまでの連載一覧)。サイボウズ・ラボの光成 滋生さんにお話を伺うシリーズ(1)です。

本連載は、「WEB+DB PRESS Vol.80」(2014年4月24日発売)に掲載された「エンジニアの学び方──効率的に知識を得て,成果に結び付ける」の続編です。(編集部)

文:西尾 泰和
イラスト:歌工房

em018_cover_x687.png

この連載では「エンジニアの学び方」をテーマにインタビューを行い、どういう「学び方」をしているのか探求していきたいと思っています。第2弾は、サイボウズ・ラボのエンジニアとして、楕円曲線などの難しい数学を使った暗号の論文を読んで実装したり、サイボウズが遭遇した問題の原因を掘り下げていって最終的にLinuxのバグを修正したり、と幅広い活動をされている光成滋生さんです。

光成さんが、どういうプロセスで問題の原因を究明するのかや、どういうプロセスで数学を理解するのかは、きっと「エンジニアの学び方」の参考になるはずです。

Linuxカーネルのバグを直す

まず光成さんがLinuxカーネルのバグを見つけてパッチを送った際の話を聞いていきます。詳しいいきさつや問題解決の流れは社内勉強会の発表資料を見るほうが正確とのことなので、インタビュー内容と資料の内容とを合わせて簡単に説明します。

事の発端はLinuxマシンのディスク容量拡張後にページキャッシュが約15分起きに破棄されるという未知の現象が発生したこと。多くのウェブサービスはハードディスク上に置かれているデータベースが、徐々にメモリ上にキャッシュされてアクセスが速くなる設計になっているが、このキャッシュが何故か15分おきにクリアされてしまう。そうするとユーザーにとってはサービスのレスポンスが遅くなってしまうわけです。

問題を解決するためには、まず問題を再現させないといけない。これが一番大変だったそうです。なぜなら15分という値が固定なのか、何らかのパラメータによって変わるのかすらも分からないから。再現しそうな環境を作り、1時間くらい待ってみて再現するかしないかを観察する。これを2、3日繰り返して、ようやく再現する環境を作ることができたそうです。

次の問題は、犯人がどこにいるのかです。最初は自分たちのアプリケーションが悪いのか、そうでないもかも分からない。MySQLか、ext3ファイルシステムか、ソフトウェアRAID(mdadm)か、論理ボリューム管理(LVM)か、カーネルデバイスドライバか……。でも、少なくともキャッシュクリアが起こるということは、Linuxカーネルはページキャッシュを破棄する関数を呼ぶはずです。そこで破棄しそうな関数をリストアップし、かたっぱしからftraceでその関数を呼ぶものを探したとのことです。

その結果、mdadmのデーモンがその手の関数を呼んでいることが判明しました。これはユーザ空間なのでgdbでアタッチできる。そのデーモンが1000秒に1回何かをしていることが分かった。1000秒は16分40秒だ。試しにmdadmのソースの1000を30に書き換えてみたら、30秒で再現するようになった。これで調査効率が格段に上がりました。

じゃあこのデーモンが犯人か? しかしこのデーモンは現在の状態をモニタリングするだけのデーモンで、キャッシュをクリアしそうには思えなかった。どのタイミングでキャッシュがクリアされるのかをgdbで追ってみたところ、なんと「/dev/md」をopenするだけでキャッシュクリアが起きることが判明。では犯人はmdのデバイスドライバか? いえ、それも違いました。

結局、犯人は「kernel/fs」の中にいました。デバイスのサイズが変更された際には「キャッシュは無効、クリアされるべき」というフラグが立ちます。しかし、ある実行パスでそのフラグを0に戻し忘れているというバグがあったのです。その結果、フラグが立ちっぱなしになり、openするたびに「キャッシュ無効だからクリアしてから開こう……」という処理が走っていたわけです。

どれくらい詳しかった?

再利用できる知識は?

犯人探しは好き

デバッグ対象実行前にgdbが死ぬ

再利用できる知識

◆     ◆     ◆

なるほど、どこに原因があるかを探す際に、ついつい「ここにはないだろう」という先入観を持ってしまいがちです。でも、それでは「意外な原因」に気づくことはできないわけです。確認したこととしていないことを明確に区別すること。きちんと確認すること。確認せずに思い込んだりしないこと。これが意外な原因に気づくためには大事だとのことでした。この方法論は普遍的に有用なものだと思います。

さて、次回からは光成さんの数学に対する学び方について掘り下げていきたいと思います。(つづく)


※1 参考情報:
◎「Windows 2000がハングアップするバグについて」(fj.os.ms-windows.programming)
◎「Bug which crash Windows 2000 and XP」(comp.os.ms-windows.programmer.win32)


本連載は、これまで「毎週火曜日に掲載、火曜日がお休みの場合は翌日」としてきましたが、今回以降は、不定期での掲載となります。

「これを知りたい!」や「これはどう思うか?」などのご質問、ご相談を受け付けています。筆者、または担当編集の風穴まで、お気軽にお寄せください。(編集部)


謝辞:
◎Web+DB Press編集部(技術評論社)のご厚意により、本連載のタイトルを「続・エンジニアの学び方」とさせていただきました。ありがとうございました。


この記事を、以下のライセンスで提供します:CC BY-SA
これ以外のライセンスをご希望の場合は、お問い合わせください。


Viewing all articles
Browse latest Browse all 974

Trending Articles