2011-02-13 14 views
2

私はLinux 2.6.36カーネルを使用していますが、いくつかのランダムなエラーが発生しています。私のシステムは一貫して 'ls'コマンドを実行できません。 :(VFS:最大ファイル数が1231582に達しました

私は自分のdmesgの出力には、いくつかのエラーを注意してください。

# dmesg | tail 
[2808967.543203] EXT4-fs (sda3): re-mounted. Opts: (null) 
[2837776.220605] xv[14450] general protection ip:7f20c20c6ac6 sp:7fff3641b368 error:0 in libpng14.so.14.4.0[7f20c20a9000+29000] 
[4931344.685302] EXT4-fs (md16): re-mounted. Opts: (null) 
[4982666.631444] VFS: file-max limit 1231582 reached 
[4982666.764240] VFS: file-max limit 1231582 reached 
[4982767.360574] VFS: file-max limit 1231582 reached 
[4982901.904628] VFS: file-max limit 1231582 reached 
[4982964.930556] VFS: file-max limit 1231582 reached 
[4982966.352170] VFS: file-max limit 1231582 reached 
[4982966.649195] top[31095]: segfault at 14 ip 00007fd6ace42700 sp 00007fff20746530 error 6 in libproc-3.2.8.so[7fd6ace3b000+e000] 

もちろん、ファイル-maxのエラーが一緒にクラスタ化し、最近され、不審に見えるにも少し見えます

# cat /proc/sys/fs/file-max 
1231582 
# cat /proc/sys/fs/file-nr 
1231712 0  1231582 

を。私にとって奇妙なことですが、このシステムでは120万のファイルが開かれているわけではありません。私はそれを使用する唯一のもので、ローカルネットワーク外の誰にも見えません。

# lsof | wc 
    16046 148253 1882901 
# ps -ef | wc 
    574 6104 44260 

私はいくつかのドキュメントを見たと言って:

ファイル-MAX &ファイル-NR:

をカーネルにはまだそれが再び彼らを解放しません動的に処理しますが、ファイルを割り当てます。

file-maxの値は、Linuxカーネルが割り当てるファイルハンドルの最大数を示します。ファイルハンドルが不足していることに関する多くのエラーメッセージが表示されたら、この制限を増やすことをお勧めします。

従来、file-nrの3つの値は、割り当てられたファイルハンドルの数、割り当てられているが使用されていないファイルハンドルの数、およびファイルハンドルの最大数を示していました。 Linux 2.6では、空きファイルハンドルの数として常に0が報告されます。これはエラーではなく、割り当てられたファイルハンドルの数が使用されるファイルハンドルの数と正確に一致することを意味します。

printkでfile-maxよりも多くのファイル記述子を割り当てようとすると、 "VFS:file-max limit reached"が検索されます。

私が最初に読んだのは、カーネルには基本的にファイル記述子のリークが内蔵されていることです。しかし、私はそれを信じるのが非常に難しいと感じています。それは、ファイルディスクリプタを解放するために、頻繁に使用されるすべてのシステムを再起動する必要があることを意味します。私が言ったように、これは本当であるとは信じられません。なぜなら、Linuxシステムを数カ月(何年も)も一度に稼働させることが普通であるからです。一方、私のアイドル状態のシステムでは、100万を超えるファイルが開かれているとも信じられません。

修正や追加の診断のためのアイデアはありますか?もちろん、システムを再起動するだけでも可能ですが、数週間おきにこれが繰り返し発生することは望ましくありません。私はFirefoxを終了しましたが、これはFirefoxを終了しました。これは、1つのウィンドウしか開いていなくても、ほぼ2000行のlsof出力(!)を占めていましたが、今度は 'ls'をもう一度実行できます。長い間問題。 (編集:あまりにも早く話しましたが、この質問の入力が終わるまでに症状は戻っていました)

ご協力いただきありがとうございます。

+0

サーバーフォールト – rene

+0

の方がいいですよ、私はそのことについては知らなかった。ポインタのおかげで、代わりに投稿します。 –

+0

そのドキュメントは正確ではないようです。[linux/fs/file_table.c](http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob; f = fs/file_table.c; hb = HEAD)は、両方ともファイルハンドルを割り当てて解放します。 どこかで漏れがあるように聞こえますが、それをどのように追跡するのかが分かりません。 – ephemient

答えて

4

私は質問を開いたままにすることはできませんので、これを見つけた人のための要約です。

私は、彼らが実際に何を思い付くことができませんでしたが、私はいくつかのより多くの調査を行なったし、最終的には、それは具体的には、NFSv4の持つ本物のバグだことがわかっ(this article)代わりにserverfaultの上、質問を再投稿

を終わりましたサーバー側のロックコード。私はrrdtoolを使っていくつかのデータをNFSマウントされたファイルに記録する、5秒ごとに監視スクリプトを実行していたNFSクライアントを持っていました。実行するたびに、ファイルを書き込み用にロックし、サーバーはオープンされたファイル記述子を割り当てましたが(誤って公開しませんでした)。このスクリプト(それほど頻繁に実行されなかったスクリプト)は、1時間に約900件のファイルをオープンし、2カ月後には限界に達しました。

いくつか解決策があります。 1)代わりにNFSv3を使用してください。 2)監視スクリプトの実行を停止します。 3)監視結果をNFSではなくローカルに格納します。 4)これを修正したNFSv4へのパッチを待ちます(Bruce Fieldsが実際に私にパッチを送ってくれましたが、時間がありませんでした)。

他の解決策が考えられます。

お試しいただきありがとうございます。

+0

5)[NFS-Ganesha](http://nfs-ganesha.sourceforge.net/)や[pynfs](http:// freshmeat.net/projects/pynfs/)。 – ephemient

+0

この問題をどのようにトラブルシューティングしましたか少し詳しく説明できますか? 「有罪」のプロセスをどうやって見つけましたか? – maximi

関連する問題