Прилагаемый простой код Java должен загружать все доступное ядро процессора при запуске с правильными параметрами. Так, например, вы начинаете это с
Java VMTest 8 int 0
и он запустит 8 потоков, которые не делают ничего, кроме цикла и добавления 2 к целому числу. То, что работает в регистрах и даже не выделяет новую память.
Проблема, с которой мы сталкиваемся сейчас, заключается в том, что мы не загружаем 24-ядерную машину (2 сокета AMD с 12 ядрами в каждой) при запуске этой простой программы (конечно, с 24 потоками). Подобные вещи случаются с 2 программами каждые 12 потоков или меньших машин.
Итак, мы подозреваем, что JVM (Sun JDK 6u20 в Linux x64) плохо масштабируется.
Кто-нибудь видел подобные вещи или имеет возможность запустить его и сообщить, хорошо ли он работает на его / ее машине (> = только 8 ядер, пожалуйста)? Идеи?
Я пробовал это на Amazon EC2 с 8 ядрами, но виртуальная машина, кажется, работает не так, как реальная коробка, поэтому загрузка ведёт себя совершенно странно.
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);
}
}