[parfait] 12 new revisions pushed by tallpsm...@gmail.com on 2012-02-20 04:10 GMT

3 views
Skip to first unread message

par...@googlecode.com

unread,
Feb 19, 2012, 11:11:59 PM2/19/12
to parfa...@googlegroups.com
12 new revisions:

Revision: aa2ae819cb67
Author: psmith <psm...@aconex.com>
Date: Fri Feb 17 18:50:42 2012
Log: Add JCommander to the dependencies for parameterised command line
argu...
http://code.google.com/p/parfait/source/detail?r=aa2ae819cb67

Revision: efb77503c2a3
Author: psmith <psm...@aconex.com>
Date: Fri Feb 17 18:51:18 2012
Log: Refactor this buffer slicing into a method for readability.
http://code.google.com/p/parfait/source/detail?r=efb77503c2a3

Revision: 9669b9ba46d3
Author: psmith <psm...@aconex.com>
Date: Fri Feb 17 18:51:49 2012
Log: Added BlockedMetricCollector has a standard way of capturing
blocked t...
http://code.google.com/p/parfait/source/detail?r=9669b9ba46d3

Revision: 9cf1813d8100
Author: psmith <psm...@aconex.com>
Date: Fri Feb 17 18:52:06 2012
Log: Introduce helper methods for calculating standard metrics across
tests...
http://code.google.com/p/parfait/source/detail?r=9cf1813d8100

Revision: 3c9a92fbe000
Author: psmith <psm...@aconex.com>
Date: Fri Feb 17 18:52:56 2012
Log: Refactor the existing benchmark to use the new helper
methods/objects.
http://code.google.com/p/parfait/source/detail?r=3c9a92fbe000

Revision: 203e6a569b18
Author: psmith <psm...@aconex.com>
Date: Fri Feb 17 19:01:19 2012
Log: Introduce a benchmark for grabbing the CPU metrics from the
Thread JMX...
http://code.google.com/p/parfait/source/detail?r=203e6a569b18

Revision: bacb5f78c1c7
Author: psmith <psm...@aconex.com>
Date: Sat Feb 18 18:06:21 2012
Log: Report iterations/second.
http://code.google.com/p/parfait/source/detail?r=bacb5f78c1c7

Revision: 169f53d55b86
Author: psmith <psm...@aconex.com>
Date: Sat Feb 18 18:23:53 2012
Log: Use enum based way of getting the CPU information to show how
slow the...
http://code.google.com/p/parfait/source/detail?r=169f53d55b86

Revision: 354b855db5dc
Author: psmith <psm...@aconex.com>
Date: Sat Feb 18 18:29:36 2012
Log: Actually enabled/disable the _correct_ cpu monitoring enabler
property...
http://code.google.com/p/parfait/source/detail?r=354b855db5dc

Revision: 4de507ecafcb
Author: psmith <psm...@aconex.com>
Date: Sat Feb 18 18:34:27 2012
Log: add CpuThreadTest to runnable tests
http://code.google.com/p/parfait/source/detail?r=4de507ecafcb

Revision: 390171bb7034
Author: psmith <psm...@aconex.com>
Date: Sat Feb 18 18:34:43 2012
Log: minor refactor
http://code.google.com/p/parfait/source/detail?r=390171bb7034

Revision: ccad734dc145
Author: psmith <psm...@aconex.com>
Date: Sun Feb 19 20:10:40 2012
Log: Refactor the environment header reporting to be shared between
the 2 b...
http://code.google.com/p/parfait/source/detail?r=ccad734dc145

==============================================================================
Revision: aa2ae819cb67
Author: psmith <psm...@aconex.com>
Date: Fri Feb 17 18:50:42 2012
Log: Add JCommander to the dependencies for parameterised command line
arguments.
http://code.google.com/p/parfait/source/detail?r=aa2ae819cb67

Modified:
/parfait-benchmark/pom.xml

=======================================
--- /parfait-benchmark/pom.xml Sat Feb 11 04:25:36 2012
+++ /parfait-benchmark/pom.xml Fri Feb 17 18:50:42 2012
@@ -78,5 +78,10 @@
<artifactId>parfait-spring</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>com.beust</groupId>
+ <artifactId>jcommander</artifactId>
+ <version>1.7</version>
+ </dependency>
</dependencies>
</project>

==============================================================================
Revision: efb77503c2a3
Author: psmith <psm...@aconex.com>
Date: Fri Feb 17 18:51:18 2012
Log: Refactor this buffer slicing into a method for readability.
http://code.google.com/p/parfait/source/detail?r=efb77503c2a3

Modified:
/dxm/src/main/java/com/custardsource/parfait/dxm/BasePcpWriter.java

=======================================
--- /dxm/src/main/java/com/custardsource/parfait/dxm/BasePcpWriter.java Tue
Feb 14 14:08:28 2012
+++ /dxm/src/main/java/com/custardsource/parfait/dxm/BasePcpWriter.java Fri
Feb 17 18:51:18 2012
@@ -109,22 +109,25 @@
dataFileBuffer = byteBufferFactory.build(getBufferLength());
synchronized (globalLock) {
populateDataBuffer(dataFileBuffer, metricData.values());
-
- for (PcpValueInfo info : metricData.values()) {
- TypeHandler<?> rawHandler = info.getTypeHandler();
- int bufferPosition = rawHandler.requiresLargeStorage() ?
info.getLargeValue()
- .getOffset() : info.getOffset();
- // need to position the original buffer first, as the
sliced buffer starts from there
- dataFileBuffer.position(bufferPosition);
- ByteBuffer metricByteBufferSlice = dataFileBuffer.slice();
- metricByteBufferSlice.limit(rawHandler.getDataLength());
- perMetricByteBuffers.put(info, metricByteBufferSlice);
- metricByteBufferSlice.order(dataFileBuffer.order());
- }
+ preparePerMetricBufferSlices();
}

