2009-04-29 7 views
1

ソケットチャンネルを開くときはいつでも。クライアントが受け入れるならば、1つのファイルディスクリプタが内部で作成されるので、Linuxで最大1024のクライアントを作成できます。
しかし、Linuxでファイル記述子の制限を増やさずにクライアントを増やしたいと思います。 (ulimit -n 20000) Javaでソケットを増やすにはどうすればいいですか?ファイルの制限を大きくしないで20000クライアントをJavaで開くにはどうすればよいですか?

+0

これらのファイルが必要ですか?彼らには何が含まれていますか? –

+1

@Adam:私は彼が "ファイル記述子"を意味していると思います。物理的なファイルは含まれていませんが、オープンソケットはfdを使います。 – unwind

+0

@unwind:ああ、そうです。ありがとう! :) –

答えて

2

セッションが1024個のファイル記述子に制限されている場合は、単一のJVMからセッションを使用することはできません。

しかし、ulimitはプロセスごとの制限であるため、より多くのJVMを開始することで回避できます(つまり、2048接続にはそれぞれ1024を使用する2つのJVMが開始されます)。

2

UDPを使用している場合は、1つのローカルソケットで自分自身を多重化できますか?受信パケットは、送信元アドレスとポートで区切ることができます。

TCPの場合は、運が悪いので、各ソケットを閉じた後にTIME_WAITになると状態が悪化します。

0

膨大な数の接続に対処しようとしている場合、親プロセスにデータを受け入れて転送する以外に、軽量のdataserverプロセスを実装することがスケーラブルな方法です。

このように、各dataserverが飽和状態になると、新しいインスタンスを生成して、自分自身に別の1024の接続を与えることができます。必要に応じて別々のマシンにそれらを存在させることさえできます。

+0

申し訳ありませんが、私はあなたを正しく理解できませんでした。もう一度私に説明してください。 – Deepak

2

なぜulimitを増やせませんか?人為的な限界のようです。 Javaコード(afaik)からは、システムにアクセスしてulimitをリセットする方法はありません。プロセスを開始する前に設定する必要があります。起動スクリプトなどです。

のJBoss起動スクリプト

は、彼らがJBossを起動する前に

レン

2

がリミットRLIMIT_NOFILEが作動するシステムによって強制されて...「のulimit -n $ MAX_FD」をpeformし、プロセスのfd最高制限することができます作成します。開いているファイル、パイプ、ソケットごとに1つのfdが使用されます。

ハードリミットとソフトリミットがあります。 (シェルやjvmのような)どのプロセスもソフトの値を変更することが許されますが、特権を持つプロセス(rootユーザーが実行するシェルのような)だけがハード値を変更することができます。

a)マシンの制限を変更できない場合は、そのマシンを見つけてください。

b)なんらかの理由でulimitを入力することができない場合は、JNA:man setrlimit(2)を使用して基本システムコールを呼び出すことができます。 (.exec()それがコマンドに組み込まれているとして行うことはありません)

も参照してくださいWorking With Ulimit

1

私たちのjavaプロセスは、「あまりにも多くのファイルオープン」の例外をたくさん投げていたので、我々は最近、私たちのulimitを引き上げました。

今は65536で、問題はありません。

+0

ulimitが正しく設定されていれば、20k +を開くことができるはずです。 – MarkR

+0

ここで、os?私たちはubuntuサーバーを使用しており、2000の制限があるようです。1000を超えると、最大ファイルサイズに奇妙な問題があります。あなたはulimit -nを使って制限を設定しましたか? – Tarnschaf

関連する問題