The attached simple Java code should load all available processor cores at startup with the correct parameters. For example, you start with
java VMTest 8 int 0
and it will start 8 threads that will do nothing more than a loop and add 2 to the whole. Something that works in registers and doesn't even allocate new memory.
The problem we are facing right now is that we do not get a bootable 24-core machine (AMD 2 connectors with 12 cores) when starting this simple program (with 24 threads, of course). Similar things happen with 2 programs of 12 threads or fewer machines.
Therefore, our suspicion that the JVM (Sun JDK 6u20 on Linux x64) does not scale well.
Has anyone seen similar things or have the ability to run it and tell if it works well on his machine (> = 8 cores only, please)? Ideas?
I tried this on Amazon EC2 with 8 cores, but the virtual machine seems to be different from the real one, so the loading behaves quite strange.
package com.test; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; public class VMTest { public class IntTask implements Runnable { @Override public void run() { int i = 0; while (true) { i = i + 2; } } } public class StringTask implements Runnable { @Override public void run() { int i = 0; String s; while (true) { i++; s = "s" + Integer.valueOf(i); } } } public class ArrayTask implements Runnable { private final int size; public ArrayTask(int size) { this.size = size; } @Override public void run() { int i = 0; String[] s; while (true) { i++; s = new String[size]; } } } public void doIt(String[] args) throws InterruptedException { final String command = args[1].trim(); ExecutorService executor = Executors.newFixedThreadPool(Integer.valueOf(args[0])); for (int i = 0; i < Integer.valueOf(args[0]); i++) { Runnable runnable = null; if (command.equalsIgnoreCase("int")) { runnable = new IntTask(); } else if (command.equalsIgnoreCase("string")) { runnable = new StringTask(); } Future<?> submit = executor.submit(runnable); } executor.awaitTermination(1, TimeUnit.HOURS); } public static void main(String[] args) throws InterruptedException { if (args.length < 3) { System.err.println("Usage: VMTest threadCount taskDef size"); System.err.println("threadCount: Number 1..n"); System.err.println("taskDef: int string array"); System.err.println("size: size of memory allocation for array, "); System.exit(-1); } new VMTest().doIt(args); } }
java cpu multicore scalability scaling
ReneS May 19 '10 at 16:03 2010-05-19 16:03
source share