Marimite はパフォーマンス監視ツールである。
百聞は一見にしかず。
チャート ウィンドウのタブをドラッグ アンド ドロップすることができる。
チャート上でコンテキスト メニューを開くことができる。
ビューアを終了したとき、ウィンドウ位置は保存される。ビューアを再び起動すると、同じウィンドウ位置が再現される。
セクションの名前。始点と終点の名前を " - " でつないだもの。
セクションを通過するのに要した時間。単位はミリセカンド。
ログを記録した時間。経過時間を対数で表示しており、古いものは圧縮される。
最近100件の経過時間。1sの時間軸上に表示されるが、これは便宜上のものであり、現実の時刻を示すものではない。
ログ。経過時間の記録が100件たまったとき、それを昇順にソートして50番目の値。
ログ。経過時間の記録が100件たまったとき、それを昇順にソートして95番目の値。これは体感的なターンアラウンドタイムを示す値といわれる。
ログ。経過時間の記録が100件たまったとき、もっとも遅い値。
標準偏差。
package org.kaoriha.marimite.testbench;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.kaoriha.marimite.LocalStopwatch;
import org.kaoriha.marimite.MarimiteConfig;
import org.kaoriha.marimite.Stopwatch;
public class TestBenchServlet extends HttpServlet {
private Thread thread = null;
private volatile boolean isStop = false;
private static volatile boolean IS_INITIALIZED = false;
@Override
public void init() throws ServletException {
super.init();
System.out.println("ThreadServlet#init called");
synchronized (TestBenchServlet.class) {
if (IS_INITIALIZED) {
return;
}
MarimiteConfig.start();
MarimiteConfig.exportPlatformMBeanServer();
isStop = false;
Runnable r = new Runnable() {
private Random rnd = new Random();
public void run() {
Stopwatch.start("start");
LocalStopwatch lsw = new LocalStopwatch("local start");
while (true) {
if (rnd.nextBoolean()) {
wait1();
}
if (rnd.nextBoolean()) {
wait2();
}
if (isStop) {
System.out.println("ThreadServlet thread exit");
return;
}
lsw.lap("local 1");
}
}
private void wait1() {
wait(0, 40);
Stopwatch.lap("wait1 exit");
}
private void wait2() {
wait(20, 80);
Stopwatch.lap("wait2 exit");
}
private void wait(int lower, int upper) {
int w = lower + rnd.nextInt(upper - lower);
try {
Thread.sleep(w);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
};
thread = new Thread(r);
thread.start();
IS_INITIALIZED = true;
}
}
@Override
public void destroy() {
System.out.println("ThreadServlet#destroy called");
synchronized (TestBenchServlet.class) {
if (IS_INITIALIZED) {
isStop = true;
thread = null;
MarimiteConfig.stop();
IS_INITIALIZED = false;
}
}
super.destroy();
}
}