astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

Linuxでinodeが枯渇した場合にどうやって調査するか

f:id:astamuse:20180314195322j:plain

こんにちは。並河(@namikawa)です。

最近はすっかり暖かい日が続いておりまして、花粉が飛散して本当に悲惨な感じになってしまっているアカウントがこちらになります。

さて、近頃は、GCPへの移行を終えたり、新しいメンバーが続々とジョインしてきてくれていることもあり、本業のインフラ職人業が随分と減ってきていて、やっぱり最近力を入れている採用の話を書こうかなと思ったのですが、そういえば前回は採用向けの話(アスタミューゼの開発組織と採用に関するQAアレコレ)を書いたところだったので、今日はLinux運用環境での小ネタでも書こうかと思います。

「なぜかサーバに書き込めません!」

ある日、とあるサーバのディスク関連のアラートが飛んできて、エンジニアがサーバの状況を確認したところ、ディスクの容量には空きがあるが、なぜか書き込めないという状態になっていました。

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       9.9G  5.5G  3.9G  59% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            286M  8.0K  286M   1% /dev
tmpfs            59M  348K   59M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            295M     0  295M   0% /run/shm
none            100M     0  100M   0% /run/user

dfコマンドでディスクの使用量を確認するも空き容量はまだ残っている感じ。 エラーを確認すると "No space left on device" とな。

# df -i
Filesystem     Inodes  IUsed IFree IUse% Mounted on
/dev/sda1      655360 654754   606  100% /
none            75426      2 75424    1% /sys/fs/cgroup
udev            72973    405 72568    1% /dev
tmpfs           75426    327 75099    1% /run
none            75426      3 75423    1% /run/lock
none            75426      1 75425    1% /run/shm
none            75426      4 75422    1% /run/user

というわけで、定番の inode 枯渇問題でありました。

たくさんのファイルがどこにあるのかを探す

やり方は色々あるかと思うのですが、地道にルートからたくさんあるディレクトリを探していきます。 地味なやり方ですが、まずは1階層目のレベルで、どこの配下に大量のファイルがあるか探索します。

# find / -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -nr
 489278 usr
  14308 lib
   3287 var
   1818 data
    826 etc
    293 boot
    130 sbin
    128 bin
     94 home
      5 root
      3 tmp
      1 swap

こんな感じで、"/usr"配下のどこかにたくさんファイルが存在していることがわかりました。 あとは同じ要領で機械的に2階層目・・・と探していけばよいです。

# find /usr -xdev -type f | cut -d "/" -f 3 | sort | uniq -c | sort -nr
 460742 src
  15060 share
  12806 lib
    544 bin
    121 sbin
      5 include

"/usr"配下を対象に2階層目を探索した結果がこちら。"/usr/src"にたくさん溢れている、、、というところでピンときますね。

