LoginSignup
2
2

More than 3 years have passed since last update.

EC2 + Rails `No space left on device @ io_write` のエラー対応手順

Last updated at Posted at 2020-09-16

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
/etc/systemd/journald.conf
SystemMaxUse=200M

再起動して設定を反映させます。

sudo systemctl restart systemd-journald

これで同じ問題は起きないでしょう!

References

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2