web-dev-qa-db-ja.com

パイプ:開いているファイルが多すぎると、OS全体が完全に役に立たなくなります

Ubuntu 12.04を実行していますが、大きな問題が発生しています。今日の2回の別々の時間、私の開いているgnome-terminalセッションの1つがロックされ、エラーが出力されました

pipe: too many open files

これは、ulimit -nで示されるユーザー制限(ちなみに1024)に関連している可能性が高いことを認識しています。問題は、これが発生すると、問題のある端末を強制終了できますが、それを開くことができないことです。新しいPIDを生成します。たとえば、xkillを使用して何かを強制終了したり、別のターミナルを開いて上部を確認したり、シャットダウンを実行したり、コンソールにドロップしてログインしたりすることはできません。 Xウィンドウを開くはずのリンクをクリックすると、次のような新しいウィンドウが表示されます。

There was an error launching the application.
Details: Failed to fork (Cannot allocate memory)

これは、Ctrl + Alt + F1を押した後にログインしようとしたときに発生するエラーと同じです。この時点で完全にスタックしているため、マシンをハードブートする必要があります。これにより、デバッグが非常に困難になっています。

このエラーが発生した場合に回復するためにできることはありますか?エラーを追跡するにはどうすればよいですか?

最後に、私はばかげた数のことを実行していません:2つの端末、1つは2つのタブを持つ屏風セッション、もう1つはpythonセッション; emacsの単一インスタンス、単一のグーグルクローム、およびいくつかのROS(ロボットオペレーティングシステム)ノード。

[〜#〜]編集[〜#〜]

Ctrl + Alt + Backspaceを押してディスプレイマネージャを再起動すると、ログインし直してターミナルを開くことができました。 psを使用すると、ロックアップが発生した状態で実行されていた多くのプロセスがまだ実行されていることがわかりました。少なくとも、これにより、ソフトウェアからマシンを再起動できます。この問題の原因を特定するにはどうすればよいですか?

編集2

取っておいた2つの端末を開いて、クラッシュが発生するのを待ちました。それが起こったら、私はtopの出力からスクリーンショットをキャプチャすることができました。出力が特に役立つかどうかはわかりませんが、添付しました。特に奇妙なことに気付いたのは、ゾンビプロセスが5つあることだけでした。enter image description here

1
jarvisschultz

どこかにリソースリークがあるようです。 'lsof'を実行して、開いているすべてのファイルのリストを取得できます(明らかに、システムが枯渇する前のある時点で)。リストをアクティブなpidと比較すると、(おそらく)原因が見つかります。

/etc/security/limits.confのオープンファイル制限を変更することもお勧めします(または他の場所ですか?しばらくUbuntuをフォローしておらず、limits.confがロードされていないという推測があるようですデフォルト)。本当にリソースリークがある場合、それは問題を長引かせるだけです。最初に漏れを探します。

2
cydonian.monk

開いているファイルが多すぎるというメッセージは、おそらくプロセス固有のものであり、システム全体の問題ではありません。 「メモリを割り当てることができません」はプロセス固有である可能性がありますが、おそらくシステム全体です。

Cydonian.monkが指摘したように、ある種のリソースリークがあります。最も可能性の高い原因は、子を繰り返し生成する暴走または誤動作プロセス、またはファイルを繰り返し開いたり、システムがメモリ不足になるまでメモリを割り当てたりするバグまたはメモリリークがあることです。

最初にファイルが多すぎるというメッセージが表示された1つのgnomeターミナルウィンドウで何をしていたかに焦点を当てます。そのウィンドウから/そのウィンドウで何が実行されていたかを判別し、その動作に焦点を合わせます。 psの実行は数分ごとのcronであるか、top -bを実行して出力をファイルに保存すると、次のクラッシュが発生したときに何が起こっていたかを垣間見ることができます。

提供した一番上の出力は、通常実行されているシステムのように見えます。

1
Yedric

ファイル数の上限を上げてみましたか?

あなたがする必要があるのは、これらの行を/etc/security/limits.confに追加することです

* soft nofile 6000
* hard nofile 6000
0
Dr_Hope