# ll /usr/src
total 188
drwxr-xr-x 47 root root 4096 Dec 15 06:45 ./
drwxr-xr-x 10 root root 4096 Nov 14  2015 ../
drwxr-xr-x 24 root root 4096 Jul 15  2016 linux-headers-3.16.0-77/
drwxr-xr-x  7 root root 4096 Jul 15  2016 linux-headers-3.16.0-77-generic/
drwxr-xr-x 27 root root 4096 Nov 21 06:33 linux-headers-4.4.0-101/
drwxr-xr-x  7 root root 4096 Nov 21 06:33 linux-headers-4.4.0-101-generic/
drwxr-xr-x 27 root root 4096 Dec  8 06:50 linux-headers-4.4.0-103/
drwxr-xr-x  7 root root 4096 Dec  8 06:50 linux-headers-4.4.0-103-generic/
drwxr-xr-x  7 root root 4096 Dec 15 06:45 linux-headers-4.4.0-104-generic/
drwxr-xr-x 27 root root 4096 Feb 23  2017 linux-headers-4.4.0-64/
drwxr-xr-x  7 root root 4096 Feb 23  2017 linux-headers-4.4.0-64-generic/
drwxr-xr-x 27 root root 4096 Mar  9  2017 linux-headers-4.4.0-66/
drwxr-xr-x  7 root root 4096 Mar  9  2017 linux-headers-4.4.0-66-generic/
drwxr-xr-x 27 root root 4096 Mar 16  2017 linux-headers-4.4.0-67/
drwxr-xr-x  7 root root 4096 Mar 16  2017 linux-headers-4.4.0-67-generic/
drwxr-xr-x 27 root root 4096 Mar 28  2017 linux-headers-4.4.0-70/
drwxr-xr-x  7 root root 4096 Mar 28  2017 linux-headers-4.4.0-70-generic/
drwxr-xr-x 27 root root 4096 Mar 31  2017 linux-headers-4.4.0-71/
drwxr-xr-x  7 root root 4096 Mar 31  2017 linux-headers-4.4.0-71-generic/
drwxr-xr-x 27 root root 4096 Apr  5  2017 linux-headers-4.4.0-72/
drwxr-xr-x  7 root root 4096 Apr  5  2017 linux-headers-4.4.0-72-generic/
drwxr-xr-x 27 root root 4096 Apr 25  2017 linux-headers-4.4.0-75/
drwxr-xr-x  7 root root 4096 Apr 25  2017 linux-headers-4.4.0-75-generic/
drwxr-xr-x 27 root root 4096 May 18  2017 linux-headers-4.4.0-78/
drwxr-xr-x  7 root root 4096 May 18  2017 linux-headers-4.4.0-78-generic/
drwxr-xr-x 27 root root 4096 Jun  7  2017 linux-headers-4.4.0-79/
drwxr-xr-x  7 root root 4096 Jun  7  2017 linux-headers-4.4.0-79-generic/
drwxr-xr-x 27 root root 4096 Jun 20  2017 linux-headers-4.4.0-81/
drwxr-xr-x  7 root root 4096 Jun 20  2017 linux-headers-4.4.0-81-generic/
drwxr-xr-x 27 root root 4096 Jun 29  2017 linux-headers-4.4.0-83/
drwxr-xr-x  7 root root 4096 Jun 29  2017 linux-headers-4.4.0-83-generic/
drwxr-xr-x 27 root root 4096 Jul 25 06:41 linux-headers-4.4.0-87/
drwxr-xr-x  7 root root 4096 Jul 25 06:41 linux-headers-4.4.0-87-generic/
drwxr-xr-x 27 root root 4096 Aug  4 06:32 linux-headers-4.4.0-89/
drwxr-xr-x  7 root root 4096 Aug  4 06:32 linux-headers-4.4.0-89-generic/
drwxr-xr-x 27 root root 4096 Aug 12 06:55 linux-headers-4.4.0-91/
drwxr-xr-x  7 root root 4096 Aug 12 06:55 linux-headers-4.4.0-91-generic/
drwxr-xr-x 27 root root 4096 Aug 16 06:35 linux-headers-4.4.0-92/
drwxr-xr-x  7 root root 4096 Aug 16 06:35 linux-headers-4.4.0-92-generic/
drwxr-xr-x 27 root root 4096 Aug 29 06:34 linux-headers-4.4.0-93/
drwxr-xr-x  7 root root 4096 Aug 29 06:34 linux-headers-4.4.0-93-generic/
drwxr-xr-x 27 root root 4096 Sep 19 06:32 linux-headers-4.4.0-96/
drwxr-xr-x  7 root root 4096 Sep 19 06:32 linux-headers-4.4.0-96-generic/
drwxr-xr-x 27 root root 4096 Oct 11 06:49 linux-headers-4.4.0-97/
drwxr-xr-x  7 root root 4096 Oct 11 06:49 linux-headers-4.4.0-97-generic/
drwxr-xr-x 27 root root 4096 Oct 31 06:39 linux-headers-4.4.0-98/
drwxr-xr-x  7 root root 4096 Oct 31 06:39 linux-headers-4.4.0-98-generic/

はい、このサーバはセキュリティ関連の自動アップデートが動いているサーバでしたね・・・。

ということで、不要なパッケージを apt-get purge 等で綺麗にしたのでした。

おわりに

弊社には大量のデータがあるので、本当はファイルがたくさんあって大変、みたいな話に無理やり結びつけようとも思ったのですが、そもそも基本的には各種データストアに入れているし、Rawデータの置き場はGCSのお世話になっているので、inodeに影響を及ぼす様なことは基本的にはありません。

ということで、割とありきたりなネタで恐縮でしたが、何かのお役に立てれば幸いです。

最後に、弊社ではエンジニア・デザイナーを絶賛大募集しておりますので、少しでも気になれば、カジュアルにランチでもしながらお話ししましょう。疑問・質問などございましたら、お手数ですが (@namikawa) まで気軽にDM等いただければと思います。

それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́

Copyright © astamuse company, ltd. all rights reserved.