2009-05-27 8 views
8

私はcpusの設定された数のライセンスを持っているアプリケーションを持っています。チェックが行われる前にJavaが実行されるCPUの数を1に設定できます。私はSolarisを実行しており、pbindを見ていましたが、アプリケーションを起動してからpbindを使用すると、Javaが使用できるCPUの数を設定する前にライセンスをチェックしたと考えました。1つのCPUを使用するようにJavaを設定する

Solaris上で設定されたCPU数でアプリケーションを起動する方法を知っている人はいますか?

答えて

-1

グーグルでは、あなたが正しいとわかりました。pbindは、プロセスをプロセッサにバインドします。で

詳細情報と例:http://docs.sun.com/app/docs/doc/816-5166/pbind-1m?a=view

+0

ええ、ありがとう、しかし、私の質問には本当に答えることはできません。 –

3

それは、回避策ですが、あなたが利用できる単一のCPUでのゾーンを設定し、そのゾーン内でアプリケーションを実行できるのSolaris 10を使用しました。あなたは完全なアプリケーションを実行せずにテストを行いたい場合は

は、ジャワのこのビットは、最も可能性が高い彼らはCPUの数を取得するために使用しているものです。

Runtime runtime = Runtime.getRuntime(); 
int nrOfProcessors = runtime.availableProcessors(); 

完全な例here

+0

私は、pbindを使用してavailableProcessors()の結果を変更するかどうかを知りたいと思っています。 –

+0

タスクセットはavailableProcessors()の結果を変更します。 –

1

これは完全な解決策ではありませんが、1つに発展するには十分かもしれません。 javaプロセスが存在する点があり(したがって、pbindによって制御できる)、プロセッサチェックを行うコードをまだ実行していない点があります。 pbindがその作業を完了するまで、アプリケーション自体の起動を一時停止することができれば、これは正常であるはずです(pbindのアイデアはCPUチェックの観点からはうまくいくと仮定します)。

JVMを適切な場所で間違いなく一時停止する必要がある方法の1つは、リモートデバッガのソケットアタッチとサスペンドモードからの起動です。

-Xdebug -Xrunjdwp:あなたはjava呼び出しに次の引数を渡す場合は、トランスポート= dt_socketという、アドレス= 8000、その後、JVMが起動した後に一時停止します= Y、サーバー= Y

を一時停止デバッガ/エージェントがポート8000​​に接続されるまで、メインプロセスを実行します。

したがって、これらのパラメータを使用してバックグラウンドでプログラムを起動するには、ラッパースクリプトを使用することができます。 2番目またはそれ以上の場合は、pbindを使用してプロセッサ数をJavaプロセスのプロセッサ数に設定し、次にaいくつかのエージェントをポート8000​​にデタッチします(Javaに実行を進めるには十分です)。

このアイデアの欠陥や潜在的な要因は、何らかのノーオペレーションを制御できるかどうかにかかわらず、デバッグモードでの実行がアプリのパフォーマンスに著しく影響するかどうかです(一般的に大きな影響はないようです)。 JDWPエージェントをコマンドラインから起動し、マシン上のポートを開くことができるかどうかを確認します。以前は自動化しようとしたことではありませんでしたが(私は手動でJavaのプロセスを広げてからゆっくりと進化させていましたが)、見落としてしまった問題が他にもあるかもしれません。

1

あなたの質問に対する最も直接的な答えは、pbindを使用して実行中のシェルプロセスをバインドし、そのシェルからJavaを起動することだと思います。 manページによれば、バインドされたプロセスから作成されたプロセスによってpbindの影響が継承されます。これを試してみてください:

% pbind -b 0 $$ 
% java ... 
関連する問題