daily memorandum 2.3.0

CBUG | FreeBSD | Hiki | Knoppix | Mac | Ruby | W-ZERO3 | Windows | ad | amd64 | ks | linux | momonga | net | print | security | tdiary | unix | www | 会社 | 鯖缶 | 全学ゼミ |


2005-03-04 (Fri)

_ [linux] file-max の default値

昨日の話の続き。 file-max の値ってマシンによって違うみたいだし、 default がどうなってるのか調べてみた。

例によって kernel source を追ってみると、 fs/file_table.c に files_init() という関数があって、 中身はこんな感じになっている。

   void __init files_init(unsigned long mempages)
   {
           int n;
           /* One file with associated inode and dcache is very roughly 1K.
            * Per default don't use more than 10% of our memory for files.
            */

           n = (mempages * (PAGE_SIZE / 1024)) / 10;
           files_stat.max_files = n;
    (以下略)

コメントを読むと、

  • file 1コ開くのに、だいたい 1KB 必要。
  • file 関係に使うメモリ量は、全体の 10% 以下にする。

という感じらしい。

ちなみに、この files_init() は fs/dcache.c の vfs_caches_init() から

   void __init vfs_caches_init(unsigned long mempages)
   {
       (略)
       files_init(mempages);
       (略)
   }

という感じで呼ばれ、さらにこの vfs_caches_init() は init/main.c の start_kernel() から

   asmlinkage void __init start_kernel(void)
   {
       (略)
       vfs_caches_init(num_physpages);
       (略)
   }

という感じで呼ばれている。 この num_physpages というのがシステムの物理メモリ量(ページ数)で、 それが files_init() まで渡ってる、ということみたい。

実際に file-max の値と実メモリ量の値を比べてみると

メモリ650MBのマシンと、メモリ1GBのマシンの file-max の値を表示してみると、こんな感じ。

   % cat /proc/meminfo
           total:    used:    free:  shared: buffers:  cached:
   Mem:  659554304 647757824 11796480        0 14594048 437010432
   Swap: 1258426368  2002944 1256423424
   MemTotal:       644096 kB
   MemFree:         11520 kB
   MemShared:           0 kB
   Buffers:         14252 kB
   Cached:         425964 kB
   SwapCached:        804 kB
   Active:         304268 kB
   Inactive:       295704 kB
   HighTotal:           0 kB
   HighFree:            0 kB
   LowTotal:       644096 kB
   LowFree:         11520 kB
   SwapTotal:     1228932 kB
   SwapFree:      1226976 kB

   % cat /proc/sys/fs/file-max
   65528
   % cat /proc/meminfo
           total:    used:    free:  shared: buffers:  cached:
   Mem:  1057492992 974512128 82980864        0 190038016 406695936
   Swap: 2097434624        0 2097434624
   MemTotal:      1032708 kB
   MemFree:         81036 kB
   MemShared:           0 kB
   Buffers:        185584 kB
   Cached:         397164 kB
   SwapCached:          0 kB
   Active:         464172 kB
   Inactive:       166960 kB
   HighTotal:      131008 kB
   HighFree:         7676 kB
   LowTotal:       901700 kB
   LowFree:         73360 kB
   SwapTotal:     2048276 kB
   SwapFree:      2048276 kB

   % cat /proc/sys/fs/file-max
   104851

ということで、だいたい実メモリの 1/10 になっていることがわかる。

結論として

file-max は tunable なので、default より多少増やすことは可能だが、 メモリとの兼ね合いで値を決めないといけない、ってことですね。 間違っても INT_MAX とかにしてはイカソ、と。(^^;

[]