はじめに
私、Angular アプリとかをちまちまやっていたりするのですけど、その build には yarn を使っておりましてね。で、先日も適当にゴニョゴニョいじったやつを push してデモ機で動かしておりましたら、突然動かなくなったのですよ。サーバーが、というか、API の後ろで動いている MariaDB がエラーメッセージを投げてくれているのです。
Disk full
Disk full (/var/tmp/#sql_13d_0); waiting for someone to free some space...
そのメッセージを確認しましたらこれですよ。こんなことってありますか、このご時世ですよ、Disk の容量なんて潤沢にあるものじゃないっすか、むしろあまりまくっていても不思議ではないものじゃないっすか。
ここで使っている環境を説明するのですけど、VPS をそこそのプランで借りていて、そのホスト OS 上で CentOS 7 系を Docker のコンテナー上にまるまるぶち込んで幾つか動かしています。はい、ここで気がついた方もいらっしゃると思います。そう、そうなんです、そうなんですけど、それにしたって大した規模のアプリではないし、入っているデータ量だって知れたものです。
CentOS 7 では Docker のコンテナーサイズに 10GB という初期設定があります。
とりあえず、df -h
とかで確認。うん、ちゃんとリミットギリギリまで使ってある、なんでや、なんでよ、どう考えても 3 ~ 4GB くらいしか消費していない計算でしょうよ、これだって多く見積もってますわよ。
とか愚痴っていても何も解決しないので、du -sh
とか使ってちまちま大きいのを検索開始、そう、ルートディレクトリーからね。すると見つけました、/usr/local/share/
以下に特大のキャッシュ群を、その大きさ 6.5GB……!
yarn cache
yarn がキャッシュを持つなんてことはもちろん知っていたのだけど、まさかこんなに肥大するとは思っていなくて、気がついたときには原因がこれで良かったと安心する一方、びっくりしたりもしました。まぁ、思えば二年以上、その積み重ねでありますからねぇ。
yarn cache clean
それはともかく、キャッシュを持つっていうことは操作もできるわけで、綺麗にするコマンドを実行しまして事なきを得ました。ありがとうありがとう、放っておいてごめんなさい。
yarn config
yarn config set cache-folder <置きたいとこ>
定期的に、それこそ二年かかって食い尽くしたのだから、年一くらいで上記コマンドを cron とかで実行させてあげれば良いのだけど、コンテナー内にキャッシュを貯め込むのも良くないなって思って、キャッシュフォルダ自体もマウントしているホスト側の領域へ移動することにしました。こうすれば 10GB 制限を超えて溜め込める、ホストの方で他で消費しちゃうかも知れないけど。や、そもそも溜め込まんでいい。
docker のコンテナーストレージ制限
コンテナーサイズ自体を拡張すれば根本的な問題が解決する気もしますね。今回はやらなかったけれど、以下のページが参考になりそうです。
おわりに
思いもよらないタイミングで思いもよらない方面からの障害で面を食らいましたが、解決してみると自分の浅はかさと注意力の無さですね。割とサッと対応できたので良かったですが、調査しているときは久しぶりにドキドキでした、ワクワクでした。同じ環境で動いている本番機より先にデモ機で発生したのもラッキーでしたねー。
みんなはこんなことを引き起こしちゃダメだぞ!