EC2 + Rails で発生したエラー「No space left on device @ io_write」の対応手順をまとめます。
環境
- AWS EC2
- Nginx
- Rails 5.2.3
背景
AWS EC2 で動いている Rails アプリにて、バックグラウンド処理が失敗していました。
アプリ自体は普通に動いてそうなので、SSH接続して rails c
してみると、次のエラーが発生。
No space left on device @ io_write - /tmp/execjs20200915-2847-13rxgx0js (Errno::ENOSPC)
原因
エラーメッセージの内容は「ディスク容量に十分な空きがない」ということです。
容量を確認すると確かに空きがありませんでした。
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 7.7G 7.7G 72M 100% /
「どうせログを消せば直るだろう」と思い、Rails のログを消してみましたが、引き続きエラーが出ます。EC2のインスタンスを再起動してみてもダメでした。
対応
原因ファイルの特定
何が悪さをしているかを突き止めるために、容量が大きいログファイルを探してみます。
sudo du -x -h / | sort -r -h | head -40 | grep log
802M /var/log
793M /var/log/journal/1d2e862128444912a1ce241cbc50a0b6
793M /var/log/journal
すると /var/log/journal
が怪しいことがわかりました。
journal とは
journal は systemd のログなので、消してしまっても問題ありません。
以下、systemd/ジャーナル より一部抜粋:
systemd/ジャーナル
systemd は、バージョン 38 から自前のログシステムである journal を搭載しています。
デフォルトで (/etc/systemd/journald.conf 内で Storage= が auto に設定されているとき)、journal は /var/log/journal/ へ書き込みを行います。
journalctl で削除
systemd ジャーナルは journalctl
で操作できます。
次のコマンドで、3日分のログを残し、それ以外は全て削除します。
sudo journalctl --vacuum-time=3days
再度、ディスク容量を確認してみます。
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 7.7G 6.9G 835M 90% /
10%削減でき、アプリも正常に動くようになりました。
journal の容量制限
今回のように journal の容量が膨れ上がらないように、設定ファイルを更新して容量を制限します。
sudo vi /etc/systemd/journald.conf
SystemMaxUse=200M
再起動して設定を反映させます。
sudo systemctl restart systemd-journald
これで同じ問題は起きないでしょう!