毎週書くとか言っておきながら、すごく日が開いてしまった。。よくない。。
とか言っておきながら、今回も小ネタ的なものですみません。 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
入力補完も問題なく効く。