2016-12-29 28 views
0

私は32000プロセスをforkするPerlスクリプトを作成しており、各プロセスは24時間稼動しています。しかし、私はその多くのプロセスをフォークできません。回避策はありますか?コードはプロセスの数を減らしても問題なく動作します。ここに私が得ているエラーがあります:Perl :: 32000プロセスをforkすることができません

pty_allocate(nonfatal): posix_openpt(): No space left on device at /usr/local/lib64/perl5/IO/Pty.pm line 24. 
pty_allocate(nonfatal): getpt(): No such file or directory at /usr/local/lib64/perl5/IO/Pty.pm line 24. 
pty_allocate(nonfatal): getpt(): No such file or directory at /usr/local/lib64/perl5/IO/Pty.pm line 24. 
pty_allocate(nonfatal): openpty(): No such file or directory at /usr/local/lib64/perl5/IO/Pty.pm line 24. 
pty_allocate(nonfatal): open(/dev/ptmx): No space left on device at /usr/local/lib64/perl5/IO/Pty.pm line 24. 
+1

32000プロセスをフォークするよりも、実行していることを実行するためのより良い方法が必要です。 –

+0

アプリケーションの一種のストレステスト。アプリケーションは最大32000のインスタンスをサポートします。 – user3686233

+0

31999で動作しますか? –

答えて

5

あなたの問題はPerlではなく、オペレーティングシステムの制限です。あなたのカーネルは有限数のptysの割り当てのみを許可します。これは、ユーザー単位またはプロセス単位の制限ではなく、グローバル(システム全体)の制限です。あなたは、Linux、man 7 ptyの下で実行されていると仮定すると、

2.6.3含めへの最大のカーネルでは

、この制限を カーネルのコンパイル時間(CONFIG_UNIX98_PTYS)で構成された、との許可 数されていることを教えてくれるデフォルトの設定は で、2048まで可能です。カーネル2.6.4以降、/ proc/sys/kernel/pty/maxで調整可能な制限は で、対応する ファイル/ proc/sys /カーネル/ pty/nrは、いくつの擬似端末 が現在使用中であるかを示します。

したがって、比較的最近の(2.6.4以降の)Linuxカーネルを使用している場合は、cat /proc/sys/kernel/pty/maxを使用して、システム全体の最大pty数を確認する必要があります。 this documentによると

(私は自分自身を確認するためにそれを試していない)、あなたはsysctlの設定をリロードするsysctl -pを使用して、その後、/etc/sysctl.confを編集し、ラインkernel.pty.max = 5120(または任意の数)を追加することによって、制限を変更することができるはずです。

しかし、各ptyは他のシステムリソース(メモリ、ファイルハンドルなど)の割り当てを必要とするので、最大ptyを任意の数に増やすとシステムの残りの部分に非常に悪いことが起きる可能性があります。

関連する問題