11959
Ubuntuでの1ディレクトリあたりのファイル数上限、容量上限はあるのでしょうか？  
ある場合は教えていただけますでしょうか。

現在CMSを構築していて記事のサムネイル画像を記事IDと紐付けて保存している状況でして、  
上記のようなことが気になりました。  
何十万という記事が書かれ、その分サムネイルが設定される場合は問題が生じるのか気になっております。  
Ubuntu 14.04 LTSを使用しております。
CC BY-SA 3.0
2015-06-27T07:59:53.853
11794
2015-07-02T09:50:38.677
2015-06-27T10:31:44.590
3639
7641
question
linux ubuntu filesystems
Ubuntuでの1ディレクトリあたりのファイル数上限、容量上限はあるのでしょうか？
おそらく、ファイルシステム単位で利用可能な `i-node` の最大数の事をおっしゃられているのかと思いますが、例えば以下の様にして確認する事ができます。

```

    $ df -i .
    Filesystem      Inodes IUsed   IFree IUse% Mounted on
    /dev/sda7      1831424 78532 1752892    5% /home
    
```

特に説明しなくても表示されている内容はお分かりいただけるかと思います。

また、`tune2fs` コマンドでも同等の結果を得ることができます。

```

    $ sudo tune2fs -l /dev/sda7 | grep -i inode
                     :
    Inode count:              1831424
    Free inodes:              1750561
                     :
    
```
CC BY-SA 3.0
2015-06-27T09:35:41.543
11796
2015-06-27T09:35:41.543
11794
answer
実質的に上限はないと思って構いません。ただし、上限が無いからと言って数万ものファイルを置くような設計にすればすぐにパフォーマンストラブルに見舞われると思います。

まず、ディレクトリが管理できるファイル数ですが、ディレクトリの実態はファイル名と所在するi-
nodeの番号を記入したファイルです。管理するファイルが多くなるほど、記録したファイルの名前が長いほどディレクトリのサイズも大きくなっていきます。そういう意味では一つのディレクトリが管理できる上限はファイルシステムで作成できる最大のファイルサイズになるまで、ということになります。しかし、現実的には数TB位のストレージ全部をディレクトリで使うわけにもいかず、もちろんメモリにも読み込めず、全く実用になりません。

プロバイダのブログが日付でディレクトリを分けているのは一つのディレクトリのファイルが多くならないよう設計されているのです。おおくても1ディレクトリあたり数千に止めるよう設計される方がいいと思います。これでも、トラブルがあると表示さえできず、パニックになりますが。
CC BY-SA 3.0
2015-06-28T09:08:09.687
11824
2015-06-28T09:08:09.687
8136
11794
answer
クォータを設定していない前提であれば ファイル数がinodeの最大値に達するもしくは マウントポイントの最大容量が上限になります。

性能については、ディレクトリ内のファイル郡をリストアップする場合や
検索するような場合はファイルが多いほど負荷が上がり性能が劣化します。ファイル名がわかっていて直接ファイルを読み書き出来る場合は性能劣化は見られません。

CMSはわかりませんが、記事とサムネイル画像の紐付をDB等で管理されていて ファイル名がわかっているのであればファイルの読み書きの性能劣化はないと思います。

ディレクトリ内のファイルを検索して画像を探すような場合は CPU負荷、メモリ使用量、ディスクIOが増え、応答時間は長くなるでしょう。

またShellでのファイル操作するが面倒になります。(ls が終わらない、ファイル名の展開が終わらない、引数が多すぎてコマンドに渡せない、など)

どのくらいの数で性能が劣化するかは、お使いの環境によって違いますので性能測定を実施して適切な数を見極めるといいと思います。

以下、どこまでファイルを作成できるか実験した結果です。

環境

  * VirtualBox VM 
    * 1024 MB Memory
    * Processor 6
    * Sotrage Controller : IDE 
    * Disk 1 16.00GB main.vdi (/dev/sda)
    * Disk 2 100.00 GB test.vdi (/dev/sdb)
  * Centos7.1

100GB の ext4 ファイルシステム構築後 Inodes の値は 10 使用、6,553,590 がフリーでした。

```

    FileSystem           Inodes    IUsed     IFree IUse% Mounted on
    /dev/sdb1           6553600       10   6553590    1% /var/test
    
```

1,000,000,000 Bytes のファイルを split で 10バイトずつ分割し 一億個のファイル作成を試みますが途中でエラー終了しました。

```

    # dd if=/dev/zero of=zero.dat bs=1000 count=1000000
    
    # split -a 8 -b 10 zero.dat
    split: xaaaoiwra: No space left on device
    
```

ファイルの数はIFreeで表示された値と同じでした。なお、数えている間 ls コマンドは
CPUが30-100%くらいメモリは85%くらい消費した状態で、1時間以上かかりました。

```

    # time ls -1 | wc -l
    6553590
    
    real    68m27.671s
    user    1m2.893s
    sys     21m7.490s
    
```

IUse% は 100% 使用中となり、これ以上ファイルを作成できない状態だとわかります。

```

    # df -i
    Filesystem    Inodes    IUsed   IUse% Mounted on
    /dev/sdb1    6553600  6553600    100% /var/test
    
```

ディスクの容量は 27GB Used ですのでまだ余裕があります。

```

    # df -h
    Filesystem    Size  Used  Avail  Use% Mounted on
    /dev/sdb1      99G   27G    68G   29% /var/test
    
```

ファイル名を直接指定して読み書きした場合、目立った遅延はありませんでした。

```

    # time od -x xaaaaxxxx
    00000000 0000 0000 0000 0000 0000
    00000012
    
    real     0m0.169s
    user     0m0.000s
    sys      0m0.008s
    
```

Shellのファイル名の補完や正規表現の展開は恐ろしく時間がかかりますし 引数が多すぎて rm xa* などはエラーになりました。

ファイルの削除は次のように行いました。

```

    # ls -1 | egrep -e '^xa*$' |xargs rm
    
```
CC BY-SA 3.0
2015-07-02T09:50:38.677
11959
2015-07-02T09:50:38.677
5008
11794
answer