
私はUbuntu 12.04を使用していますが、大きな問題があります。今日2回、開いているgnome-terminalセッションの1つがロックし、エラーが表示されました。
pipe: too many open files
ulimit -n
これは、表示されているユーザー制限 (ちなみに 1024)に関係している可能性が高いと認識しています。問題は、これが発生すると、問題のあるターミナルを強制終了することはできますが、新しい PID を生成するものを開くことができなくなることです。たとえば、xkill
を使用して何かを強制終了したり、別のターミナルを開いて top を確認したり、シャットダウンを実行したり、コンソールのみに切り替えてログインしたりすることはできません。X ウィンドウを開くはずのリンクをクリックすると、次の内容の新しいウィンドウが表示されます。
There was an error launching the application.
Details: Failed to fork (Cannot allocate memory)
これは、Ctrl + Alt + F1 を押してログインしようとしたときに表示されるエラーと同じです。この時点で完全に行き詰まってしまうため、マシンをハードブートせざるを得ません。これにより、デバッグが非常に困難になっています。
このエラーが発生した場合、回復するために何かできることはありますか? エラーを追跡するにはどうすればよいでしょうか?
最後に、私が実行していたのは、とんでもない数のものではありません。ターミナルが 2 つ、1 つはタブが 2 つある byobu セッション、もう 1 つは Python セッション、Emacs のインスタンスが 1 つ、Google Chrome が 1 つ、そして ROS (ロボット オペレーティング システム) ノードがいくつかありました。
編集
Ctrl+Alt+Backspace を押してディスプレイ マネージャーを再起動すると、再びログインしてターミナルを開くことができました。 を使用すると、ps
ロックアップが発生したときに実行されていたプロセスがまだ多数実行されていることがわかりました。少なくとも、これによりソフトウェアからマシンを再起動できます。この問題の原因を特定するにはどうすればよいでしょうか。
編集2
先ほど脇に置いておいたターミナルを 2 つ開いて、クラッシュが発生するのを待ちました。クラッシュが発生すると、 の出力からスクリーンショットをキャプチャできましたtop
。出力が特に役立つかどうかはわかりませんが、添付しました。特に奇妙だと気づいたのは、ゾンビ プロセスが 5 つあったことです。
答え1
どこかにリソース リークがあるようです。 'lsof' を実行すると、開いているすべてのファイルのリストを取得できます (当然、システムがリソース不足になる前の時点で)。 リストをアクティブな PID と比較すると、(おそらく) 原因が見つかります。
また、/etc/security/limits.conf のオープン ファイル制限を変更することもお勧めします (または、他の場所でしょうか? Ubuntu をしばらくフォローしていませんが、limits.conf はデフォルトでロードされないという推測があるようです)。リソース リークが本当にある場合は、問題を長引かせるだけです。まず、リークを探してください。
答え2
開いているファイルが多すぎるというメッセージは、システム全体の問題ではなく、プロセス固有のものである可能性があります。「メモリを割り当てることができません」というメッセージは、プロセス固有のものである可能性がありますが、システム全体の問題である可能性があります。
cydonian.monk が指摘したように、何らかのリソース リークが発生しています。最も可能性の高い原因は、子プロセスを繰り返し生成する暴走または不正な動作をするプロセス、またはバグやメモリ リークが原因でファイルを繰り返し開いたり、メモリを割り当てたりして、システムがメモリ不足に陥っていることです。
最初に開いているファイルが多すぎるというメッセージが表示された gnome ターミナル ウィンドウで何をしていたかに注目してください。そのウィンドウから/そのウィンドウで何が実行されていたかを特定し、その動作に注目してください。数分ごとに ps is cron を実行するか、実行してtop -b
出力をファイルに保存すると、次にクラッシュが発生したときに何が起こっていたかがわかる場合があります。
提供された上部の出力は、正常に動作しているシステムのように見えます。
答え3
ファイル数の上限を上げてみましたか?
必要なのは、/etc/security/limits.confに次の行を追加することです。
* soft nofile 6000
* hard nofile 6000