2016-03-04 56 views
8

今日、私は、監視されているJVMにOSで制限されたプロセスアフィニティが設定されている場合でも、OracleのJava VisualVMがCPUコアの割合としてCPU使用率を示すことがわかりました。これは「モニタ」タブにあります。 (Linuxでは、Ubuntuの上)tasksetでモニターJVMを制限Java VisualVMのCPU使用率とプロセッサのアフィニティー

、そのJVMに許可プロセッサはhtop 100%の使用率に近い場合、VisualVMのに示すCPUの割合がで割ったCPUの総数に明らかに等しいです監視対象のjvmに許可されているプロセッサの数。従って、この場合、スケールの分解能は不十分である。

他のオペレーティングシステムまたは一般的に同じことが確認されましたか?

CPU使用率を表示しているときにアフィニティ割り当てのコアにのみVisualVMアカウントを設定する方法はありますか?

答えて

5

VisualVM source codeによれば、CPU使用率は、実際のプロセッサの数で割った総CPU時間として計算される。

OperatingSystemMXBean osbean = mxbeans.getOperatingSystemMXBean(); 
    if (osbean != null) processorsCount = osbean.getAvailableProcessors(); 

あった:processorsCountOperatingSystemMXBeanから得られる

long processCpuTime = tracksProcessCpuTime ? 
     model.getProcessCpuTime()/processorsCount : -1; 

長年にわたるJVMバグJDK-6515172、プロセスアフィニティが考慮されていない、つまりgetAvailableProcessorsは、タスクセットに関係なく常にCPUの総数を返しました。これはLinuxやBSDに特有のものでした。 SolarisとWindowsで正常に動作しました。

約1ヶ月前にこのバグが最終的に解決されました。ただし、この修正はJDK 9のみに適用されます。

考えられる回避策については、this questionを参照してください。彼らは幾分醜いです。

関連する問題