2013年7月5日金曜日

Jenkinsを動かしてるサーバで No space left on device となった話


ちょっと前の話ですが、ある日突然Jenkinsのジョブが突然全て実行出来ないようになりました。

結果、解決方法自体はごく簡単なものだったのですが、結構ハマったのでメモとして残しておきます。


ある夜の出来事

ふとスマホを眺めると、Jenkinsから大量のジョブ失敗メールが来ていました。

メッセージのログを見てみると、 No space left on device の文字。

どうやらストレージがいっぱいになってしまった模様。
確かにそのサーバは運用系のジョブしか動かしてないからストレージはほとんど積んでいませんでした。

事務所戻ったら見てみよう。
と、気楽な感じで構えてました。


ディスク容量はまだ空いているのに No space left on device…?

サーバにログインし、ゴミファイルでも消そうと思い、まずは "df -h" とコマンドを打ってみると…

ん、まだ3GBくらい空いてる…?

普通にディスク容量はまだ余っていました。
経験豊富な方はきっとこの時点ですぐに他の可能性に気づくのだと思いますが、
自分は意味が分からず頭が「?」でいっぱいになりました。


適当な対応により状態悪化

とりあえず、Jenkinsを再起動してみるか…。

困ったときの再起動というWindows的な対処をしてみますが、
何度Jenkinsを上げなおそうとも、No space left on device は変わらず。

じゃあもうOSごとリブートしてみるか…。

と、何も考えずにOSをリブートしたのが運の尽きでした。

OSすら上がらなくなってしまいました。。


ちゃんと考える

冷や汗をかきながら、なんとかかんとかOSをブートしてちゃんと考えてみました。

  • ディスク容量は余裕があるものの、No space left on device が起きている。

  • 何度やってもジョブはこけるし、OSもブート出来なくなる。

  • ただし、ファイルを削除すると一旦はちゃんと動くようになる。

  • しかし、しばらくするとまた同様の現象が起きる。

なんとなくググってみるとこんな記事が見つかりました。

ディスク容量に余裕があるのに No space left on device エラーになる

これは…


原因:ファイルの作りすぎによる inode の不足

まさに記事の通りで、再度OSにログインしinodeを確認してみると…

$ df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/xvda1            524288  524288       0  100% /
tmpfs                 480574       1  480573    1% /dev/shm

ビンゴ、きれいに100%使いきってました。

inodeを使いきってしまうと、ファイルのメタデータを保持できなくなるため、
新規にファイルが作成できなくなるとのこと。

それで、No space left on device となっていました。
もうちょっと分かりやすいメッセージ出してほしい…というのは甘えですかね。

だから、ファイルを削除すると一時的に回復するんですね。
今までこんな事態に遭遇したことがなかったので全く考慮から漏れていました。

ただし、心当たりはすぐに浮かびました(苦笑)


起因:Jenkinsの"古いビルドの破棄"の設定が漏れていた

冒頭の方に書いたように、このJenkinsサーバでは主に運用系のジョブを回していました。

日次の処理やら何やらでとにかく朝から晩まで寝る間の無いほどこき使っていたわけです。

そしてその中のジョブのいくつかに、15分おきとかの周期で実行するものがありました。
※それがそもそもおかしいだろ、という意見はありますが(汗)

で、ほとんどのジョブは"古いビルドの破棄"オプションの設定をしていたものの、
いくつか漏れていたものがあり、それらのファイルが残ったままになってしまっていたため
inodeを使い果たしてしまった、というオチでした。

全てのジョブの設定を確認して、"古いビルドの破棄"の設定をしたところ下記の通り解決しました。

$ df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/xvda1            524288  184505  339783   36% /
tmpfs                 480574       1  480573    1% /dev/shm

ちなみに複数ジョブにまたがった設定を行なうのには、Configuration Slicing pluginを使いました。
これ無かったらしんどかった…感謝です。

自分のLinux力の無さを再認識するとともに、いい勉強になりました。

なにはともあれ、これでまたしばらく自分の代わりにJenkins氏が社畜モード全開で働いてくれそうです(笑)


おしまい。

0 件のコメント:

コメントを投稿