doridoridoriand’s diary

主に技術的なことを書いていく予定(たぶん)

inode を枯渇させてみる

毎週書くとか言っておきながら、すごく日が開いてしまった。。よくない。。

とか言っておきながら、今回も小ネタ的なものですみません。 inode を枯渇させてみる。

業務中にルートボリュームがおかしくなったサーバーがあり、調査の過程でinodeも調べたので、興味本位がてらやってみた。 (結局そのサーバーは別の原因でルートボリュームがおかしくなっていたのだけれども)

そもそもinodeってなんぞや、全く聞いたことが無いで、という方は以下を読んでおけばなんとなくわかるかと思います。
inode番号とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

数に上限があるので、細かいファイルをガンガン保存していたりすると普通に枯渇する。そんなに無いとは思うけれどJSONをファイルとして 大量に保存していたりすると大変そう。

枯渇させるのは簡単で、ファイルをひたすらtouchしてあげればおk。 計測がてら、以下のようなスクリプトを組んでみた。

。。。と実行してみたことろ、SSH越しでコマンドを実行していため、生成速度が遅い。
1時間程度回してみたが、0.3%くらいしか使用率が上がらなかったorz
inode枯渇のタイミングで挙動がスクリプトの挙動がおかしくなって、正確な測定にならないだろなとか考えてSSH越しで別サーバーを立てて叩くようにしたが、そもそも測定が終わらなさそうなので、考えを改めて、普通にローカルで回せるように変更。
本当は別のドライブアタッチしてあげれば、そんな心配もしなくて良いのだけれども、まあ面倒なので
最終的に以下スクリプトを利用。

これを回すと以下のログが出力されるようになっている。

I, [2017-09-10T12:41:28.910920 #20048]  INFO -- : Used: 86386  Remain: 3753614  Percentage: 97.750
I, [2017-09-10T12:41:28.946672 #20048]  INFO -- : Used: 86396  Remain: 3753604  Percentage: 97.750
I, [2017-09-10T12:41:28.981453 #20048]  INFO -- : Used: 86406  Remain: 3753594  Percentage: 97.749
I, [2017-09-10T12:41:29.016357 #20048]  INFO -- : Used: 86416  Remain: 3753584  Percentage: 97.749
I, [2017-09-10T12:41:29.050865 #20048]  INFO -- : Used: 86426  Remain: 3753574  Percentage: 97.749
I, [2017-09-10T12:41:29.085021 #20048]  INFO -- : Used: 86436  Remain: 3753564  Percentage: 97.749
I, [2017-09-10T12:41:29.119606 #20048]  INFO -- : Used: 86446  Remain: 3753554  Percentage: 97.748
I, [2017-09-10T12:41:29.155900 #20048]  INFO -- : Used: 86456  Remain: 3753544  Percentage: 97.748
I, [2017-09-10T12:41:29.190215 #20048]  INFO -- : Used: 86466  Remain: 3753534  Percentage: 97.748

出力されるものは現在のinodeの使用率、残り、残りの%表記となっている。
最終的に15時間ほど掛かって完全に枯渇した。
枯渇すると以下のログが吐き出される。

ubuntu@ip-172-31-3-220:~$ ruby run_local.rb
/usr/lib/ruby/2.3.0/fileutils.rb:1157:in `initialize': No space left on device @ rb_sysopen - ./inode/1/e28c7144-aff1-4ddf-97cd-f93abaee09f7 (Errno::ENOSPC)
        from /usr/lib/ruby/2.3.0/fileutils.rb:1157:in `open'
        from /usr/lib/ruby/2.3.0/fileutils.rb:1157:in `rescue in block in touch'
        from /usr/lib/ruby/2.3.0/fileutils.rb:1153:in `block in touch'
        from /usr/lib/ruby/2.3.0/fileutils.rb:1151:in `each'
        from /usr/lib/ruby/2.3.0/fileutils.rb:1151:in `touch'
        from run_local.rb:18:in `block (2 levels) in <main>'
        from run_local.rb:15:in `times'
        from run_local.rb:15:in `block in <main>'
        from run_local.rb:12:in `times'
        from run_local.rb:12:in `<main>'
ubuntu@ip-172-31-3-220:~$

容量的には余裕。

ubuntu@ip-172-31-3-220:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            488M     0  488M   0% /dev
tmpfs           100M  6.8M   93M   7% /run
/dev/xvda1       30G  1.5G   28G   5% /
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/1000

しかしinodeは確かに枯渇している。

ubuntu@ip-172-31-3-220:~$ df -i
Filesystem      Inodes   IUsed  IFree IUse% Mounted on
udev            124865     381 124484    1% /dev
tmpfs           126832     469 126363    1% /run
/dev/xvda1     3840000 3840000      0  100% /
tmpfs           126832       1 126831    1% /dev/shm
tmpfs           126832       3 126829    1% /run/lock
tmpfs           126832      16 126816    1% /sys/fs/cgroup
tmpfs           126832       4 126828    1% /run/user/1000

この状態ではボリュームに対する、書き込みが発生するいかなる処理も実行不可能となる。 もちろんファイルの新規作成は無理であるし、

ubuntu@ip-172-31-3-220:~$ touch test.txt
touch: cannot touch 'test.txt': No space left on device

入力補完といった、一見ファイル作成とは無関係のコマンドも、以下のように使用することが出来ない。

ubuntu@ip-172-31-3-220:~$ less -s re-bash: cannot create temp file for here-document: No space left on device
-bash: cannot create temp file for here-document: No space left on device

これらに対処する一番簡単は方法は、不要ファイルを削除すること。 以下のように、ちょっとでもinodeに余裕ができれば、

ubuntu@ip-172-31-3-220:~/inode$ df -i
Filesystem      Inodes   IUsed  IFree IUse% Mounted on
udev            124865     381 124484    1% /dev
tmpfs           126832     469 126363    1% /run
/dev/xvda1     3840000 3830454   9546  100% /
tmpfs           126832       1 126831    1% /dev/shm
tmpfs           126832       3 126829    1% /run/lock
tmpfs           126832      16 126816    1% /sys/fs/cgroup
tmpfs           126832       4 126828    1% /run/user/1000

ファイルの新規作成も可能。

ubuntu@ip-172-31-3-220:~$ touch test.txt
ubuntu@ip-172-31-3-220:~$ ls
test.txt

入力補完も問題なく効く。