Warum dieser Java-code nicht nutzen, alle CPU-Kerne?

Den beigefügten einfache Java-code laden sollten alle verfügbaren cpu-Kern ab, wenn es mit den richtigen Parametern. So zum Beispiel, starten Sie es mit

java VMTest 8 int 0

start 8 threads, die nichts anderes tun, als die Schleifen und das hinzufügen von 2 auf eine ganze Zahl. Etwas, das läuft in Registern und auch nicht reserviert neuen Speicher.

Das problem, das wir heute gegenüberstehen, ist, dass wir nicht bekommen, ein 24-core-Maschine geladen (AMD 2 sockets, 12 Kerne), die beim ausführen dieser einfachen Programm (mit 24 threads natürlich). Ähnliche Dinge passieren, mit 2 Programme zu je 12 Fäden oder kleinere Maschinen.

So unser Verdacht ist, dass die JVM (Sun JDK 6u20 auf Linux x64) nicht gut skalieren.

Hat sonst noch jemand ähnliches oder hat die Fähigkeit zu laufen und zu berichten, ob oder nicht es läuft auch gut auf seine/Ihre Maschine (>= 8 Kerne nur bitte)? Ideen?

Habe ich versucht, die auf Amazon EC2 mit 8 cores auch, aber die virtuelle Maschine scheint zu laufen unterscheidet sich von einem realen Feld, so dass das laden verhält sich Total seltsam.

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);
    }
}

InformationsquelleAutor der Frage ReneS | 2010-05-19

Schreibe einen Kommentar