3

Amazon EC2 マイクロ インスタンスの JVM で Play Framework Scala アプリケーションを実行しています。アプリケーションは、多くのテキストを索引付けすることがあります。ただし、仮想マシンの CPU が常に高い負荷にさらされている場合、ハイパーバイザーは仮想マシンから時間を盗み、そのハイパーバイザーによって管理されている他の仮想マシンに与えることで、仮想マシンを罰します。

現在盗まれている時間を測定することを考えています。それが高すぎる場合 (たとえば 5% を超える場合) は、インデックス作成をしばらく一時停止します。質問:

  1. これはまったく良い考えですか?(それはクレイジーですか?または、より良いアプローチがありますか?)

  2. Scala / Javaから盗まれた時間を測定するにはどうすればよいですか?

    現在、私は外部プロセス呼び出しを行うことを考えています(たとえばSeq("bash", "-c", "echo ")!!vmstat、出力をorに日付を付け/proc/statて解析し、盗まれた時間を見つけます。しかし、これはエラーが発生しやすい可能性がありますか?たとえば、新しいバージョンのvmstat出力データが別の形式である場合はどうなるでしょうか。ただし、 の出力は/proc/stat後方互換性のない方法で変更されることはありません。(?)

これらすべてが Windows で動作する必要はありません。Ubuntu や CentOS などの Linux のフレーバーのみ。そして、外部プロセスの呼び出しが失敗した場合は、単に Scala のNone代わりにSome(percentage).

更新:適切な機能getStolenを備えたSigar という名前のライブラリを見つけました。「合計システムCPU非自発的待機時間double」を表すaを返しますが、どの単位でしょうか? そして残念ながら申請開始からの累計なのかな。とにかく、盗まれた時間を印刷するために実際にそれを使用している人がいます: https://forums.oracle.com/thread/1301532

4

2 に答える 2

2

これらのツールが仮想マシンに対応しているとは思えません。

System.nanoTime() を定期的にポーリングすることをお勧めします。時間のジャンプが見られる場合、スレッドは実行されていません。jHiccup のように、1 ミリ秒だけ待機して、それがどれくらいの時間かかったかを計測することもできます。

注: ボックスが仮想マシンに対してアイドル状態であっても、これは非常に悪い結果を示す可能性があるため、マシンに合わせて調整する必要があります。

于 2013-08-11T12:47:15.037 に答える
1

CPUに複数のコアnanoTimeがある場合、CPUの消費量はわかりません。JVM には、実際の CPU 使用率を判断するのに役立つツールMXBeanがあります。mxBean.getCurrentThreadCpuTime()用途には使えると思います。少なくとも試すことができます

@tailrec
def working {
  val startCpu = mxBean.getCurrentThreadCpuTime
  val startRealTime = System.nanoTime
  `do some work`
  val deltaCpu = mxBean.getCurrentThreadCpuTime - startCpu
  val deltaRealTime = System.nanoTime - startRealTime
  val percentage = 100.0*deltaCpu/deltaRealTime
  if(percentage>5.0) suspend else working
}
于 2013-08-13T17:34:12.577 に答える