started = true;
}
+
+ private void preparePerMetricBufferSlices() {
+ for (PcpValueInfo info : metricData.values()) {
+ TypeHandler<?> rawHandler = info.getTypeHandler();
+ int bufferPosition = rawHandler.requiresLargeStorage() ?
info.getLargeValue()
+ .getOffset() : info.getOffset();
+ // need to position the original buffer first, as the sliced
buffer starts from there
+ dataFileBuffer.position(bufferPosition);
+ ByteBuffer metricByteBufferSlice = dataFileBuffer.slice();
+ metricByteBufferSlice.limit(rawHandler.getDataLength());
+ perMetricByteBuffers.put(info, metricByteBufferSlice);
+ metricByteBufferSlice.order(dataFileBuffer.order());
+ }
+ }

@Override
public final void setInstanceDomainHelpText(String instanceDomain,
String shortHelpText, String longHelpText) {

==============================================================================
Revision: 9669b9ba46d3
Author: psmith <psm...@aconex.com>
Date: Fri Feb 17 18:51:49 2012
Log: Added BlockedMetricCollector has a standard way of capturing
blocked time across tests.
http://code.google.com/p/parfait/source/detail?r=9669b9ba46d3

Added:

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/BlockedMetricCollector.java

=======================================
--- /dev/null
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/BlockedMetricCollector.java
Fri Feb 17 18:51:49 2012
@@ -0,0 +1,46 @@
+package com.custardsource.parfait.benchmark;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
+
+public class BlockedMetricCollector {
+
+ private final long initialBlockedCount;
+ private final long initialBlockedTime;
+ private final long threadId;
+ private long totalBlockedCount;
+ private long totalBlockedTime;
+
+ public BlockedMetricCollector(long threadId) {
+ this.threadId = threadId;
+ ThreadInfo initialThreadInfo = getThreadInfo(threadId);
+ initialBlockedCount = initialThreadInfo.getBlockedCount();
+ initialBlockedTime = initialThreadInfo.getBlockedTime();
+ }
+
+ public BlockedMetricCollector() {
+ this(Thread.currentThread().getId());
+ }
+
+ private ThreadInfo getThreadInfo(long threadId) {
+ return ManagementFactory.getThreadMXBean().getThreadInfo(threadId);
+ }
+
+ public void computeFinalValues() {
+ ThreadInfo finalThreadInfo = getThreadInfo(threadId);
+
+ long finalBlockedCount = finalThreadInfo.getBlockedCount();
+ long finalBlockedTime = finalThreadInfo.getBlockedTime();
+
+ totalBlockedCount = finalBlockedCount - initialBlockedCount;
+ totalBlockedTime = finalBlockedTime - initialBlockedTime;
+ }
+
+ public long getTotalBlockedCount() {
+ return totalBlockedCount;
+ }
+
+ public long getTotalBlockedTime() {
+ return totalBlockedTime;
+ }
+}

==============================================================================
Revision: 9cf1813d8100
Author: psmith <psm...@aconex.com>
Date: Fri Feb 17 18:52:06 2012
Log: Introduce helper methods for calculating standard metrics across
tests.
http://code.google.com/p/parfait/source/detail?r=9cf1813d8100

Added:

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/BlockedMetricHelper.java

=======================================
--- /dev/null
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/BlockedMetricHelper.java
Fri Feb 17 18:52:06 2012
@@ -0,0 +1,24 @@
+package com.custardsource.parfait.benchmark;
+
+import java.util.List;
+
+public class BlockedMetricHelper {
+ private BlockedMetricHelper() {
+ }
+
+ static long computeTotalBlockedCount(List<BlockedMetricCollector>
blockedMetricCollectors) {
+ long totalBlockedCount = 0;
+ for (BlockedMetricCollector collector : blockedMetricCollectors) {
+ totalBlockedCount += collector.getTotalBlockedCount();
+ }
+ return totalBlockedCount;
+ }
+
+ static long computeTotalBlockedTime(List<BlockedMetricCollector>
blockedMetricCollectors) {
+ long totalBlockedTime = 0;
+ for (BlockedMetricCollector collector : blockedMetricCollectors) {
+ totalBlockedTime += collector.getTotalBlockedTime();
+ }
+ return totalBlockedTime;
+ }
+}

==============================================================================
Revision: 3c9a92fbe000
Author: psmith <psm...@aconex.com>
Date: Fri Feb 17 18:52:56 2012
Log: Refactor the existing benchmark to use the new helper
methods/objects.
http://code.google.com/p/parfait/source/detail?r=3c9a92fbe000

Modified:

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CounterIncrementer.java

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/StandardMetricThroughPutBenchmark.java

=======================================
---
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CounterIncrementer.java
Sat Feb 11 04:29:22 2012
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CounterIncrementer.java
Fri Feb 17 18:52:56 2012
@@ -1,7 +1,6 @@
package com.custardsource.parfait.benchmark;

import java.lang.management.ManagementFactory;
-import java.lang.management.ThreadInfo;
import java.util.List;

import com.custardsource.parfait.MonitoredCounter;
@@ -10,9 +9,7 @@

private final List<MonitoredCounter> counters;
private final int iterations;
- private ThreadInfo initialThreadInfo;
- private volatile long totalBlockedCount;
- private volatile long totalBlockedTime;
+ private BlockedMetricCollector blockedMetricCollector;

public CounterIncrementer(List<MonitoredCounter> counters, int
iterations) {
this.counters = counters;
@@ -21,33 +18,19 @@

@Override
public void run() {
-

ManagementFactory.getThreadMXBean().setThreadContentionMonitoringEnabled(true);

- this.initialThreadInfo =
ManagementFactory.getThreadMXBean().getThreadInfo(Thread.currentThread().getId());
- long initialBlockedCount = initialThreadInfo.getBlockedCount();
- long initialBlockedTime = initialThreadInfo.getBlockedTime();
+ this.blockedMetricCollector = new BlockedMetricCollector();
for (int i = 0; i < iterations; i++) {

for (MonitoredCounter counter : counters) {
counter.inc();
}
}
-
- ThreadInfo finalThreadInfo =
ManagementFactory.getThreadMXBean().getThreadInfo(Thread.currentThread().getId());
- long finalBlockedCount = finalThreadInfo.getBlockedCount();
- long finalBlockedTime = finalThreadInfo.getBlockedTime();
-
- totalBlockedCount = finalBlockedCount-initialBlockedCount;
- totalBlockedTime = finalBlockedTime-initialBlockedTime;
+ blockedMetricCollector.computeFinalValues();
}

-
- public long getTotalBlockedCount() {
- return totalBlockedCount;
- }
-
- public long getTotalBlockedTime() {
- return totalBlockedTime;
+ public BlockedMetricCollector getBlockedMetricCollector() {
+ return blockedMetricCollector;
}
}
=======================================
---
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/StandardMetricThroughPutBenchmark.java
Sat Feb 11 04:31:53 2012
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/StandardMetricThroughPutBenchmark.java
Fri Feb 17 18:52:56 2012
@@ -1,5 +1,7 @@
package com.custardsource.parfait.benchmark;

+import static
com.custardsource.parfait.benchmark.BlockedMetricHelper.computeTotalBlockedCount;
+import static
com.custardsource.parfait.benchmark.BlockedMetricHelper.computeTotalBlockedTime;
import static com.google.common.collect.Lists.newArrayList;

import java.lang.management.ManagementFactory;
@@ -21,6 +23,8 @@
import com.custardsource.parfait.pcp.MetricNameMapper;
import com.custardsource.parfait.pcp.PcpMonitorBridge;
import com.custardsource.parfait.spring.SelfStartingMonitoringView;
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.SystemUtils;

@@ -35,7 +39,6 @@
private final int numCounters;
private final ExecutorService executorService;

-
public StandardMetricThroughPutBenchmark(int numThreads, int
numCounters, int iterations, boolean startPcp, boolean usePerMetricLock) {
this.numThreads = numThreads;
this.numCounters = numCounters;
@@ -86,35 +89,27 @@
return counters;
}

+ private List<BlockedMetricCollector>
transformToListOfBlockedMetricCollectors(List<CounterIncrementer>
counterIncrementers) {
+ return Lists.transform(counterIncrementers, new
Function<CounterIncrementer, BlockedMetricCollector>() {
+ @Override
+ public BlockedMetricCollector apply(CounterIncrementer input) {
+ return input.getBlockedMetricCollector();
+ }
+ });
+ }
private void report(boolean startPcp, List<MonitoredCounter> counters,
long timeTaken, List<CounterIncrementer> counterIncrementers) {
- long totalBlockedCount =
computeTotalBlockedCount(counterIncrementers);
- long totalBlockedTime =
computeTotalBlockedTime(counterIncrementers);
+ long totalBlockedCount =
computeTotalBlockedCount(transformToListOfBlockedMetricCollectors(counterIncrementers));
+ long totalBlockedTime =
computeTotalBlockedTime(transformToListOfBlockedMetricCollectors(counterIncrementers));
double counterIncrements = computeTotalCounterIncrements(counters);
-
+
double incrementRate = counterIncrements / ((double) timeTaken /
1000);
NumberFormat numberFormat = NumberFormat.getNumberInstance();
numberFormat.setGroupingUsed(true);
numberFormat.setMaximumFractionDigits(2);
numberFormat.setMinimumFractionDigits(2);
String incrementRateString =
StringUtils.leftPad(numberFormat.format(incrementRate), 15);
-
-
System.out.printf("pcpStarted: %s\tperMetricLock: %s\tincrementRate(/sec): %s\t
blockedCount: %d\t blockedTime: %d\n", startPcp, usePerMetricLock,
incrementRateString, totalBlockedCount, totalBlockedTime);
- }
-
- private long computeTotalBlockedCount(List<CounterIncrementer>
counterIncrementers) {
- long totalBlockedCount = 0;
- for (CounterIncrementer counterIncrementer : counterIncrementers) {
- totalBlockedCount += counterIncrementer.getTotalBlockedCount();
- }
- return totalBlockedCount;
- }
-
- private long computeTotalBlockedTime(List<CounterIncrementer>
counterIncrementers) {
- long totalBlockedTime = 0;
- for (CounterIncrementer counterIncrementer : counterIncrementers) {
- totalBlockedTime += counterIncrementer.getTotalBlockedTime();
- }
- return totalBlockedTime;
+
+
System.out.printf("pcpStarted: %s\tperMetricLock: %s\tincrementRate(/sec): %s\t
blockedCount: %d\t blockedTime: %d\n", startPcp, usePerMetricLock,
incrementRateString, totalBlockedCount, totalBlockedTime);
}

private double computeTotalCounterIncrements(List<MonitoredCounter>
counters) {

==============================================================================
Revision: 203e6a569b18
Author: psmith <psm...@aconex.com>
Date: Fri Feb 17 19:01:19 2012
Log: Introduce a benchmark for grabbing the CPU metrics from the
Thread JMX beans to test the theory of how fast/slow different ways of
doing this are across JVM implementations and operating systems. This is
code based on a simple example done by Gokul and Nathan from Aconex but
done in a way to parametrize the different ways of deriving the CPU metrics
for the thread.
http://code.google.com/p/parfait/source/detail?r=203e6a569b18

Added:

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTestRunner.java

=======================================
--- /dev/null
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java
Fri Feb 17 19:01:19 2012
@@ -0,0 +1,102 @@
+package com.custardsource.parfait.benchmark;
+
+import static
com.custardsource.parfait.benchmark.BlockedMetricHelper.computeTotalBlockedCount;
+import static
com.custardsource.parfait.benchmark.BlockedMetricHelper.computeTotalBlockedTime;
+import static com.google.common.collect.Lists.newArrayList;
+
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
+import org.apache.commons.lang.StringUtils;
+
+public class CPUThreadTest {
+
+ private static final int MAX_THREAD_COUNT = 50;
+ private static final int DEFAULT_ITERATIONS = 100000;
+
+ @Parameter(names = {"-numThreads"}, required = false)
+ private int numThreads = MAX_THREAD_COUNT;
+
+ @Parameter(names = {"-iterations"}, required = false)
+ private int iterations = DEFAULT_ITERATIONS;
+
+ public CPUThreadTest() {
+ }
+
+ private void doTest() {
+ setUp();
+ runBenchmark(true, false);
+ runBenchmark(true, true);
+ runBenchmark(false, false);
+ runBenchmark(false, true);
+
+ }
+
+ private void runBenchmark(boolean cpuTracingEnabled, boolean
useThreadIdLookup) {
+ ExecutorService executorService =
Executors.newFixedThreadPool(numThreads);
+ List<CPUThreadTestRunner> executions = newArrayList();
+
+ for (int i = 0; i < numThreads; i++) {
+ CPUThreadTestRunner cpuThreadTestRunner = new
CPUThreadTestRunner(iterations, cpuTracingEnabled, useThreadIdLookup);
+ executorService.execute(cpuThreadTestRunner);
+ executions.add(cpuThreadTestRunner);
+ }
+
+ awaitExecutionCompletion(executorService);
+ report(executions, cpuTracingEnabled, useThreadIdLookup);
+ }
+
+ private void report(List<CPUThreadTestRunner> cpuThreadTestRunners,
boolean cpuTracingEnabled, boolean useThreadIdLookup) {
+ long totalBlockedCount =
computeTotalBlockedCount(transformToListOfBlockedMetricCollectors(cpuThreadTestRunners));
+ long totalBlockedTime =
computeTotalBlockedTime(transformToListOfBlockedMetricCollectors(cpuThreadTestRunners));
+
+
System.out.printf("cpuTracingEnabled: %s\tuseThreadIdLookup: %s\tblockedCount: %d\tblockedTime: %d\n",
leftPadBoolean(cpuTracingEnabled), leftPadBoolean(useThreadIdLookup),
totalBlockedCount, totalBlockedTime);
+ }
+
+ private String leftPadBoolean(boolean theBoolean) {
+ return StringUtils.leftPad(Boolean.toString(theBoolean), 5);
+ }
+
+ private void awaitExecutionCompletion(ExecutorService executorService)
{
+ try {
+ executorService.shutdown();
+ executorService.awaitTermination(1, TimeUnit.MINUTES);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private List<BlockedMetricCollector>
transformToListOfBlockedMetricCollectors(List<CPUThreadTestRunner>
cpuThreadTestRunners) {
+ return Lists.transform(cpuThreadTestRunners, new
Function<CPUThreadTestRunner, BlockedMetricCollector>() {
+ @Override
+ public BlockedMetricCollector apply(CPUThreadTestRunner input)
{
+ return input.getBlockedMetricCollector();
+ }
+ });
+ }
+
+ private void setUp() {
+ System.out.printf("iterations: %d\n", iterations);
+ System.out.printf("numThreads: %d\n", numThreads);
+ }
+
+ public static void main(String[] args) {
+
+ CPUThreadTest cpuThreadTest = new CPUThreadTest();
+ try {
+ new JCommander(cpuThreadTest, args);
+ cpuThreadTest.doTest();
+ } catch (Exception e) {
+ e.printStackTrace();
+ new JCommander(cpuThreadTest).usage();
+ }
+
+
+ }
+}
=======================================
--- /dev/null
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTestRunner.java
Fri Feb 17 19:01:19 2012
@@ -0,0 +1,41 @@
+package com.custardsource.parfait.benchmark;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadMXBean;
+
+class CPUThreadTestRunner implements Runnable {
+ private final int iterations;
+ private final boolean useThreadIdLookup;
+ private final boolean cpuTracingEnabled;
+ private BlockedMetricCollector blockedMetricCollector;
+
+ public CPUThreadTestRunner(int iterations, boolean cpuTracingEnabled,
boolean useThreadIdLookup) {
+ this.iterations = iterations;
+ this.cpuTracingEnabled = cpuTracingEnabled;
+ this.useThreadIdLookup = useThreadIdLookup;
+ }
+
+ //Commenting out different parts of the code produce different
results. This will highlight the ThreadMXBean issues.
+ //Also, while this program is running, start a shell script(a basic
empty infinite for loop). The CPU usage will be close to what
+ //we see in production.
+ @Override
+ public void run() {
+ this.blockedMetricCollector = new BlockedMetricCollector();
+
+ ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
+ threadBean.setThreadContentionMonitoringEnabled(cpuTracingEnabled);
+
+ for (int i = 0; i < iterations; i++) {
+ if (useThreadIdLookup) {
+
ManagementFactory.getThreadMXBean().getThreadCpuTime(Thread.currentThread().getId());
+ } else {
+
ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
+ }
+ }
+ blockedMetricCollector.computeFinalValues();
+ }
+
+ public BlockedMetricCollector getBlockedMetricCollector() {
+ return blockedMetricCollector;
+ }
+}

==============================================================================
Revision: bacb5f78c1c7
Author: psmith <psm...@aconex.com>
Date: Sat Feb 18 18:06:21 2012
Log: Report iterations/second.
http://code.google.com/p/parfait/source/detail?r=bacb5f78c1c7

Modified:

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java

=======================================
---
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java
Fri Feb 17 19:01:19 2012
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java
Sat Feb 18 18:06:21 2012
@@ -3,7 +3,9 @@
import static
com.custardsource.parfait.benchmark.BlockedMetricHelper.computeTotalBlockedCount;
import static
com.custardsource.parfait.benchmark.BlockedMetricHelper.computeTotalBlockedTime;
import static com.google.common.collect.Lists.newArrayList;
-
+import static java.lang.System.currentTimeMillis;
+
+import java.text.NumberFormat;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -42,6 +44,8 @@
ExecutorService executorService =
Executors.newFixedThreadPool(numThreads);
List<CPUThreadTestRunner> executions = newArrayList();

+ long begin = currentTimeMillis();
+
for (int i = 0; i < numThreads; i++) {
CPUThreadTestRunner cpuThreadTestRunner = new
CPUThreadTestRunner(iterations, cpuTracingEnabled, useThreadIdLookup);
executorService.execute(cpuThreadTestRunner);
@@ -49,14 +53,22 @@
}

awaitExecutionCompletion(executorService);
- report(executions, cpuTracingEnabled, useThreadIdLookup);
+
+ long end = currentTimeMillis();
+ long timeTakenms = end - begin;
+
+ report(executions,timeTakenms, iterations, cpuTracingEnabled,
useThreadIdLookup);
}

- private void report(List<CPUThreadTestRunner> cpuThreadTestRunners,
boolean cpuTracingEnabled, boolean useThreadIdLookup) {
+ private void report(List<CPUThreadTestRunner> cpuThreadTestRunners,
double timeTakenms, int iterations, boolean cpuTracingEnabled, boolean
useThreadIdLookup) {
long totalBlockedCount =
computeTotalBlockedCount(transformToListOfBlockedMetricCollectors(cpuThreadTestRunners));
long totalBlockedTime =
computeTotalBlockedTime(transformToListOfBlockedMetricCollectors(cpuThreadTestRunners));

-
System.out.printf("cpuTracingEnabled: %s\tuseThreadIdLookup: %s\tblockedCount: %d\tblockedTime: %d\n",
leftPadBoolean(cpuTracingEnabled), leftPadBoolean(useThreadIdLookup),
totalBlockedCount, totalBlockedTime);
+ double iterationsPerSecond = iterations/(timeTakenms/1000);
+ NumberFormat numberInstance = NumberFormat.getNumberInstance();
+ String iterationsPerSecondString =
numberInstance.format(iterationsPerSecond);
+
+
System.out.printf("cpuTracingEnabled: %s\tuseThreadIdLookup: %s\titerations/sec: %s\tblockedCount: %d\tblockedTime: %d\n",
leftPadBoolean(cpuTracingEnabled), leftPadBoolean(useThreadIdLookup),
iterationsPerSecondString, totalBlockedCount, totalBlockedTime);
}

private String leftPadBoolean(boolean theBoolean) {

==============================================================================
Revision: 169f53d55b86
Author: psmith <psm...@aconex.com>
Date: Sat Feb 18 18:23:53 2012
Log: Use enum based way of getting the CPU information to show how
slow the ThreadInfo way is.
http://code.google.com/p/parfait/source/detail?r=169f53d55b86

Modified:

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTestRunner.java

=======================================
---
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java
Sat Feb 18 18:06:21 2012
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java
Sat Feb 18 18:23:53 2012
@@ -33,21 +33,23 @@

private void doTest() {
setUp();
- runBenchmark(true, false);
- runBenchmark(true, true);
- runBenchmark(false, false);
- runBenchmark(false, true);
+ runBenchmark(true,
CPUThreadTestRunner.CpuLookupMethod.USE_CURRENT_THREAD_CPU_TIME);
+ runBenchmark(true,
CPUThreadTestRunner.CpuLookupMethod.USE_CURRENT_THREAD_ID);
+ runBenchmark(true,
CPUThreadTestRunner.CpuLookupMethod.USE_THREAD_INFO);
+ runBenchmark(false,
CPUThreadTestRunner.CpuLookupMethod.USE_CURRENT_THREAD_CPU_TIME);
+ runBenchmark(false,
CPUThreadTestRunner.CpuLookupMethod.USE_CURRENT_THREAD_ID);
+ runBenchmark(false,
CPUThreadTestRunner.CpuLookupMethod.USE_THREAD_INFO);

}

- private void runBenchmark(boolean cpuTracingEnabled, boolean
useThreadIdLookup) {
+ private void runBenchmark(boolean cpuTracingEnabled,
CPUThreadTestRunner.CpuLookupMethod cpuLookupMethod) {
ExecutorService executorService =
Executors.newFixedThreadPool(numThreads);
List<CPUThreadTestRunner> executions = newArrayList();

long begin = currentTimeMillis();

for (int i = 0; i < numThreads; i++) {
- CPUThreadTestRunner cpuThreadTestRunner = new
CPUThreadTestRunner(iterations, cpuTracingEnabled, useThreadIdLookup);
+ CPUThreadTestRunner cpuThreadTestRunner = new
CPUThreadTestRunner(iterations, cpuTracingEnabled, cpuLookupMethod);
executorService.execute(cpuThreadTestRunner);
executions.add(cpuThreadTestRunner);
}
@@ -57,10 +59,10 @@
long end = currentTimeMillis();
long timeTakenms = end - begin;

- report(executions,timeTakenms, iterations, cpuTracingEnabled,
useThreadIdLookup);
+ report(executions,timeTakenms, iterations, cpuTracingEnabled,
cpuLookupMethod);
}

- private void report(List<CPUThreadTestRunner> cpuThreadTestRunners,
double timeTakenms, int iterations, boolean cpuTracingEnabled, boolean
useThreadIdLookup) {
+ private void report(List<CPUThreadTestRunner> cpuThreadTestRunners,
double timeTakenms, int iterations, boolean cpuTracingEnabled,
CPUThreadTestRunner.CpuLookupMethod cpuLookupMethod) {
long totalBlockedCount =
computeTotalBlockedCount(transformToListOfBlockedMetricCollectors(cpuThreadTestRunners));
long totalBlockedTime =
computeTotalBlockedTime(transformToListOfBlockedMetricCollectors(cpuThreadTestRunners));

@@ -68,7 +70,11 @@
NumberFormat numberInstance = NumberFormat.getNumberInstance();
String iterationsPerSecondString =
numberInstance.format(iterationsPerSecond);

-
System.out.printf("cpuTracingEnabled: %s\tuseThreadIdLookup: %s\titerations/sec: %s\tblockedCount: %d\tblockedTime: %d\n",
leftPadBoolean(cpuTracingEnabled), leftPadBoolean(useThreadIdLookup),
iterationsPerSecondString, totalBlockedCount, totalBlockedTime);
+
System.out.printf("cpuTracingEnabled: %s\tcpuLookupMethod: %s\titerations/sec: %s\tblockedCount: %d\tblockedTime: %d\n",
leftPadBoolean(cpuTracingEnabled), formatCpuLookupMethod(cpuLookupMethod),
iterationsPerSecondString, totalBlockedCount, totalBlockedTime);
+ }
+
+ private String
formatCpuLookupMethod(CPUThreadTestRunner.CpuLookupMethod cpuLookupMethod) {
+ return StringUtils.rightPad(cpuLookupMethod.name(),
CPUThreadTestRunner.CpuLookupMethod.USE_CURRENT_THREAD_CPU_TIME.name().length());
}

private String leftPadBoolean(boolean theBoolean) {
=======================================
---
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTestRunner.java
Fri Feb 17 19:01:19 2012
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTestRunner.java
Sat Feb 18 18:23:53 2012
@@ -1,23 +1,25 @@
package com.custardsource.parfait.benchmark;

import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;

class CPUThreadTestRunner implements Runnable {
private final int iterations;
- private final boolean useThreadIdLookup;
private final boolean cpuTracingEnabled;
+ private final CpuLookupMethod cpuLookupMethod;
private BlockedMetricCollector blockedMetricCollector;

- public CPUThreadTestRunner(int iterations, boolean cpuTracingEnabled,
boolean useThreadIdLookup) {
+ static enum CpuLookupMethod {
+ USE_CURRENT_THREAD_CPU_TIME, USE_CURRENT_THREAD_ID, USE_THREAD_INFO
+ }
+
+ public CPUThreadTestRunner(int iterations, boolean cpuTracingEnabled,
CpuLookupMethod cpuLookupMethod) {
this.iterations = iterations;
this.cpuTracingEnabled = cpuTracingEnabled;
- this.useThreadIdLookup = useThreadIdLookup;
+ this.cpuLookupMethod = cpuLookupMethod;
}

- //Commenting out different parts of the code produce different
results. This will highlight the ThreadMXBean issues.
- //Also, while this program is running, start a shell script(a basic
empty infinite for loop). The CPU usage will be close to what
- //we see in production.
@Override
public void run() {
this.blockedMetricCollector = new BlockedMetricCollector();
@@ -26,10 +28,20 @@
threadBean.setThreadContentionMonitoringEnabled(cpuTracingEnabled);

for (int i = 0; i < iterations; i++) {
- if (useThreadIdLookup) {
-
ManagementFactory.getThreadMXBean().getThreadCpuTime(Thread.currentThread().getId());
- } else {
-
ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
+ switch (cpuLookupMethod) {
+ case USE_CURRENT_THREAD_ID:
+
ManagementFactory.getThreadMXBean().getThreadCpuTime(Thread.currentThread().getId());
+ break;
+ case USE_CURRENT_THREAD_CPU_TIME:
+
ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
+ break;
+ case USE_THREAD_INFO:
+ ThreadInfo threadInfo =
ManagementFactory.getThreadMXBean().getThreadInfo(Thread.currentThread().getId());
+
ManagementFactory.getThreadMXBean().getThreadCpuTime(threadInfo.getThreadId());
+ break;
+ default:
+ throw new IllegalStateException("Non-valid
CpuLookupMethod: " + cpuLookupMethod);
+
}
}
blockedMetricCollector.computeFinalValues();

==============================================================================
Revision: 354b855db5dc
Author: psmith <psm...@aconex.com>
Date: Sat Feb 18 18:29:36 2012
Log: Actually enabled/disable the _correct_ cpu monitoring enabler
property. ahem.
http://code.google.com/p/parfait/source/detail?r=354b855db5dc

Modified:

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTestRunner.java

=======================================
---
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java
Sat Feb 18 18:23:53 2012
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java
Sat Feb 18 18:29:36 2012
@@ -5,6 +5,8 @@
import static com.google.common.collect.Lists.newArrayList;
import static java.lang.System.currentTimeMillis;

+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadMXBean;
import java.text.NumberFormat;
import java.util.List;
import java.util.concurrent.ExecutorService;
@@ -46,10 +48,13 @@
ExecutorService executorService =
Executors.newFixedThreadPool(numThreads);
List<CPUThreadTestRunner> executions = newArrayList();

+ ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
+ threadBean.setThreadCpuTimeEnabled(cpuTracingEnabled);
+
long begin = currentTimeMillis();

for (int i = 0; i < numThreads; i++) {
- CPUThreadTestRunner cpuThreadTestRunner = new
CPUThreadTestRunner(iterations, cpuTracingEnabled, cpuLookupMethod);
+ CPUThreadTestRunner cpuThreadTestRunner = new
CPUThreadTestRunner(iterations, cpuLookupMethod);
executorService.execute(cpuThreadTestRunner);
executions.add(cpuThreadTestRunner);
}
=======================================
---
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTestRunner.java
Sat Feb 18 18:23:53 2012
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTestRunner.java
Sat Feb 18 18:29:36 2012
@@ -2,11 +2,9 @@

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
-import java.lang.management.ThreadMXBean;

class CPUThreadTestRunner implements Runnable {
private final int iterations;
- private final boolean cpuTracingEnabled;
private final CpuLookupMethod cpuLookupMethod;
private BlockedMetricCollector blockedMetricCollector;

@@ -14,9 +12,8 @@
USE_CURRENT_THREAD_CPU_TIME, USE_CURRENT_THREAD_ID, USE_THREAD_INFO
}

- public CPUThreadTestRunner(int iterations, boolean cpuTracingEnabled,
CpuLookupMethod cpuLookupMethod) {
+ public CPUThreadTestRunner(int iterations, CpuLookupMethod
cpuLookupMethod) {
this.iterations = iterations;
- this.cpuTracingEnabled = cpuTracingEnabled;
this.cpuLookupMethod = cpuLookupMethod;
}

@@ -24,9 +21,6 @@
public void run() {
this.blockedMetricCollector = new BlockedMetricCollector();

- ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
- threadBean.setThreadContentionMonitoringEnabled(cpuTracingEnabled);
-
for (int i = 0; i < iterations; i++) {
switch (cpuLookupMethod) {
case USE_CURRENT_THREAD_ID:

==============================================================================
Revision: 4de507ecafcb
Author: psmith <psm...@aconex.com>
Date: Sat Feb 18 18:34:27 2012
Log: add CpuThreadTest to runnable tests
http://code.google.com/p/parfait/source/detail?r=4de507ecafcb

Modified:
/parfait-benchmark/pom.xml

=======================================
--- /parfait-benchmark/pom.xml Fri Feb 17 18:50:42 2012
+++ /parfait-benchmark/pom.xml Sat Feb 18 18:34:27 2012
@@ -34,6 +34,10 @@

<mainClass>com.custardsource.parfait.benchmark.StandardMetricThroughPutBenchmark</mainClass>
<name>standardmetricthroughput</name>
</program>
+ <program>
+
<mainClass>com.custardsource.parfait.benchmark.CPUThreadTest</mainClass>
+ <name>cputhreadtest</name>
+ </program>
</programs>
</configuration>
</plugin>

==============================================================================
Revision: 390171bb7034
Author: psmith <psm...@aconex.com>
Date: Sat Feb 18 18:34:43 2012
Log: minor refactor
http://code.google.com/p/parfait/source/detail?r=390171bb7034

Modified:

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTestRunner.java

=======================================
---
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java
Sat Feb 18 18:29:36 2012
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java
Sat Feb 18 18:34:43 2012
@@ -21,11 +21,11 @@

public class CPUThreadTest {

- private static final int MAX_THREAD_COUNT = 50;
+ private static final int DEFAULT_THREAD_COUNT = 50;
private static final int DEFAULT_ITERATIONS = 100000;

@Parameter(names = {"-numThreads"}, required = false)
- private int numThreads = MAX_THREAD_COUNT;
+ private int numThreads = DEFAULT_THREAD_COUNT;

@Parameter(names = {"-iterations"}, required = false)
private int iterations = DEFAULT_ITERATIONS;
=======================================
---
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTestRunner.java
Sat Feb 18 18:29:36 2012
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTestRunner.java
Sat Feb 18 18:34:43 2012
@@ -2,6 +2,7 @@

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
+import java.lang.management.ThreadMXBean;

class CPUThreadTestRunner implements Runnable {
private final int iterations;
@@ -22,24 +23,29 @@
this.blockedMetricCollector = new BlockedMetricCollector();

for (int i = 0; i < iterations; i++) {
- switch (cpuLookupMethod) {
- case USE_CURRENT_THREAD_ID:
-
ManagementFactory.getThreadMXBean().getThreadCpuTime(Thread.currentThread().getId());
- break;
- case USE_CURRENT_THREAD_CPU_TIME:
-
ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
- break;
- case USE_THREAD_INFO:
- ThreadInfo threadInfo =
ManagementFactory.getThreadMXBean().getThreadInfo(Thread.currentThread().getId());
-
ManagementFactory.getThreadMXBean().getThreadCpuTime(threadInfo.getThreadId());
- break;
- default:
- throw new IllegalStateException("Non-valid
CpuLookupMethod: " + cpuLookupMethod);
-
- }
+ ThreadMXBean threadMXBean =
ManagementFactory.getThreadMXBean();
+ accessThreadCpuInformation(threadMXBean);
}
blockedMetricCollector.computeFinalValues();
}
+
+ private void accessThreadCpuInformation(ThreadMXBean threadMXBean) {
+ switch (cpuLookupMethod) {
+ case USE_CURRENT_THREAD_ID:
+
threadMXBean.getThreadCpuTime(Thread.currentThread().getId());
+ break;
+ case USE_CURRENT_THREAD_CPU_TIME:
+ threadMXBean.getCurrentThreadCpuTime();
+ break;
+ case USE_THREAD_INFO:
+ ThreadInfo threadInfo =
threadMXBean.getThreadInfo(Thread.currentThread().getId());
+ threadMXBean.getThreadCpuTime(threadInfo.getThreadId());
+ break;
+ default:
+ throw new IllegalStateException("Non-valid
CpuLookupMethod: " + cpuLookupMethod);
+
+ }
+ }

public BlockedMetricCollector getBlockedMetricCollector() {
return blockedMetricCollector;

==============================================================================
Revision: ccad734dc145
Author: psmith <psm...@aconex.com>
Date: Sun Feb 19 20:10:40 2012
Log: Refactor the environment header reporting to be shared between
the 2 benchmarks, and make sure CPU Contention monitoring is enabled.
http://code.google.com/p/parfait/source/detail?r=ccad734dc145

Added:

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/ReportHelper.java
Modified:

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java

/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/StandardMetricThroughPutBenchmark.java

=======================================
--- /dev/null
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/ReportHelper.java
Sun Feb 19 20:10:40 2012
@@ -0,0 +1,23 @@
+package com.custardsource.parfait.benchmark;
+
+import static java.net.InetAddress.getLocalHost;
+
+import java.net.UnknownHostException;
+
+import org.apache.commons.lang.SystemUtils;
+
+public class ReportHelper {
+ static void environmentReportHeader() {
+ String hostName = getCurrentHostname();
+ System.out.printf("Host: %s\tJava: %s\n", hostName,
SystemUtils.JAVA_VERSION);
+ }
+
+ private static String getCurrentHostname() {
+ String hostName = "UNKNOWN";
+ try {
+ hostName = getLocalHost().getCanonicalHostName();
+ } catch (UnknownHostException ignored) {
+ }
+ return hostName;
+ }
+}
=======================================
---
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java
Sat Feb 18 18:34:43 2012
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/CPUThreadTest.java
Sun Feb 19 20:10:40 2012
@@ -51,6 +51,8 @@
ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
threadBean.setThreadCpuTimeEnabled(cpuTracingEnabled);

+ threadBean.setThreadContentionMonitoringEnabled(true);
+
long begin = currentTimeMillis();

for (int i = 0; i < numThreads; i++) {
@@ -105,6 +107,7 @@
}

private void setUp() {
+ ReportHelper.environmentReportHeader();
System.out.printf("iterations: %d\n", iterations);
System.out.printf("numThreads: %d\n", numThreads);
}
=======================================
---
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/StandardMetricThroughPutBenchmark.java
Fri Feb 17 18:52:56 2012
+++
/parfait-benchmark/src/main/java/com/custardsource/parfait/benchmark/StandardMetricThroughPutBenchmark.java
Sun Feb 19 20:10:40 2012
@@ -6,7 +6,6 @@

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;
-import java.net.Inet4Address;
import java.net.UnknownHostException;
import java.text.NumberFormat;
import java.util.List;
@@ -26,7 +25,6 @@
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.SystemUtils;

public class StandardMetricThroughPutBenchmark {

@@ -139,7 +137,7 @@
int numCounters = 1000;
int iterations = 10000;

- System.out.printf("Host: %s\tJava: %s\n",
Inet4Address.getLocalHost().getCanonicalHostName(),
SystemUtils.JAVA_VERSION);
+ ReportHelper.environmentReportHeader();
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
System.out.printf("Thread Contention Supported: %s, Enabled by
default: %s\n", threadMXBean.isThreadContentionMonitoringSupported(),
threadMXBean.isThreadContentionMonitoringEnabled());
System.out.printf("numThreads: %d, numCounters=%d,
iterations=%d\n", numThreads, numCounters, iterations);

Reply all
Reply to author
Forward
0 new messages