設定された数の CPU のライセンスを持つアプリケーションがあり、チェックが完了する前に Java が実行される CPU の数を 1 に設定できるようにしたいと考えています。私は Solaris を実行していpbind
ますが、アプリケーションを起動してから pbind を使用すると、Java が使用できる CPU の数を設定する前にライセンスがチェックされると考えました。
Solaris で一定数の CPU を使用してアプリケーションを起動する方法を知っている人はいますか?
これは回避策ですが、Solaris 10を使用して、単一のCPUを使用できるゾーンを設定し、そのゾーン内でアプリケーションを実行することができます。
アプリケーション全体を実行せずにテストを実行する場合、Javaのこのビットは、CPUの数を取得するために使用している可能性があります。
Runtime runtime = Runtime.getRuntime();
int nrOfProcessors = runtime.availableProcessors();
ここに完全な例があります。
あなたの質問に対する最も直接的な答えは、pbind を使用して実行中のシェル プロセスをバインドし、そのシェルから Java を起動することだと思います。man ページによると、pbind の効果は、バインドされたプロセスから作成されたプロセスに継承されます。これを試して:
% pbind -b 0 $$
% java ...
これは完全な解決策ではありませんが、1 つに発展するには十分かもしれません。java
プロセスが存在する時点 (したがって によって制御できるpbind
時点) と、プロセッサ チェックを行うコードをまだ実行していない時点が確実に存在します。pbind が作業を完了するまでアプリケーション自体の起動を一時停止できる場合は、これで問題ありません (pbind の考え方が CPU チェックの観点から機能すると仮定します)。
JVM を適切な場所で確実に一時停止する方法の 1 つは、リモート デバッガーのソケット アタッチで、サスペンド モードで開始することです。java
次の引数を呼び出しに渡す場合:
-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,suspend=y,server=y
JVM は Java プロセスを開始した後、メイン クラスを実行する前に、デバッガー/エージェントがポート 8000 に接続されるまで一時停止します。
したがって、ラッパー スクリプトを使用して、これらのパラメーターを使用してバックグラウンドでプログラムを開始し、1 秒程度スリープさせ、pbind を使用してプロセッサの数を Java プロセス用に 1 つに設定し、エージェントをアタッチおよびデタッチすることができます。ポート 8000 に接続します (Java を実行に移すにはこれで十分です)。
このアイデアの欠陥または潜在的な問題点は、デバッグ モードでの実行がアプリのパフォーマンスに著しく影響するかどうか (一般的に大きな影響はないようです)、ある種の no-op JDWP エージェントを から制御できるかどうかです。コマンドライン、およびマシンでポートを開くことができるかどうか。これは私が以前に自動化しようとしたものではありません (ただしnice
、Java プロセスを緩める前にその性質を高めるために手動の方法で広く類似したものを使用したことがあります)。
グーグルで調べてみると、あなたが正しいことがわかりました。pbindはプロセスをプロセッサにバインドします。
詳細と例:http://docs.sun.com/app/docs/doc/816-5166/pbind-1m?a = view