2009-07-29 13 views
2

マシンはデュアルコアで、OSはマルチプロセッサカーネルを使用します。パフォーマンスアセスメントを実行するために、JVMのスレッドアフィニティを単一のコアに設定する必要があります。しかし、私はJVMがスレッドコアとガーベジコレクションのためにマルチプロセッサプリミティブを使用しているのに今は単一のコアに制約されていることに気づかないかもしれないので、パフォーマンスの測定値が歪んでしまうのではないかと心配しています。ガベージコレクタはコマンドラインからチューニングすることができますが、これはスレッド同期のためには不可能です。シングルまたはマルチプロセッサのスレッド同期を使用するかどうかをHotspot JVMに伝えるにはどうすればよいですか?

ここで、JVMはそのスレッドにほとんどOSスレッド(*)を使用します。だから多分質問はむしろ "OS(Windows/Linux)は、対応するプロセスのスレッドアフィニティを設定して単一のコアを使用することに制約があるマルチスレッドアプリケーションで正しい同期プリミティブを使用するのですか?"

(*)これは、OSを呼び出す前にJVMが単独で回転するWindowsでは正確には当てはまりません。その動作は-XX:+ UseSpinningと-XX:PreBlockSpinの設定で制御できます。

答えて

0

JVMの親和性のみを設定すると、結果はある程度偏って表示されます。 JVMがシングルコアマシン上で動作しているかのように100%動作しても、OSカーネルやその他のユーザースペースコードは引き続き追加のコアを使用します。つまり、コンテキスト切り替えのオーバーヘッドが少なく、したがってパフォーマンスの特性が異なります。

私は2番目のコアを無効にするだけです。あなたがWindows XPにしていると仮定すると:boot optionsのリストに

/onecpu 

を追加することにより、c:\boot.iniを編集し、マシンを再起動します。