Sqale開発中に遭遇したバグ その1

Sqale(スケール) の開発中に 2~3個 カーネルのバグ踏んであれこれ調べたので、経緯を公開。

LXC、chef-solo で作ってます

Sqale(スケール) ではユーザーがデプロイするRackアプリケーションを LXC(Linux Container) 内で動作させています。

LXCの環境は chef-solo で作成しています。chef-solo で LXCの設定、LXC内で動く各種ミドルウェアを動作させるための設定ファイルやその他必要なファイル、ディレクトリを作成します。

chef-solo してるとカーネルパニック

Sqaleの開発中、 chef-solo を実行していると稀にカーネルパニックを起こすという現象に見舞われました。実行環境は社内開発環境の Scientific Linux 6、 カーネルのバージョンは 3.2.16 でした。

正式リリースが目に見えてきたあたりで発覚するんですよね、こういうバグ...

バグレポートみつけた

chef-solo を繰り返し呼び出すとバグが再現するゾ、というところまで突き止めたあたりで運良く症状が一致するバグレポートを見つけました。

https://bugs.launchpad.net/ubuntu/+source/linux/+bug/999755

chef-solo は システムの情報を採取するのに ohai というライブラリを使っていますが、この ohai が setsid することと ruby 1.9.3 の組み合わせがトリガとなっていました。スケジューラがCPU間でプロセスをロードバランシング する際に不整合おこしてクラッシュするというバグのようです。

本バグは投稿されているパッチをあてるか、/proc/sys/kernel/sched_autogroup_enabled を 0 にすることで回避できます。

締め

慣れないレイヤの調査なので大変苦労しましたが、バグの再現方法が分かったことで解決の糸口が見えました。再現、大事ですね